29

Si está utilizando el patrón de módulo y tener algo como esto:Cómo forzar al compilador de cierre de google a mantener "use strict"; en el código compilado js?

(function() { 
    "use strict"; 
    // this function is strict... 
}()); 

y compilar el código usando el cierre de Google compilador, la directiva "use strict"; no lo hará en el archivo compilado.

Entonces, ¿cómo se evita que el compilador de cierre elimine la directiva ES5/strict?

(Tenga en cuenta que no quiero utilizar el otro modo de aplicar ES5/modo estricto, que es simplemente agregar el "uso estricto"; a la primera línea del archivo compilado. Quiero usar el módulo patrón como se describe here.)

Respuesta

9

Esta no es la mejor respuesta, pero por lo que puedo decir, este es un problema conocido o "función" (según su perspectiva) del compilador de cierre. Aquí hay un partial explanation de algunos de los problemas involucrados. Una pareja mencionada es que no hay forma de conservar declaraciones de modo estricto a nivel de archivo cuando se combinan varios archivos, y la función de alineación de función del compilador rompería el alcance de las declaraciones de modo estricto a nivel de función. Dado que el comportamiento de las declaraciones de "uso estricto" sería impredecible/incorrecto en el código compilado (potencialmente rompiendo los programas cuando el modo estricto se aplica erróneamente a un código no estricto), el compilador los elimina como cualquier otro código inactivo.

Parece que ha habido una idea para implementar completamente ECMAScript 5 controles de modo estricto en el compilador (en cuyo caso no habría inconvenientes para eliminarlo del código compilado), pero todavía no está allí.

La compilación en el modo SIMPLE_OPTIMIZATIONS en lugar de desactivará la eliminación de código inactivo, pero sospecho que ya lo sabe.

+3

Actualización: La respuesta de Ben Challenor a continuación parece ser la nueva respuesta "correcta". –

-1

El modo estricto es útil para la depuración, y no mucho más hasta que ve la adopción en todos los principales navegadores. Para cuando Closure Compiler elimina la etiqueta, su era de utilidad ha terminado de todos modos. Estoy seguro de que actualizarán el compilador para permitir conservar la etiqueta mucho antes de que esa característica sea realmente útil.

0

Utiliza el envoltorio de salida del compilador para crear el envoltorio del módulo e incluye allí la directiva "use strict".

7

Peligroso. El compilador de cierre en modo avanzado es no compatible con modo estricto, lo que significa que el compilador reescribirá el código según las reglas ECMAScript 262 rev 3. Algunas reglas se cambian para el modo estricto (por ejemplo, "este" enlace en funciones anónimas, resolución de alcance, etc.) que causará la rotura del código si el Compilador de cierre reescribe el código incorrectamente debido a supuestos erróneos del lenguaje.

La respuesta corta (y la respuesta oficial del compilador de cierre) es: no lo hagas.

Si lo que realmente quieres para palear un "uso estricto" cadena de allí, probar:

eval('"use strict";'); 
+3

+1 por solución alternativa peligrosa. –

50

Actualización: el modo estricto es ahora compatible con el compilador.

Simplemente use --language_in=ECMASCRIPT5_STRICT.

Referencias:

http://code.google.com/p/closure-compiler/issues/detail?id=69

http://code.google.com/p/closure-compiler/source/detail?r=873

http://code.google.com/p/closure-compiler/source/detail?r=1114

+0

¿Hay alguna anotación para eso? – ryanve

+0

De la investigación inicial, parece que el compilador de cierre no eliminará el "uso estricto" innecesario; declaraciones de archivos concatenados en este modo ... Vale la pena tener en cuenta –

+0

También parece que agregará ''use strict';' en la parte superior si no está allí ya. ¡Ordenado! –

Cuestiones relacionadas