使用Requirejs优化器美化一个JS文件
我想知道是否有办法使用我的计算机上已经安装的r.js(RequireJS Optimizer)将命令行中的一个文件丑化。
就像我们可以使用node r.js cssIn="" out=""
.
我实际上是在一台没有互联网连接的计算机上工作,我无法在上面安装其他东西(特别是使用NPM)
也许可以从另一台计算机下载一个uglifyjs包,包括准备安装在我的计算机上的所有依赖项?不过,我没有找到这样的东西.谢谢
解决方案
从另一台计算机复制文件
既然您在问题中提到这是一种可能性,我将对此进行讨论。
第一种方法
在具有
uglify-js
的计算机上。查找uglify-js
的安装位置。存档该目录及其子目录。在断开的计算机上。将该目录解压到项目的
node_modules
子目录中。假设项目在/home/johndoe/foo
中。我想在/home/johndoe/foo/node_modules
中解压缩它。您可以在
node_modules/uglify-js/bin/uglify-js
使用uglify-js
。
第一个方法是我要使用的方法。
第二种方法
如果第一种方法不知何故对您不起作用或不能很好地起作用,还有第二种方法。事实是,复制已安装的节点软件包并不能完美地复制安装过程。在5月份的情况下,它可能会完美地工作,但在某些情况下,它可能不会。因此,这里有一种方法可以使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
生成它的列表的方式是,如果您只是按相反的顺序进行,您就不会有问题。因此:- 修改
- 源映射
- Wordrap
- 乐观主义者
- 异步
- uglify-js
uglifyjs
命令将位于node_modules/.bin/uglifyjs
中。您可以很容易地针对uglifyjs
自己的文件之一测试它。例如:$ node_modules/.bin/uglifyjs node_modules/uglify-js/lib/output.js
我尝试了其他几种方法,但发现npm
非常渴望到网络上查找包。人们很容易想到"也许ABC会行得通……"发现没有,因为即使所有内容都在本地可用,npm
仍然需要网络连接。
使用r.js
中包含的uglify-js
r.js
优化器在其中包含suglify-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
丑化,并将结果放入output
。关键是使用r.js
导出的tools.useLib
方法。这允许访问r.js
包含的库。代码的睡觉大部分是从r.js
中进行丑化的部分复制过来的。
在命令行使用r.js
$ r.js -o name=main exclude=main out=built.js
这将仅优化模块main
(在文件main.js
中),并将输出放入build.js
。它不会遵循main
的任何依赖项。但是,它通过添加模块名称作为第一个参数来修改define
。可以使用sed
、awk
、perl
等后处理步骤将其删除。
如果要丑化的文件将被填充以用于RequireJS(不是实际的AMD样式模块),则不希望使用exclude
参数:
$ r.js -o name=shimmed out=built.js
与上面的第一个命令一样,这也不仅仅是使文件变得难看。它在末尾添加一个define
调用。同样,可以使用sed
或类似的工具将其取出。
(我绝对可以在没有baseUrl=.
的情况下使用这些命令。但是,根据您的具体操作,r.js
可能会抱怨。因此,您可能需要将baseUrl=.
添加到命令行。)
相关文章