混淆RequireJS模块名称

时间:2015-03-17 17:17:18

标签: node.js requirejs obfuscation

我的项目布局是:

-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插件,但它无法正常工作,我不确定该插件是否符合我的要求。

1 个答案:

答案 0 :(得分:-1)

Edit1:我鼓励使用AMDclean,可能没有理由在优化版本上保持足迹和生成。如果你想保留它,以下方法是我做的解决方法: 使用onBuildWriteonBuildRead作为文档说明: 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"]);可能导致代码不一致,替换为正则表达式组,我对正则表达式没有经验,所以它可以改进。