我的项目布局是:
-bin\
-out.closeure.js // (compiled from out.js using the closure compiler)
-out.js // this is the requirejs output file, no minification done)
-src\
-lib\
-library.js
-main.js
-somefile.js
现在当我使用RequireJS将我的项目组合到一个文件时,是否有办法破坏模块的名称?例如,在main.js而不是:
require(['somefile'], function(SomeFile){
//blah
});
我有
require(['a6fa7'], function(SomeFile){
//blah
});
由于我使用闭包编译器来模糊所有内容,唯一没有被破坏的是模块名称,我也希望破坏它。
我查看了https://github.com/stevensacks/grunt-requirejs-obfuscate插件,但它无法正常工作,我不确定该插件是否符合我的要求。
答案 0 :(得分:-1)
Edit1:我鼓励使用AMDclean,可能没有理由在优化版本上保持足迹和生成。如果你想保留它,以下方法是我做的解决方法:
使用onBuildWrite
和onBuildRead
作为文档说明:
onBuildWrite
每次写入优化的模块包时都会调用的函数。这允许在序列化之前转换内容。
"replaceModuleNames": [],
//executed on every file read
onBuildRead: function(moduleName, path, contents){
this["replaceModuleNames"].push({
"name": moduleName,
"with": makeid()
});
//Always return a value.
return contents;
},
onBuildWrite: function (moduleName, path, contents) {
console.log("moduleName: " + moduleName + " ,path: " + path + " ,contents: ... ");
var text = contents;
RegExp.escape = function(text) {
return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
};
this["replaceModuleNames"].forEach(function(element){
var regE = new RegExp('(?:define\\(|require\\().*(?:"|\')('+RegExp.escape(element["name"])+')(?:"|\')');
text = text.replace(regE, function(a, b){
return a.replace(b, element["with"]);
});
console.log("moduleName: "+moduleName+ " replaceWith: " + element["with"] + " result: " + text);
});
//Always return a value.
return text;
}
将它放在build.js上,你必须实现makeid
方法,
我测试了它但它可能会失败,所以不要依赖它进行生产
Edit2:text.replace(element["name"], element["with"]);
可能导致代码不一致,替换为正则表达式组,我对正则表达式没有经验,所以它可以改进。