编译一个npm模块到一个文件中,不需要依赖
我试图将uncss npm模块编译成适合ExecJS编译的单个.js文件。 例如,咖啡剧本人有这个 。 目标是为它创build一个简单的ruby包装,类似于ruby-coffee-script 。
我曾经试过的:
- 遇到了一个build议UglifyJS的答案。 它没有得到。
-
使用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?
任何帮助赞赏。
虽然看起来似乎不是这个工作的正确工具,但似乎浏览器是最接近你要找的东西。
为了完整,这里是我使用的工具的版本: Node v0.10.26
和browserify 3.38.0
。 我没有用其他版本testing,所以他们可能有问题。
以下是我在克隆uncss
之后所采取的步骤:
-
npm install
,下载并设置适当的软件包 -
由于NPM的某种版本控制问题 ,我不得不从Github手动安装
graceful-fs
软件包(依赖于uncss
的一个依赖项)(它不能通过npm
)npm install https://github.com/isaacs/node-graceful-fs/tarball/v2.0.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.exports
join – 中间还有一些需要修改的地方。
之后,捆绑似乎工作:
$ 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一样。
- 如何使用Gulp与来自Bower组件的Browserify创build单独的供应商捆绑包
- Browsewrity与打字稿模块 – 什么是最好的devise实践?
- 不能使用核心nodejs模块与browserify(dgram)
- 如何忽略browserify programmatic api中的库
- browserify&factor-bundle依赖关系ID
- browserify外部与排除有什么区别?
- 当使用browserify将一个socket.io依赖项与–node标志绑定在一起时,“Error:Can not find module”
- 如何使用browserify包含非节点模块
- 如何检测什么时候运行browserify?