3

我在 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

4 回答 4

6
  • 不要使用全局变量。
  • var async = reuqire('async')在需要的地方使用。
  • module.exports在您需要的特定模块中使用。
  • 使用类似browserify的东西来生成单个js。
  • Uglify(或使用名为uglifyify的 browserify 转换)

比如最简单的形式(不使用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都驻留在同一个目录中。

相关问题:如何使用 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

于 2014-12-31T13:35:59.270 回答
1

在继续进行丑化之前,您可能希望连接这些文件。串联是将多个代码文件组合成一个整体的过程,该整体知道代码的所有部分。出于多种原因,这通常与丑陋结合一起完成,主要是为了提高性能(如果您只向客户端发送 1 个文件,您的应用程序运行速度会快得多)。

话虽如此,这通常是在您向客户端提供代码时完成的一种做法,不一定适用于后端/服务器端逻辑。理想情况下,除了您或有权访问您用于部署所述服务器代码的任何服务的人之外,没有人应该看到您代码的那一面。如果您主要关心的是防止逆向工程,或者使您的代码不可读,我建议您混淆您的代码。

“这是 omega 站点。他拥有的最高加密级别。看起来像是隐藏其真正目的的混淆代码。通过默默无闻来确保安全。” - Q Skyfall 2012

于 2014-12-27T06:38:44.737 回答
0

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

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

并删除require()s.

于 2014-12-26T15:19:01.130 回答
0

在 NodeJs 中有定义全局变量的概念,就像在这个线程中发布的那样:

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

我也在我的节点应用程序中使用 uglify,结果发现在使用时global.xyzxyz不会被 uglify。

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

希望有帮助!

于 2017-01-31T21:13:24.843 回答