How to force google closure compiler to keep "use strict"; in the compiled js code?
ecmascript-5, google-closure, google-closure-compiler, javascript
Solution
This isn't the greatest answer, but as far as I can tell this is a known issue or "feature" (depending on your perspective) of closure compiler. Here's a partial explanation of some of the problems involved. A couple mentioned are that there's no way to preserve file-level strict mode declarations when multiple files are combined, and the compiler's function inlining feature would break the scope of function-level strict mode declarations. Since the behavior of "use strict" declarations would be unpredictable/wrong in compiled code (potentially breaking programs when strict mode is misapplied to non-strict code), the compiler strips them like any other dead code.
There seems to have been an idea to fully implement ECMAScript 5 strict mode checks in the compiler (in which case there would be no downside to removing it from compiled code), but it's not there yet.
Compiling in `SIMPLE_OPTIMIZATIONS` mode instead of `ADVANCED_OPTIMIZATIONS` will disable dead code removal, but I suspect you already know that.
Problem
If you're using the module pattern and have something like this: ``` (function () { "use strict"; // this function is strict... }()); ``` and compile the code using the Google Closure Compiler, the `"use strict";` directive will not make it into the compiled file. So how do you prevent the Closure Compiler from removing the ES5/strict directive? (Note that I don't want to use the other mode of enforcing ES5/strict mode, which is to simply add the "use strict"; to the first line of the compiled file. I want to use the module pattern as described here.)