2010-11-22 56 views
7

arrays.jsp:¿Cómo minimizar/ofuscar código JavaScript en un JSP que tiene variables JSP/JSTL mezcladas en él?

//... 
var x = <c:out value="${x}"/> 
<c:if test="${empty doExternal}"> 
processExternalArrays(); 
</c:if> 
//... 

Quiero minify/ofuscar Javascript contenida en un archivo JSP grande en el que numerosas variables JSP/JSTL se mezclan en el código JavaScript, como en el fragmento anterior.

El código se basa en variables rellenas mediante la lógica del lado del servidor y luego pasa al código del lado del cliente, como se indica anteriormente.

Ya estoy minimizando mis archivos JS usando el compresor YUI, pero no sé qué hacer con el código JavaScript en mis JSP.

¿Es posible minimizar/ofuscar este código, dado que se crea dinámicamente?

+0

Usted tendría que tener algún tipo de instalación del servidor de hacer esto en la marcha; ¿existe realmente suficiente código en sus páginas para justificarlo? – Pointy

+0

No estoy seguro de lo que quiere decir sobre hacerlo sobre la marcha en un servidor. (Sí. Hay un montón de código.) –

+0

Bueno, en lugar de mantener todo ese código en sus páginas, sería mejor que extraiga todo lo posible en archivos .js separados. Lo que mantendría en las páginas sería una cantidad mínima de declaraciones de variables procesadas por JSP. Sus archivos .js separados solo accederían a ellos al encontrarlos en cada página. – Pointy

Respuesta

0

no veo otras formas de delegar totalmente el trabajo de JS puros con la ayuda de los poderes Ajaxical en combinación con un servlet que devuelve la información deseada sobre una petición Ajax (en el sabor de JSON?).

E.g. en Servlet

Map<String, Object> data = new HashMap<String, Object>(); 
data.put("doExternal", doExternal); 
data.put("x", x); 
response.setContentType("application/json"); 
response.setCharacterEncoding("UTF-8"); 
response.getWriter().write(new Gson().toJson(data)); // Gson is a Java-JSON converter. 

y en JS (con poca ayuda de jQuery ya que hace que el Ajax funciona menos detallado)

$.getJSON('servleturl', function(data) { 
    var x = data.x; 
    if (!data.doExternal) { 
     processExternalArrays(); 
    } 
}); 

De esta manera se termina con JS limpios sin el desorden específico del lado del servidor.

2

¿Has echado un vistazo a htmlcompressor? En definitiva se trata de un:

Java HTML/Compresor XML es un muy pequeño, rápido y fácil de usar la biblioteca que le resta dados HTML o XML de origen mediante la eliminación de espacios en blanco adicionales, comentarios y otros caracteres que no sean necesarios sin rompiendo el contenido estructura.

Su función principal es tan comprimir HTML y XML, sino que también viene con las etiquetas JSP que se pueden utilizar para comprimir JavaScript en línea bloques mediante el aprovechamiento de YUI Compressor. Consulte la página de códigos de Google, especialmente la sección Compressing selective content in JSP pages.

+0

El compresor YUI no puede manejar las etiquetas JSP integradas en el código Javascript. En el escenario descrito por el OP, tiene páginas HTML que contienen fragmentos Javascript en línea que a su vez contienen etiquetas JSP integradas. Cuando htmlcompressor llama a YUI para comprimir los fragmentos de Javascript, YUI no podrá manejar las etiquetas JSP incrustadas. – Grodriguez

+0

@Grodriguez True. Esto es algo que pasé por alto cuando publiqué esta respuesta. Sin embargo, pensé que el OP podría usar el taglib, así que pensé que aún vale la pena mantener esta respuesta aquí. La solución real es no generar un montón de JavaScript dinámicamente, sino generar los datos como un objeto JavaScript y pasarlo a un código JavaScript estático como menciona Juan Mendes en los comentarios OP. –

0

Asegúrese de que su salida esté codificada gzip (apache mod_deflate). Minimizar el html/js primero puede hacerlo un poco más pequeño, pero no por mucho.

0

Si no pueden, o no quieren, mueva el Javascript de su HTML, una posibilidad sería la creación de un controlador de etiqueta que envuelve el contenido de sus <script> etiquetas:

<script type="text/javascript"><js:compress> 
    ... 
</js:compress></script> 

El controlador probablemente podría extender SimpleTagSupport. Luego, deberá investigar las API de Java para compresores/minificadores, como YUI Compressor o dojo ShrinkSafe, y utilizarlas para procesar el cuerpo de la etiqueta.

Editar: Lo siento, le eché un vistazo a las otras respuestas y parece que Zack Mulgrew podría estar haciendo referencia a un taglib que ya hace exactamente lo que estoy sugiriendo ...

Edit2: Yup, JavaScriptCompressorTag. Supongo que tendré que volver a votar su respuesta; -) ...

3

Probablemente la mejor solución para usted sería usar la etiqueta Granule JSP. Puede descargarlo en http://code.google.com/p/granule/

ejemplo de código es:

<g:compress> 
    <script type="text/javascript" src="common.js"/> 
    <script type="text/javascript" src="closure/goog/base.js"/> 
    <script> 
     goog.require('goog.dom'); 
     goog.require('goog.date'); 
     goog.require('goog.ui.DatePicker'); 
    </script> 
    <script type="text/javascript"> 
     var dp = new goog.ui.DatePicker(); 
     dp.render(document.getElementById('datepicker')); 
    </script> 
</g:compress> 
... 
Cuestiones relacionadas