Как заставить компилятор закрытия Google сохранять строгий режим использования; в скомпилированном js-коде?

Если вы используете шаблон модуля и у вас что-то вроде этого:

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

и скомпилируйте код с помощью Google Closure Compiler, директива "use strict"; не попадет в скомпилированный файл.

Так как же предотвратить удаление директивы ES5 / strict компилятором Closure?

(Обратите внимание, что я не хочу использовать другой режим принудительного применения ES5 / strict mode, то есть просто добавить «use strict»; в первую строку скомпилированного файла. Я хочу использовать шаблон модуля, как описано здесь.)


person ivo    schedule 16.12.2010    source источник


Ответы (5)


Это не лучший ответ, но, насколько я могу судить, это известная проблема или «особенность» (в зависимости от вашей точки зрения) компилятора закрытия. Вот частичное объяснение некоторых связанных с этим проблем. Упомянутая пара заключается в том, что при объединении нескольких файлов невозможно сохранить объявления строгого режима на уровне файлов, а функция встраивания функций компилятора нарушит область действия объявлений строгого режима на уровне функций. Поскольку поведение объявлений "use strict" в скомпилированном коде будет непредсказуемым / неправильным (потенциально нарушая программы, когда строгий режим неправильно применяется к нестрогому коду), компилятор удаляет их, как любой другой мертвый код.

Похоже, была идея полностью реализовать проверку строгого режима ECMAScript 5 в компиляторе (в этом случае не было бы недостатков в удалении ее из скомпилированного кода), но ее еще нет.

Компиляция в режиме SIMPLE_OPTIMIZATIONS вместо ADVANCED_OPTIMIZATIONS отключит удаление мертвого кода, но я подозреваю, что вы это уже знаете.

person joelhardi    schedule 03.01.2011
comment
Обновление: ответ Бена Челленора ниже кажется новым правильным ответом. - person Robert Martin; 24.09.2012

Обновление: в компиляторе теперь поддерживается строгий режим.

Просто используйте --language_in=ECMASCRIPT5_STRICT.

Использованная литература:

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

person Ben Challenor    schedule 16.07.2011
comment
Есть ли для этого аннотация? - person ryanve; 30.08.2012
comment
Из первоначального исследования выяснилось, что компилятор закрытия не удаляет ненужное использование строго; операторы из объединенных файлов в этом режиме ... Стоит знать - person The Trav; 07.06.2013
comment
Также кажется, что он добавит 'use strict'; вверху, если его там еще нет. Аккуратный! - person Kyle Falconer; 18.04.2014
comment
В моем случае только добавлением --language_out=ECMASCRIPT5_STRICT финальная минификация включала 'use strict'; - person IvanRF; 20.04.2017

Опасно. Closure Compiler в расширенном режиме не совместим со строгим режимом, что означает, что компилятор перезапишет код на основе правил ECMAScript 262 rev 3. Некоторые правила изменены для строгого режима (например, привязка this в анонимных функциях, разрешение области видимости и т. Д.), Что приведет к поломке кода, если компилятор Closure перезаписывает код неправильно из-за неправильных языковых предположений.

Краткий ответ (и официальный ответ компилятора Closure): не делайте этого.

Если вы действительно хотите втиснуть туда строчку "use strict", попробуйте:

eval('"use strict";');
person Stephen Chung    schedule 10.03.2011

Вы можете использовать оболочку вывода компилятора, чтобы создать оболочку модуля и включить туда директиву «use strict».

person John    schedule 09.02.2011

Строгий режим полезен для отладки и не более того, пока он не будет принят во всех основных браузерах. К тому времени, когда компилятор Closure удалит тег, эра полезности все равно закончится. Я уверен, что они обновят компилятор, чтобы разрешить сохранение тега задолго до того, как эта функция действительно станет полезной.

person aaaaaaaaaaaa    schedule 16.12.2010