Rails-like javascript 中的自动加载 - 允许从 webpack 中的根包中获取依赖项

Rails-like autoload in javascript - Allow dependency to require from root package in webpack

我正在编写一个框架包,我想让它能够自动从主项目 src/ 中获取模块。如果您熟悉 rails,这类似于它的自动加载功能。

因此,如果在您的 Web 应用程序中遵循目录约定,比如 src/models/my-model.js,那么框架可能需要自己的 my-model 模块。该框架是 Web 应用程序的依赖项,只需要知道关系的名称(即 "todos")即可请求模型(即 src/models/todo.js

我已经尝试在我的网络应用程序 webpack 链中添加我的网络应用程序 src 目录 config.resolve.modules.add(path.resolve(__dirname, 'src')) 但它似乎不适用于依赖项的搜索路径(不确定)所以我的框架库仍然不能'在我的网络应用程序中找不到模块。

我也(绝望地)尝试将 require 从 Web 应用程序传递到依赖项,然后在我调用 var MyModel = this.thePassedInRequireFn("./models/" + modelName) 的依赖项代码中,但它出错了:

(`Uncaught Error: Cannot find module './models/my-model'
    at MyFramework.webpackEmptyContext

有人知道如何做到这一点吗?

如果解决方案可以独立于 webpack 的使用,那将是理想的,但 webpack 兼容性对我来说是最重要的。

这是使用 require.context() 的 webpack 特定答案。

https://webpack.js.org/guides/dependency-management/#require-context

在网络应用程序中创建一个需要的上下文。例如:

const requireModule = require.context('./models/', true);

然后将 requireModule 传递给您作为网络​​应用程序依赖项的框架。

如果您的 Web 应用程序在文件 ./models/todo-item.js 中有一个模型并且框架被赋予了模型名称 todoItem,框架可以只使用模型名称来要求它,如下所示:

let fileName = `./${kebabCase(modelName)}`;
let module = this.requireModule(fileName).default;