考虑一个可以通过插件扩展的节点模块(superModule);这样的插件可以如下所示实现似乎是合理的:
const superModule = require("super-module");
class SpecialPlugin extends superModule.Plugin {
foo() {
}
}
module.exports = SpecialPlugin;
这意味着项目同时使用"超级模块" "超级模块特别插件"模块看起来如下:
{project}/
|-node_modules/
| |-super-module/ <----
| | |-index.js |
| | |-package.json |
| | |-- Included Twice?!
| |-super-module-special-plugin/ |
| | |-node_modules/ |
| | | |-super-module/ <----
| | | | |-index.js
| | | | |-package.json
| | | |
| | |-index.js
| | |-package.json
| |
|-index.js
|-package.json
目录结构包含相同的&#34;超级模块&#34;实施两次。
Q1。 NPM在这种情况下的表现如何?
Q2。是否根本不可能暴露基础&#34;插件&#34;类?
更新/事后补充:
或许正确的方法是做一些像以下那样的&#34;超级模块&#34;被调用者注入其插件。
module.exports.setup = function(superModule) {
return class SuperPlugin extends superModule.Plugin {
foo() {
}
}
};
答案 0 :(得分:1)
NPM在这种情况下的表现如何?
取决于版本。如果可能的话,npm @ 3会使所有依赖项变平。因此,如果两个软件包都引用相同的版本,则super-module
只会包含一次。如果存在版本冲突,super-module-special-plugin
将安装它自己的副本,就像在您的示例中一样。
npm @ 2默认不进行重复数据删除,因此在这种情况下,它将存储同一模块的两个副本。
是否根本无法公开基础“插件”类?
当然可以。将基类注入依赖项是有效的,而不是不常见的方法。
super-module-special-plugin
也可以将super-module
声明为peer dependency。在这种情况下,“父”包的责任是提供super-module
。在考虑这个用例的情况下设计了对等依赖关系。
对等依赖关系处理从npm @ 2改为npm @ 3。如果它不存在,npm @ 2将始终安装对等依赖项。 npm @ 3不再这样做了,所以你必须明确地安装它。