【问题标题】:Compile an npm module into a single file, without dependencies将一个 npm 模块编译成一个文件,没有依赖关系
【发布时间】:2014-05-07 19:12:12
【问题描述】:

我正在尝试将uncss npm 模块编译为适合 ExecJS 编译的单个 .js 文件。例如,咖啡脚本人有this。目标是为其创建一个简单的 ruby​​ 包装器,类似于 ruby-coffee-script

我到目前为止所做的尝试:

  1. 遇到一个建议 UglifyJS 的答案。无处可去。
  2. 使用了 browserify,它应该可以解决问题,但是它无法编译 lib/uncss.js 并显示以下错误消息:

    Error: ENOENT, open 'tls' while resolving "tls" from file /home/prajjwal/code/uncss/node_modules/request/node_modules/forever-agent/index.js
    

我想这是因为 browserify 没有合适的 shim 吗?我还担心 browserify 替换节点模块的垫片。它们使用起来完全安全吗?我将把它嵌入到红宝石中。不要认为 browserify 是我应该使用的。还有其他方法可以从 npm 模块生成独立的 .js 吗?

任何帮助表示赞赏。

【问题讨论】:

  • 如果你正在寻找一个最小化 CSS 和 JS 的工具,你可以使用 yuicompressor,它是一个单一的 Java 文件,看看这个:yui.github.io/yuicompressor

标签: javascript ruby node.js npm browserify


【解决方案1】:

Browserify 有一个 --standalone 标志可以在这里提供帮助。

在命令行上:

browserify -s moduleName --bare moduleName.js -o filename.js

在您的节点脚本中,您可以正常导入串联模块:

var moduleName = require('./filename');

但是,您可能仍需要忽略和/或删除任何棘手的模块。

【讨论】:

    【解决方案2】:

    虽然它看起来不太适合这项工作,但 browserify 似乎是最接近您正在寻找的东西。

    为了完整起见,以下是我使用的工具的版本:Node v0.10.26browserify 3.38.0。我没有用其他版本测试,所以他们可能有问题。

    这是我克隆uncss后采取的步骤:

    1. npm install,下载并设置正确的包
    2. Due to some sort of versioning problem with NPM,我必须从 Github 手动安装 graceful-fs 包(uncss 的依赖项之一的依赖项)(无法通过 npm 获得)

      npm install https://github.com/isaacs/node-graceful-fs/tarball/v2.0.3
      
    3. 此时,我运行了 browserify。事实证明,browserify 有一个 --bare 标志,它做了几件事:

      --no-builtins、--no-commondir 和 sets 的别名 --插入全局变量 只是“__filename,__dirname”。如果您想在其中运行捆绑包,这很方便 节点。

      有了这个标志,browserify 不会为核心模块注入自己的 shims。我使用的完整命令是:

      browserify lib/uncss.js --bare > uncss.js
      

    完成上述操作后,文件uncss.js 包含uncss 及其捆绑的依赖项。不幸的是,由于 browserify 将所有内容都包装在自己的 require 函数中,因此现在捆绑的模块最初不会导出任何内容。

    $ node
    > require('./uncss')
    {}
    >
    

    为了解决这个问题,我不得不改变生成包的初始行:

    (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
    

    到这里:

    module.exports = (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require,ex;for(var o=0;o<r.length;o++)ex=s(r[o]);return ex})({1:[function(require,module,exports){
    

    注意:它只是添加了module.exports - 中间还需要一些修改*。

    在那之后,捆绑似乎工作了:

    $ node
    > require('./uncss')
    [Function: init]
    >
    

    *:本质上,browserify 定义了一个内部function s(o, u),其行为类似于require。周围的代码通过循环看起来像“主模块”列表(在这种情况下,只有一个)开始,requireing 他们,但不存储结果。然后它返回s,类似require 的函数(为什么,我不确定)作为整个匿名函数的输出。我所要做的就是添加一个变量来存储结果,然后改为return

    【讨论】:

    • 如果您将 -r 选项添加到 browserify,它将使该文件成为“必需”文件。 browserify -r lib/uncss.js:uncss --bare &gt; uncss.bundle.js 将允许您通过执行 `require('uncss') 来运行 uncss.js 的内容
    • FWIW,当使用此方法创建 request 的静态副本时,我不得不手动替换存根 - 此处注释中提到的 -r 标志没有帮助。然后我尝试了@xer0x 指出的-s 标志,它起到了作用,因此不需要替换存根。
    【解决方案3】:

    虽然不是不可能,但有点复杂,我知道没有工具可以自动完成,但可以手动完成。

    所以,如果你以这种方式加载一个模块:

    var async = require('async');
    

    您可以包含该模块的源代码,首先,在您的主脚本中声明模块实例:

    var global_async = null;
    

    然后,将模块代码包含在匿名函数中,并将“module.exports”替换为您之前声明的全局变量:

    module.exports = async
    

    global_async = async;
    

    问题是“uncss”有很多依赖,每个都有一些依赖,所以要做的工作很多,但并非不可能......但最后,这个模块还需要一些外部像“phantomjs”这样的二进制文件。

    如果您想构建一个围绕“uncss”创建包装器的 gem,您可以检查是否先安装了 node 和 uncss,如果没有,安装两者,然后调用它们,就像 uncss 对 phantomjs 所做的那样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-19
      • 2014-12-25
      • 2016-05-03
      • 1970-01-01
      • 2016-07-21
      • 1970-01-01
      相关资源
      最近更新 更多