Javascript 丑化全局变量

Javascript 丑化全局变量,javascript,node.js,uglifyjs2,Javascript,Node.js,Uglifyjs2,我在nodejs中有一个应用程序。在其中,我定义了一些在多个文件中共享的全局变量。例如: //common.js async = requires("async"); isAuthenticated = function() { //... return false; }; //run.js require("common.js"); async.series([function () { isAuthenicated(); }], function () { console.

我在nodejs中有一个应用程序。在其中,我定义了一些在多个文件中共享的全局变量。例如:

//common.js
async = requires("async");
isAuthenticated = function() {
  //...
  return false;
};

//run.js
require("common.js");
async.series([function () {
  isAuthenicated();
}], function () {
  console.log("done");
});
我希望缩小
async
isAuthenticated
变量,但缩小到所有文件中的相同内容。它将如下所示:

//common.min.js
a = requires("async");
b = function() {
  //...
  return false;
};

//run.min.js
require("common.js");
a.series([function () {
  b();
}], function () {
  console.log("done");
});
如何在uglifyjs中实现这一点


我目前正在遍历这些文件,并在每个文件上使用命令
uglifyjs$file-m“sort,toplevel”-c>$file.min

如果您的全局文件仅限于common.js,您可以尝试

uglifyjs --define-from-module common.js $file...

并删除
require()s

在继续操作并丑化文件之前,您可能希望先对文件进行加密。是将多个代码文件组合成一个整体生物的过程,该整体生物了解代码的所有部分。这通常与丑化结合使用,原因有几个,主要是为了提高性能(如果只向客户端发送一个文件,则应用程序运行速度会快得多)

也就是说,这通常是在向客户机提供代码时执行的一种实践,不一定是后端/服务器端逻辑。理想情况下,除了您或有权访问用于部署所述服务器代码的任何服务的人员之外,没有人会看到代码的这一面。如果您主要关心的是防止反向工程,或者使您的代码不可读,我建议您使用您的代码

“这是欧米茄网站。他拥有最好的加密级别。看起来像是模糊的代码,以隐藏其真正目的。通过模糊来确保安全。”-Q Skyfall 2012

  • 不要使用globals
  • 在需要的地方使用var async=reuqire('async')
  • 在您需要的特定模块中使用
    module.exports
  • 使用类似于生成单个js的东西
  • Uglify(或使用名为的browserify转换)
例如,最简单的表单(不使用uglifyify)

请注意,如果您使用自己的代码,如
common.js
,则应该使用相对路径
var common=require(“./common”)
,来请求它

我建议您使用导出语法:

// common.js code

exports.isAuthenticated = function() {
  //...
  return false;
};
当然,使用它就像使用async.js一样:

//run.js
var common = require("./common");
var async = require("async")
async.series([function () {
  common.isAuthenicated();
}], function () {
  console.log("done");
});
假设
common.js
run.js
都位于同一目录中

相关问题:

旁注 您在问题中使用
async.series
的方式没有真正的优势。你可以:

//run.js
var common = require("./common");

common.isAuthenicated();
console.log("done");
在异步系列中,通常调用异步函数:

async.series([
    function(callback){
        // do some stuff ...
        callback(null, 'one');
    },
    function(callback){
        // do some more stuff ...
        callback(null, 'two');
    }
],
// optional callback
function(err, results){
    // results is now equal to ['one', 'two']
}); 
因此,我希望看到类似的情况:

// common.js code

exports.isAuthenticated = function(callback) {
  //...
  callback(null, false);
};
然后

//run.js
var common = require("./common");
var async = require("async")
async.series([common.isAuthenicated], function (err, results) {
  console.log("done with", results[0]);
});
我通常更喜欢不同的“语法”

但这是你的决定。
异步示例取自NodeJs中的

定义变量的概念,如在线程中发布:

我在我的节点应用程序中也使用了uglify,结果证明,当使用
global.xyz
时,
xyz
不会变得丑陋

免责声明:我完全知道公开全球信息是一种反模式。但有时这是有充分理由的


希望有帮助

在多个文件之间共享全局范围是一种反模式,更不用说你说的仅仅是节省字节。你为什么需要这样做呢?丑化会使反向工程(当然还有调试)变得更困难,但并非不可能。我的情况是交付代码而不提供web服务。当然,我知道没有什么东西可以完全阻止任何语言的逆向工程。在JavaScript世界中,我知道实现它的可能方法是使代码丑陋化。否则,如果需要交付代码,如何保护代码。至于测试,我不会在丑陋的代码中进行调试。在我的构建过程中,我会在丑化之前先测试原始代码。如果你想保护你的代码,请用编译语言编写并提供二进制文件。
//run.js
var common = require("./common");
var async = require("async")
async.series([common.isAuthenicated], function (err, results) {
  console.log("done with", results[0]);
});
// an example using an object instead of an array
async.series({
    one: function(callback){
        setTimeout(function(){
            callback(null, 1);
        }, 200);
    },
    two: function(callback){
        setTimeout(function(){
            callback(null, 2);
        }, 100);
    }
},
function(err, results) {
    // results is now equal to: {one: 1, two: 2}
});
global.myGlobalVar = "something visible to all modules";