Uglify全局变量

时间:2014-12-22 06:30:35

标签: 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.log("done");
});

我希望将asyncisAuthenticated变量缩小,但在所有文件中缩小为相同的内容。它看起来如下:

//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命令。

4 个答案:

答案 0 :(得分:6)

  • 不要使用全局。
  • 在需要时使用var async = reuqire('async')
  • 在您需要的特定模块中使用module.exports
  • 使用browserify之类的内容生成单个js。
  • Uglify(或使用名为uglifyify的浏览器转换)

例如,最简单的形式(不使用uglifyify)

$ browserify run.js | uglifyjs -c > run.min.js

请注意,如果您使用自己的代码,例如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位于同一目录中。

相关问题:How to get minified output with browserify?

附注

您在问题中使用async.series的方式没有任何实际优势。你可能只有:

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

common.isAuthenicated();
console.log("done");

在Async系列中,您通常称为异步函数:

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]);
});

我通常更喜欢不同的语法"

// 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}
});

但这是你的电话。 异步示例取自https://github.com/caolan/async#seriestasks-callback

答案 1 :(得分:1)

您可能希望在继续之前对文件进行连接并对其进行uglify。 Concatenation是将多个代码文件组合成一个整体生物的过程,该生物知道代码所有部分的所有内容。这通常与uglyfying一起使用有几个原因,主要是为了获得性能优势(如果你只向客户端发送1个文件,你的应用程序运行得更快)。

话虽这么说,这通常是在为客户端提供服务代码时完成的做法,不一定是针对后端/服务器端逻辑。理想情况下,除了您或有权访问您用于部署所述服务器代码的任何服务的人员,您应该看到代码的那一面。如果您主要关注的是防止逆向工程或使代码无法读取,我建议obfuscating您的代码。

"这是欧米茄网站。他有最好的加密级别。看起来像混淆代码隐瞒其真正的目的。通过默默无闻的安全。" - Q Skyfall 2012

答案 2 :(得分:0)

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

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

并删除require()s

答案 3 :(得分:0)

在NodeJ中,有一个定义global变量的概念,例如在this帖子中发布:

global.myGlobalVar = "something visible to all modules";

我在我的节点应用中也使用了uglify,结果发现在使用global.xyz时,xyz没有被证实。

免责声明:我完全清楚暴露全球信息是一种反模式。但有时候有充分的理由。

希望有所帮助!