Javascript 从应用程序导入/需要的NPM依赖项';根

Javascript 从应用程序导入/需要的NPM依赖项';根,javascript,reactjs,npm,es6-modules,Javascript,Reactjs,Npm,Es6 Modules,假设我创建了一个名为app的应用程序。它安装一个名为包的npm依赖项 现在让我们假设package要求App具有以下文件结构: 应用程序/ 节点单元/ 包装/ index.js package.json 文件夹/ file.js index.js package.json 在App/node\u modules/package/index.js中,它需要导入/需要位于App/folder/file.js的文件 例如: import File from "../../folde

假设我创建了一个名为
app
的应用程序。它安装一个名为
的npm依赖项

现在让我们假设
package
要求
App
具有以下文件结构:

  • 应用程序/
    • 节点单元/
      • 包装/
        • index.js
        • package.json
    • 文件夹/
      • file.js
    • index.js
    • package.json
App/node\u modules/package/index.js
中,它需要导入/需要位于
App/folder/file.js
的文件

例如:

import File from "../../folder/file";
const package = new Package(File);

这是最好的方法吗?是否有任何方法可以在导入中引用应用程序的根,而无需使用
。/../

否。这不是最好的方法。模块不应要求其用户提供

改用依赖项注入-让用户向您传递所需的对象:

package/index.js

let File = null;

function init (fileModule) {
    File = fileModule;
}

export init;

// ...
import { init } from 'package';
import File from './folder/file';

init(File);
通过这种方式,您可以从主应用程序传递
文件
对象:

App/index.js

let File = null;

function init (fileModule) {
    File = fileModule;
}

export init;

// ...
import { init } from 'package';
import File from './folder/file';

init(File);
如何设计API来传递“中间件”取决于您。以上只是一个建议。您可以将其作为参数传递给构造函数,例如:

import File from "../../folder/file";
const package = new Package(File);
事实上,像Express这样的框架就是这样工作的。它允许Express在不了解代码结构的情况下进行扩展:

app.use(someMiddleware); // Express never "requires" your middleware
                         // instead it allows you to pass middleware to itself