javascript google-closure google-closure-compiler ecmascript-5

javascript - Cómo forzar el compilador del cierre de Google para mantener el "uso estricto"; en el código js compilado?



google-closure google-closure-compiler (5)

Si estás usando el patrón del módulo y tienes algo como esto:

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

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

Entonces, ¿cómo evita que el Compilador de cierre elimine la directiva / estricta ES5?

(Tenga en cuenta que no quiero usar 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 patrón del módulo como se describe here .)



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


Esta no es la mejor respuesta, pero, por lo que puedo decir, se trata de un problema conocido o "característica" (según su perspectiva) del compilador de cierre. Aquí hay una explicación parcial de algunos de los problemas involucrados. Una pareja mencionada es que no hay manera de preservar las declaraciones de modo estricto a nivel de archivo cuando se combinan varios archivos, y la función de integración de la función del compilador rompería el alcance de las declaraciones de modo estricto a nivel de función. Debido a 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 incorrectamente al código no estricto), el compilador los elimina como cualquier otro código muerto.

Parece que hubo una idea de implementar completamente las comprobaciones de modo estricto de ECMAScript 5 en el compilador (en cuyo caso no habría ningún inconveniente en eliminarlo del código compilado), pero aún no existe.

La SIMPLE_OPTIMIZATIONS en modo SIMPLE_OPTIMIZATIONS en lugar de ADVANCED_OPTIMIZATIONS deshabilitará la eliminación del código muerto, pero sospecho que ya lo sabes.


Usted usa la envoltura de salida del compilador para crear la envoltura del módulo e incluye la directiva de "uso estricto" allí.


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

La respuesta corta (y la respuesta oficial de Closure Compiler) es: no lo hagas.

Si realmente solo quieres palear una cadena de "uso estricto" allí, prueba:

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