使用uglifyjs对嵌套的类和变量进行管理

wha*_*dar 7 javascript minify uglifyjs uglifyjs2

我使用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;

})();
Run Code Online (Sandbox Code Playgroud)

这被缩小为不那么小的版本

(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})();
Run Code Online (Sandbox Code Playgroud)

我理解uglify可能认为root var是一个必须按原样保存并且不能更改的数据结构.有没有办法让uglify破坏根命名空间中的嵌套名称?

Jan*_*ker 8

当您最小化Javascript时,您只能更改变量的名称,api,核心和名称不是变量,而是对象的属性.如果最小化器改变了这些,您可能会得到意想不到的结果.如果在你的代码中你会打电话怎么办?

root["api"].perform = function()...
Run Code Online (Sandbox Code Playgroud)

甚至是类似的东西

function doIt(section, method, argument) {
    root[section][method](argument);
}
doIt('api','perform', 101);
Run Code Online (Sandbox Code Playgroud)

所有完全合法的JS,但最小化器永远无法弄清楚发生了什么.

  • 是的,我理解你的论点.还有什么我可以做的吗? (2认同)

Fer*_*eti 6

我一直在尝试使用--mangle-propsUglifyJS2并且可以告诉你:' 它弄得一团糟 '.

正如有人指出的那样:' 开发人员应该决定要破坏哪些属性,而不是uglifyjs '

我正在使用此选项来解决问题:

--mangle-props
--mangle-regexp="/_$/"
Run Code Online (Sandbox Code Playgroud)

正则表达式在末尾匹配任何带有下划线的属性.

您要求在根命名空间中修改嵌套名称.所以,你的代码:

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

  root.names.SOME_LONG_NAMED_CONST_='Angel';

  root.core.Person_ = function(name) { this.name = name };

  root.api.perform_ = function(param_for_api) {  }

  window.lib_name.perform = root.api.perform;
})();
Run Code Online (Sandbox Code Playgroud)

会导致这个:

(function() {
    var n = {
        api: {},
        core: {},
        names: {}
    };
    n.names.a = "Angel";
    n.core.b = function(n) {
        this.name = n;
    };
    n.api.c = function(n) {};
    window.lib_name.perform = n.api.c;
})();
Run Code Online (Sandbox Code Playgroud)

命令: uglifyjs --beautify --mangle --mangle-props --mangle-regex="/_$/" -- file.js

如果你想破坏第一级根命名空间,(api, core, names)只需在它们上面加一个下划线(api_, core_, names_),你就可以控制;)

只是一个侧面说明:当你重整性质由其他JS文件可用,你应该使用相同的命令一起裂伤的所有文件,所以同样的标识将被用于在所有的文件.

  • 我明白了,但我是用尾随下划线完成的,因为它更容易输入(代码完成效果更好)。 (2认同)