虽然它看起来不太适合这项工作,但 browserify 似乎是最接近您正在寻找的东西。
为了完整起见,以下是我使用的工具的版本:Node v0.10.26 和 browserify 3.38.0。我没有用其他版本测试,所以他们可能有问题。
这是我克隆uncss后采取的步骤:
-
npm install,下载并设置正确的包
-
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
-
此时,我运行了 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。