使用Requirejs优化器美化一个JS文件

2022-02-28 00:00:00 node.js javascript requirejs uglifyjs

我想知道是否有办法使用我的计算机上已经安装的r.js(RequireJS Optimizer)将命令行中的一个文件丑化。 就像我们可以使用node r.js cssIn="" out="".

缩小CSS文件一样

我实际上是在一台没有互联网连接的计算机上工作,我无法在上面安装其他东西(特别是使用NPM)

也许可以从另一台计算机下载一个uglifyjs包,包括准备安装在我的计算机上的所有依赖项?不过,我没有找到这样的东西.

谢谢


解决方案

从另一台计算机复制文件

既然您在问题中提到这是一种可能性,我将对此进行讨论。

第一种方法

  1. 在具有uglify-js的计算机上。查找uglify-js的安装位置。存档该目录及其子目录。

  2. 在断开的计算机上。将该目录解压到项目的node_modules子目录中。假设项目在/home/johndoe/foo中。我想在/home/johndoe/foo/node_modules中解压缩它。

  3. 您可以在node_modules/uglify-js/bin/uglify-js使用uglify-js

第一个方法是我要使用的方法。

第二种方法

如果第一种方法不知何故对您不起作用或不能很好地起作用,还有第二种方法。事实是,复制已安装的节点软件包并不能完美地复制安装过程。在5月份的情况下,它可能会完美地工作,但在某些情况下,它可能不会。因此,这里有一种方法可以使npm完成整个安装过程。

  1. 在安装了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。将这些软件包复制到您可以带到断开连接的计算机的介质上。请确保复制正确的版本。它们列在上面列表中的@符号之后。

  2. 将媒体移动到断开的计算机。

  3. 对于每个软件包,使用以下命令安装:

    $ 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。可以使用sedawkperl等后处理步骤将其删除。

如果要丑化的文件将被填充以用于RequireJS(不是实际的AMD样式模块),则不希望使用exclude参数:

$ r.js -o name=shimmed out=built.js

与上面的第一个命令一样,这也不仅仅是使文件变得难看。它在末尾添加一个define调用。同样,可以使用sed或类似的工具将其取出。

(我绝对可以在没有baseUrl=.的情况下使用这些命令。但是,根据您的具体操作,r.js可能会抱怨。因此,您可能需要将baseUrl=.添加到命令行。)

相关文章