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;
我正在编写一个框架包,我想让它能够自动从主项目 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;