我想知道是否有一种方法可以使用已经安装在我的计算机中的r.js(RequireJS Optimizer)在命令行中仅对一个文件进行uglify。
就像我们可以使用node r.js cssIn="" out=""
...
我实际上是在没有网络连接的计算机上工作,我无法在其上安装其他东西(特别是使用npm)
也许是否有可能从另一台计算机上下载uglifyjs软件包,包括准备安装在我的所有依赖项?虽然我没有找到类似的东西......
由于
答案 0 :(得分:4)
由于您在提问时提到了这个问题,我将介绍它。
在具有uglify-js
的计算机上。找到安装uglify-js
的位置。归档该目录及其子目录。
在已断开连接的计算机上。在项目的node_modules
子目录中取消归档该目录。我们假设项目在/home/johndoe/foo
。我想在/home/johndoe/foo/node_modules
中取消归档。
您可以在uglify-js
使用node_modules/uglify-js/bin/uglify-js
。
第一种方法是我将使用的方法。
如果第一种方法不适合你或不能正常工作,那么还有第二种方法。事实是,复制已安装的Node包并不能完美地复制安装过程。在可能的情况下它可能完美地工作但在某些情况下它可能不会。所以这是一个使npm
完成整个安装过程的方法。
在安装了uglify的计算机上,执行:
$ npm ls
在输出中查找uglify-js以及里面的所有包它是分层次的。输出将如下所示:
├── cookie@0.1.0
├─┬ uglify-js@2.4.12
│ ├── async@0.2.10
│ ├─┬ optimist@0.3.7
│ │ └── wordwrap@0.0.2
│ ├─┬ source-map@0.1.31
│ │ └── amdefine@0.1.0
│ └── uglify-to-browserify@1.0.2
└── yaml@0.2.3
在上面的输出中,您关注的是uglify-js
,包括uglify-to-browserify
。对于每个这些包,请查看压缩包文件的npm缓存。在Linux和类似系统上,这将在~/.npm/
中。例如,我的计算机uglify-js
缓存在~/.npm/uglify-js/2.4.12/package.tgz
。将每个软件包复制到可以连接到已断开连接的计算机的介质。确保复制正确的版本。它们列在上面列表中的@
符号之后。
将媒体移至已断开连接的计算机。
对于每个包,请安装:
$ npm install [path to the tgz file]
当您将tgz
传递给npm
时,只要满足所有依赖关系,它就会忽略网络。这里的顺序很重要。您想要从没有依赖项的包开始。我相信npm ls
生成其列表的方式,如果你只是以相反的顺序,你会没事的。所以:
在此过程结束时,uglifyjs
命令将位于node_modules/.bin/uglifyjs
中。您可以根据uglifyjs
个自己的文件之一进行测试。例如:
$ node_modules/.bin/uglifyjs node_modules/uglify-js/lib/output.js
我尝试过其他一些方法但发现npm
非常渴望去网络查找软件包。很容易想到“也许ABC会起作用......”并发现它并不是因为即使一切都在本地可用,npm
仍然想要网络连接。
uglify-js
r.js
r.js
优化器中包含s uglify-js
。不幸的是,它并没有打包成r.js
之外的平凡可用。但是,您可以像这样访问它:
var r = require("./node_modules/.bin/r.js");
var fs = require("fs");
var config = {};
var fileContents = fs.readFileSync(process.argv[2]).toString();
r.tools.useLib("mine", function (require) {
require(["uglifyjs/index"], function (uglify) {
var parser = uglify.parser;
var processor = uglify.uglify;
var ast = parser.parse(fileContents, config.strict_semicolons);
if (config.no_mangle !== true) {
ast = processor.ast_mangle(ast, config);
}
ast = processor.ast_squeeze(ast, config);
fileContents = processor.gen_code(ast, config);
if (config.max_line_length) {
fileContents = processor.split_lines(fileContents,
config.max_line_length);
}
//Add trailing semicolon to match uglifyjs command line version
fileContents += ';';
fs.writeFileSync(process.argv[3], fileContents);
});
});
如果上述代码保存在名为script.js
的文件中并且像node script.js input output
这样调用,则会将input
uglify并将结果放入output
。关键是使用tools.useLib
导出的r.js
方法。这允许访问r.js
包含的库。其余的代码大多是从r.js
中执行uglification的部分复制的。
r.js
$ r.js -o name=main exclude=main out=built.js
这将仅优化模块main
(在文件main.js
中)并将输出放在build.js
中。它不会遵循main
的任何依赖关系。但是,它通过添加模块的名称作为第一个参数来修改define
。这可以通过sed
,awk
,perl
等的后处理步骤删除。
如果您要uglify的文件将被填充以与RequireJS(不是实际的AMD风格模块)一起使用,则您不希望使用exclude
参数:
$ r.js -o name=shimmed out=built.js
就像上面的第一个命令一样,这不仅仅是uglify文件。它最后添加了define
个电话。同样,这可以使用sed
或类似工具取出。
(我绝对能够在没有baseUrl=.
的情况下使用这些命令。但是,根据您的具体操作,r.js
可能会抱怨。所以您可能需要添加baseUrl=.
来命令行。)
答案 1 :(得分:0)
将文件放在文件夹
中从该文件夹中运行r.js:
node r.js -o baseUrl=. name=main out=main-built.js
你在那台计算机上没有互联网连接,是不是只是将文件放在像usb sitck这样的东西上并在具有互联网的计算机上进行uglify它更容易?
答案 2 :(得分:0)
我将解决如何直接从一台计算机上复制节点包的问题,因为有了这个技巧,你就可以使用uglify,clean-css或任何你想要的包。
背景是节点包中包含其自己的安装目录下所有依赖项的副本 - 这样,如果您使用的话,可以通过简单的cp -r
或xcopy
轻松获取整个包Windows(我声称不支持)
假设一台计算机安装了clean-css
包
which cleancss
应显示/usr/local/share/npm/bin/cleancss
之类的路径,在这种情况下,您需要以递归方式将/usr/local/share/npm/lib/node_modules/clean-css/
复制到其他计算机的相应node_modules文件夹(在/usr/local/share/npm/bin/
中创建符号链接) )无需互联网即可访问。