如何使用可选子模块打包节点模块?

时间:2015-06-25 21:32:33

标签: javascript node.js npm browserify

我正在编写一个包含核心模块和几个的javascript库 可选的子模块,用于扩展核心模块。我的目标是浏览器 环境(使用Browserify),我希望我的模块的用户只会 想要使用我的一些可选子模块,而不必将其余子模块下载到 客户端 - 就像自定义构建在lodash中工作一样。

我想象这个工作的方式:

// Require the core library
var Tasks = require('mymodule');
// We need yaks
require('mymodule/yaks');
// We need razors
require('mymodule/razors');

var tasks = new Tasks();    // Core mymodule functionality
var yak = tasks.find_yak(); // Provided by mymodule/yaks
tasks.shave(yak);           // Provided by mymodule/razors

现在,假设mymodule/*命名空间有数十个这些子模块。该 mymodule库的用户只需要承担带宽成本 她使用的子模块,但不需要像以下那样的离线构建过程 lodash使用:像Browserify这样的工具为我们解决了依赖图 仅包含所需的代码。

是否可以使用Node / npm以这种方式打包?我是妄想吗?

更新:答案over here似乎表明这是可行的,但我无法从npm文档中了解如何实际构建文件并{{1 }}

说我有这些文件:

package.json

在我的./lib/mymodule.js ./lib/yaks.js ./lib/razors.js ./lib/sharks.js ./lib/jets.js 中,我会:

package.json

但节点如何知道 "main": "./lib/mymodule.js" 下的其他文件?

1 个答案:

答案 0 :(得分:5)

它比看起来更简单 - 当你需要一个名字的包时,它会获得“主”文件。所以require('mymodule')返回"./lib/mymodule.js"(根据你的package.json“主”道具)。要直接需要可选的子模块,只需通过其文件路径来获取它们。

所以要获得牦牛子模块:require('mymodule/lib/yaks')。如果你想做require('mymodule/yaks'),你需要更改你的文件结构以匹配它(将yaks.js移动到根文件夹)或者做一些棘手的事情,在根部有一个yaks.js它只是做某事喜欢:module.exports = require('./lib/yaks');

祝你好运这个牦牛。听起来很毛茸茸:))