使用requirejs优化器来验证一个JS文件

时间:2014-01-30 21:14:47

标签: javascript node.js requirejs uglifyjs

我想知道是否有一种方法可以使用已经安装在我的计算机中的r.js(RequireJS Optimizer)在命令行中仅对一个文件进行uglify。 就像我们可以使用node r.js cssIn="" out="" ...

缩小css文件一样

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

也许是否有可能从另一台计算机上下载uglifyjs软件包,包括准备安装在我的所有依赖项?虽然我没有找到类似的东西......

由于

3 个答案:

答案 0 :(得分:4)

从另一台计算机复制uglify

由于您在提问时提到了这个问题,我将介绍它。

第一种方法

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

  2. 在已断开连接的计算机上。在项目的node_modules子目录中取消归档该目录。我们假设项目在/home/johndoe/foo。我想在/home/johndoe/foo/node_modules中取消归档。

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

  4. 第一种方法是我将使用的方法。

    第二种方法

    如果第一种方法不适合你或不能正常工作,那么还有第二种方法。事实是,复制已安装的Node包并不能完美地复制安装过程。在可能的情况下它可能完美地工作但在某些情况下它可能不会。所以这是一个使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生成其列表的方式,如果你只是以相反的顺序,你会没事的。所以:

      • amdefine
      • 源映射
      • wordrap
      • 乐天派
      • 异步
      • 丑化-JS

      在此过程结束时,uglifyjs命令将位于node_modules/.bin/uglifyjs中。您可以根据uglifyjs个自己的文件之一进行测试。例如:

      $ node_modules/.bin/uglifyjs node_modules/uglify-js/lib/output.js
      
    4. 我尝试过其他一些方法但发现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。这可以通过sedawkperl等的后处理步骤删除。

      如果您要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 -rxcopy轻松获取整个包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/中创建符号链接) )无需互联网即可访问。