Javascript 将npm模块编译为单个文件,无依赖项

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

我正在尝试将npm模块中的一个文件编译成一个适合ExecJS编译的.js文件。例如,咖啡脚本的家伙有。目标是为它创建一个简单的ruby包装器,类似于

我一直在努力:

  • 我发现了一个暗示丑陋的答案。没用
  • 已使用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使用的垫片替换节点模块。使用它们是否完全安全?我将把它嵌入到红宝石中。不要认为我应该使用browserify。有没有其他方法可以从npm模块生成独立的.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安装
    ,它下载并设置正确的软件包
  • ,我不得不从Github手动安装
    graceful fs
    包(一个
    uncss
    依赖项之一的依赖项)(无法通过
    npm
    获得)

  • 在这一点上,我运行了browserify。事实证明,browserify有一个
    --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');