Javascript 将npm模块编译为单个文件,无依赖项
我正在尝试将npm模块中的一个文件编译成一个适合ExecJS编译的.js文件。例如,咖啡脚本的家伙有。目标是为它创建一个简单的ruby包装器,类似于 我一直在努力:Javascript 将npm模块编译为单个文件,无依赖项,javascript,ruby,node.js,npm,browserify,Javascript,Ruby,Node.js,Npm,Browserify,我正在尝试将npm模块中的一个文件编译成一个适合ExecJS编译的.js文件。例如,咖啡脚本的家伙有。目标是为它创建一个简单的ruby包装器,类似于 我一直在努力: 我发现了一个暗示丑陋的答案。没用 已使用browserify,它本应完成此操作,但无法编译lib/uncss.js,并显示以下错误消息: Error: ENOENT, open 'tls' while resolving "tls" from file /home/prajjwal/code/uncss/node_modules/r
Error: ENOENT, open 'tls' while resolving "tls" from file /home/prajjwal/code/uncss/node_modules/request/node_modules/forever-agent/index.js
感谢您的帮助。虽然这不是不可能的,但有点复杂,我知道没有工具可以自动完成,但可以手动完成 因此,如果以这种方式加载模块:
var async = require('async');
您可以包括该模块的源,首先,在主脚本中声明模块实例:
var global_async = null;
然后,将模块代码包含在匿名函数中,并用之前声明的全局变量替换“module.exports”:
module.exports = async
与
问题是“UNCS”有很多依赖项,每个都有一些依赖项,所以有很多工作要做,但并非不可能。。。但最后,这个模块还需要一些外部二进制文件,比如“phantomjs”
如果你想构建一个gem来创建一个围绕“UNCS”的包装器,你可以先检查node和UNCS是否已安装,如果没有,则安装这两个,然后调用它们,就像UNCS对phantomjs所做的那样。尽管它似乎不是适合这项工作的工具,看来,browserify是最接近您所寻找的东西 下面是我使用的工具的完整版本:
Node v0.10.26
和browserify 3.38.0
。我没有测试其他版本,所以他们可能有问题
以下是我在克隆uncss
后采取的步骤:
npm安装
,它下载并设置正确的软件包graceful fs
包(一个uncss
依赖项之一的依赖项)(无法通过npm
获得)
--bare
标志,它可以做以下几件事:
两者的别名--无内置项,-无commondir和集合
--插入全局变量
只需“\uuuu文件名,\uuuu目录名”。如果您想在中运行捆绑包,这很方便
节点
有了这个标志,browserify不会为核心模块注入自己的垫片。我使用的完整命令是:
browserify lib/uncss.js --bare > uncss.js
uncss.js
包含uncss
及其绑定的依赖项。不幸的是,由于browserify将所有内容都封装在自己的require
函数中,因此现在捆绑的模块最初不会导出任何内容
$ node
> require('./uncss')
{}
>
为了解决这个问题,我必须更改生成的bundle的初始行:
(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){
*:基本上,browserify定义了一个内部
函数s(o,u)
,其作用类似于require
。周围的代码一开始是通过一个类似于“主模块”列表的循环(在本例中,只有一个),require
对它们进行循环,但不存储结果。然后它返回s
,require
类函数(为什么,我不确定)作为整个匿名函数的输出。我所要做的就是添加一个变量来存储结果,然后返回这个变量。Browserify有一个--standalone标志,可以在这里提供帮助
在命令行上:
browserify -s moduleName --bare moduleName.js -o filename.js
在节点脚本中,可以正常导入连接的模块:
var moduleName = require('./filename');
但是,您可能仍然需要忽略和/或删除任何棘手的模块。如果您正在寻找一种工具来最小化CSS和JS,您可以使用yuicompressor,它是一个单独的Java文件,请检查以下内容:如果您将-r选项添加到browserify,它将使该文件成为“必需”文件
browserify-r lib/uncss.js:uncss--bare>uncss.bundle.js
将允许您通过执行'require('uncss')FWIW来运行uncss.js的内容,当使用此方法创建请求的静态副本时,我必须手动替换存根-此处注释中提到的-r
标志没有帮助。然后,我尝试了@xer0x标记的-s
标志,它实现了这个技巧,因此不需要替换存根。
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){
$ node
> require('./uncss')
[Function: init]
>
browserify -s moduleName --bare moduleName.js -o filename.js
var moduleName = require('./filename');