如何打包带有可选子模块的节点模块?

How do I package a node module with optional submodules?

我正在编写一个 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 文档中弄清楚如何实际构建文件和package.json.

假设我有这些文件:

./lib/mymodule.js
./lib/yaks.js
./lib/razors.js
./lib/sharks.js
./lib/jets.js

在我的 package.json 中,我将有:

  "main": "./lib/mymodule.js"

但是节点如何知道 ./lib/ 下的其他文件?

它比看起来更简单 -- 当您通过名称需要一个包时,它会获得 "main" 文件。所以 require('mymodule') returns "./lib/mymodule.js"(根据你的 package.json "main" 支持)。要直接要求可选的子模块,只需通过它们的文件路径要求它们。

所以要获取 yaks 子模块:require('mymodule/lib/yaks')。如果你想做 require('mymodule/yaks') 你需要改变你的文件结构来匹配它(移动 yaks.js 到根文件夹)或者做一些棘手的事情,其中​​有一个 yaks.js 在根和它只是做类似的事情:module.exports = require('./lib/yaks');

祝你好运。听起来毛茸茸的:)