编译一个npm模块到一个文件中,不需要依赖

我试图将uncss npm模块编译成适合ExecJS编译的单个.js文件。 例如,咖啡剧本人有这个 。 目标是为它创build一个简单的ruby包装,类似于ruby-coffee-script 。

我曾经试过的:

  1. 遇到了一个build议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没有一个适当的垫片呢? 我还担心browserify将用replace节点模块的垫片。 他们是完全安全的使用? 我将会把它embedded到gem中。 不要认为browserify是我应该使用的。 有没有另一种方法,我可以从npm模块生成一个独立的.js?

任何帮助赞赏。

       

网上收集的解决方案 "编译一个npm模块到一个文件中,不需要依赖"

虽然看起来似乎不是这个工作的正确工具,但似乎浏览器是最接近你要找的东西。

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

以下是我在克隆uncss之后所采取的步骤:

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

     npm install https://github.com/isaacs/node-graceful-fs/tarball/v2.0.3 
  3. 在这一点上,我运行了浏览器。 事实certificate,browserify有一个 – 标志,这有两个东西:

    别名为–no-builtins,–no-commondir,并将–insert-global-vars设置为“__filename,__ dirname”。 如果要在节点中运行包,这很方便。

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

     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.exportsjoin – 中间还有一些需要修改的地方。

之后,捆绑似乎工作:

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

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

Browserify有一个 – standalone国旗,可以帮助这里。

在命令行上:

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

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

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

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

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

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

 var async = require('async'); 

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

 var global_async = null; 

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

 module.exports = async 

 global_async = async; 

问题在于“uncss”有很多依赖关系,每个依赖关系都有一些依赖关系,所以要完成很多工作,但并非不可能……但最后,这个模块还需要一些外部的二进制文件,如“ phantomjs”。

如果你想创build一个创build一个“uncss”包装的gem,你可以检查节点和uncss是否安装在任何东西之前,如果没有,安装两个,然后调用它们,就像uncss与phantomjs一样。