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

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

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

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

Итак, как вы препятствуете компилятору Closure удалить директиву ES5/strict?

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

Ответ 1

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

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

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

Ответ 3

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

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

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

eval('"use strict";');

Ответ 4

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

Ответ 5

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