文件结构:在 Node.js 中需要子模块

Posted

技术标签:

【中文标题】文件结构:在 Node.js 中需要子模块【英文标题】:File Structure: Requiring Sub-Modules in Node.js 【发布时间】:2015-12-05 08:40:14 【问题描述】:

我有以下 Node.js 模块/npm 包:

|- dist/
|- - requirejs/
|- - - [stuff in amd pattern ...]
|- - node/
|- - - index.js
|- - - submodules/
|- - - - submodule1.js
|- - - - [submodule2.js etc.]
|- package.json
|- README.md

我可以通过模块名称要求dist/node/index.js(因为我将它设置为 package.json 中的主入口点文件),如下所示:

var myModule = require('myModule');

我想通过这样做来要求子模块(如 AMD 模式):

var mySubmodule = require('myModule/submodules/submodule1');

这会在 Node.js 中引发错误。问题是,Node.js 需要其 dist/node/ 子目录中的主文件,但仍将模块根目录作为工作目录。

假设存在以下结构:

|- dist/
|- - node/
|- - - index.js
|- submodules/
|- - submodule1.js
|- package.json
|- README.md

现在做require('myModule/submodules/submodule1') 就可以了。

现在的问题: 是否有任何设置/配置将“模块命名空间”或工作目录设置为主文件所在的目录,或者我真的需要放置子模块文件夹进入项目根目录,使其无需执行require('myModule/dist/node/submodules/submodule1')即可访问?

【问题讨论】:

【参考方案1】:

简短的回答:你不能。

长答案:您应该直接使用您建议的第二个目录结构 (/myModule/submodules/) 或将某种 API 添加到您的主要导出 (index.js) 以快速获取所需的模块.

虽然您在技术上可以调用 require('myModule/some/complex/path'),但 Node.js / npm 包标准依赖于 require('myModule') 提供的独特接口。

// /dist/node/index.js
var path = require('path');
exports.require = function (name) 
  return require(path.join(__dirname, name));
;

然后在您的应用中:

var myModule = require('myModule');
var submodule1 = myModule.require('submodules/submodule1');

【讨论】:

require('myModule') 不返回模块对象(或者至少不再返回) 至少require('fs/promises') 现在已成为规范的“my/complex/path”【参考方案2】:

您现在可以使用 Node 的 exports feature 执行类似的操作。

【讨论】:

以上是关于文件结构:在 Node.js 中需要子模块的主要内容,如果未能解决你的问题,请参考以下文章

在Node.js中在保持目录结构的情况下压缩指定目录

如何将 node.js 模块导入 node.js 模块

Node.js 项目的文件夹结构

怎样用node.js编译less文件

TypeScript 之 声明文件的结构

Node.js相关——package概念及NPM