8

UglifyJS を使用して、連結された一連のファイルを縮小します。これは正常に機能しますが、十分ではありません。ビルドされた lib は名前空間を使用するため、クラス、関数、および定数はルート名前空間変数に格納されます。

(function() {
  var root = { api:{}, core:{}, names:{} };

  /* util.js file */
  root.names.SOME_LONG_NAMED_CONST='Angel';

  /* Person.js file */
  root.core.Person = function(name) { this.name = name };

  /* API.js with the functions we want to expose */
  root.api.perform = function(param_for_api) { /* do something */ }

  window.lib_name.perform = root.api.perform;

})();

最小ではないバージョンに縮小されています

(function(){var a={api:{},core:{},names:{}};a.names.SOME_LONG_NAMED_CONST="Angel",a.core.Person=function(a){this.name=a},a.api.perform=function(){},window.lib_name.perform=a.api.perform})();

uglify はおそらく、ルート var はそのままにしておく必要があり、変更できないデータ構造であると考えていることを理解しています。UglifyJS がルート名前空間でネストされた名前をマングルできるようにする方法はありますか?

4

5 に答える 5

8

Javascript を最小化すると、変数の名前のみを変更できます。API、コア、および名前は変数ではなく、オブジェクトのプロパティです。これらが最小化によって変更された場合、予期しない結果が生じる可能性があります。あなたのコードであなたが呼び出すとどうなるでしょうか

root["api"].perform = function()...

または次のようなものさえ

function doIt(section, method, argument) {
    root[section][method](argument);
}
doIt('api','perform', 101);

すべて完全に正当な JS ですが、最小化ツールは何が起こっているのかを理解できませんでした。

于 2013-05-02T09:53:16.133 に答える
1

The latest release of uglify (today) has object property mangling, see v2.4.18. It also supports reserved files for excluding both object properties and variables that you don't want mangled. Check it out.

Use the --mangle-props option and --reserved-file filename1.json filename2.json etc....

于 2015-03-29T13:07:34.320 に答える