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

Dav*_*Eyk 5 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
Run Code Online (Sandbox Code Playgroud)

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

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

更新:这里的答案似乎表明这是可能的,但我无法从npm文档中弄清楚如何实际构建文件和package.json.

说我有这些文件:

./lib/mymodule.js
./lib/yaks.js
./lib/razors.js
./lib/sharks.js
./lib/jets.js
Run Code Online (Sandbox Code Playgroud)

在我package.json,我将:

  "main": "./lib/mymodule.js"
Run Code Online (Sandbox Code Playgroud)

但节点如何知道其他文件./lib/呢?

ccn*_*kes 7

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

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

祝你好运这个牦牛lib.听起来毛茸茸的:)

  • 很遗憾所有内容都必须存放在根文件夹中,但是必须这样做。谢谢! (2认同)