我在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
命令。
答案 0 :(得分:6)
var async = reuqire('async')
。 module.exports
。例如,最简单的形式(不使用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)