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破坏根命名空间中的嵌套名称?
当您最小化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,但最小化器永远无法弄清楚发生了什么.
我一直在尝试使用--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文件可用,你应该使用相同的命令一起裂伤的所有文件,所以同样的标识将被用于在所有的文件.