将npm模块编译为单个文件,没有依赖项

Pra*_*wal 23 javascript ruby node.js npm browserify

我正在尝试将一个uncss npm模块编译成一个适合ExecJS编译的.js文件.例如,咖啡脚本的家伙有这个.目标是为它创建一个简单的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
    
    Run Code Online (Sandbox Code Playgroud)

我想这是因为browserify没有适当的垫片吗?我也关注浏览器替换节点模块的垫片.它们完全可以安全使用吗?我将把它嵌入红宝石中.不要认为浏览器是我应该使用的.还有另一种方法我可以从npm模块生成一个独立的.js吗?

任何帮助赞赏.

xer*_*r0x 13

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

在命令行上:

browserify -s moduleName --bare moduleName.js -o filename.js
Run Code Online (Sandbox Code Playgroud)

在节点脚本中,您可以正常导入连接模块:

var moduleName = require('./filename');
Run Code Online (Sandbox Code Playgroud)

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


voi*_*hos 11

虽然看起来它似乎不是适合这项工作的工具,但似乎浏览器是最接近你所寻找的东西.

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

以下是克隆后采取的步骤uncss:

  1. npm install,下载并设置正确的包
  2. 由于NPM的某种版本控制问题,我不得不从Github 手动安装graceful-fs软件包(一个依赖项uncss的依赖项)(它不可用npm)

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

    别名为--no-builtins, - no-commondir,并将--insert-global-vars设置为"__filename,__ dirname".如果要在节点中运行bundle,这很方便.

    使用此标志,browserify不会为核心模块注入自己的填充程序.我使用的完整命令是:

    browserify lib/uncss.js --bare > uncss.js
    
    Run Code Online (Sandbox Code Playgroud)

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

$ node
> require('./uncss')
{}
>
Run Code Online (Sandbox Code Playgroud)

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

(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){
Run Code Online (Sandbox Code Playgroud)

对此:

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){
Run Code Online (Sandbox Code Playgroud)

注:这是不是只是module.exports增加-有在还需要*中间的一些修改.

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

$ node
> require('./uncss')
[Function: init]
>
Run Code Online (Sandbox Code Playgroud)

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