Javascript 如何将节点模块与可选子模块打包?

Javascript 如何将节点模块与可选子模块打包?,javascript,node.js,npm,browserify,Javascript,Node.js,Npm,Browserify,我正在编写一个javascript库,其中包含一个核心模块和几个 扩展核心模块的可选子模块。我的目标是浏览器 环境(使用Browserify),我希望模块的用户只 希望使用我的一些可选子模块,而不必将其余的下载到 客户机——很像在lodash中工作的自定义构建 我认为这是可行的: // Require the core library var Tasks = require('mymodule'); // We need yaks require('mymodule/yaks'); // We

我正在编写一个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以这种方式打包某些内容?我有妄想症吗

更新:一个答案似乎表明这是可能的,但我无法从npm文档中找出如何实际构造文件和
package.json

假设我有这些文件:

./lib/mymodule.js
./lib/yaks.js
./lib/razors.js
./lib/sharks.js
./lib/jets.js
在我的
package.json
中,我将有:

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

但是node如何知道
/lib/
下的其他文件呢?

它比看起来更简单——当您需要一个名称为的包时,它会得到“main”文件。因此
require('mymodule')
返回
“/lib/mymodule.js”
(根据您的package.json“main”属性)。要直接要求可选子模块,只需通过其文件路径要求它们

因此,要获得yaks子模块:
require('mymodule/lib/yaks')
。如果你想做
require('mymodule/yaks')
你需要改变你的文件结构来匹配它(将yaks.js移动到根文件夹),或者做一些棘手的事情,在根目录下有一个yaks.js,它只是做一些类似的事情:
module.exports=require('./lib/yaks')


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

很遗憾,所有东西都必须保存在根文件夹中,但它必须这样做。谢谢@DavidEyk同意,我也希望有一种方法可以在package.json中指定可导出的子模块,而不是让模块中的任何东西都可以导出。