Как заставить гугл-компилятор закрытия держать «строгое использование»;в скомпилированном коде JS? - PullRequest
30 голосов
/ 16 декабря 2010

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

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

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

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

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

Ответы [ 5 ]

51 голосов
/ 16 июля 2011

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

Просто используйте --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

9 голосов
/ 03 января 2011

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

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

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

7 голосов
/ 10 марта 2011

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

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

Если вы действительно просто хотите добавить туда строку «используйте строгие правила», попробуйте:

eval('"use strict";');
0 голосов
/ 09 февраля 2011

Вы используете выходную оболочку компилятора для создания оболочки модуля и включаете в нее директиву «использовать строгий».

0 голосов
/ 16 декабря 2010

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

...