¿Cómo forzar a Google closure compiler a mantener "use strict"; en el código js compilado?


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

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

Y compilar el código usando el Compilador de Cierre de Google, la directiva "use strict"; no lo hará en el archivo compilado.

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

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

Author: ivo, 2010-12-16

5 answers

Esta no es la mejor respuesta, pero por lo que puedo decir esto es un problema conocido o "característica" (dependiendo de su perspectiva) del compilador de cierre. Aquí hay una explicación parcial de algunos de los problemas involucrados. Un par mencionado 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 inserción de funciones del compilador rompería el alcance de las declaraciones de modo estricto a nivel de función. Desde el comportamiento de " uso estricto" las declaraciones serían impredecibles / incorrectas en el código compilado (potencialmente rompiendo programas cuando el modo estricto se aplica incorrectamente al código no estricto), el compilador las elimina como cualquier otro código muerto.

Parece que ha habido una idea para implementar completamente ECMAScript 5 strict mode checks en el compilador (en cuyo caso no habría inconveniente en eliminarlo del código compilado), pero aún no está ahí.

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

 9
Author: joelhardi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-03 05:20:03

Actualización: el modo estricto ahora está soportado en 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

 50
Author: Ben Challenor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-16 16:35:30

Peligroso. El compilador de cierre en modo avanzado es no compatible con modo estricto, lo que significa que el compilador reescribirá el código basado en las reglas ECMAScript 262 rev 3. Algunas reglas se cambian para el modo estricto (por ejemplo, enlace "esto" 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 suposiciones de lenguaje erróneas.

La respuesta corta (y el oficial del Compilador de Cierre respuesta) es: no lo hagas.

Si realmente solo desea palear una cadena" use strict " allí, intente:

eval('"use strict";');
 7
Author: Stephen Chung,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-10 03:10:01

Se utiliza la envoltura de salida del compilador para crear la envoltura del módulo e incluir la directiva "use strict" allí.

 0
Author: John,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-02-09 00:16:26

El modo estricto es útil para la depuración, y no mucho más hasta que ve la adopción en todos los navegadores principales. Por el Compilador de cierre de tiempo elimina la etiqueta es 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.

 -1
Author: aaaaaaaaaaaa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-16 18:25:37