【发布时间】:2020-07-28 16:50:39
【问题描述】:
我有一个使用 lerna 的项目(monorepo,多个包)。很少有软件包是独立的应用程序。
我想要实现的是在少数包上使用别名来实现依赖注入。例如,我有别名 @package1/backendProvider/useCheckout 并且在我的独立应用程序的 webpack 中,我将其解析为 ../../API/REST/useCheckout 。因此,当我将后端提供程序更改为其他内容时,我只会在 webpack 中进行更改。
问题
当其他包(不是独立应用程序)使用此别名时会出现问题。例如:
目录结构如下:
Project
packageA
ComponentA
packageB
API
REST
useCheckout
standalone app
组件A在packageA中
useCheckout 在/API/REST/useCheckout 路径下的packageB 中
ComponentA 使用 useCheckout 和 import useCheckout from '@packageA/backendProvider/useCheckout 之类的别名
独立应用使用组件A
我得到的错误是Module not found: Can't resolve '@packageA/backendProvider/useCheckout
但是,当在独立应用程序(具有下面提供的配置的 webpack)中使用相同的别名时,它正在工作。问题仅发生在依赖项上。
可能的解决方案
我知道一种解决方案是使用 webpack 编译每个包 - 但这似乎并不友好。我认为可行的是告诉 webpack 将这些别名解析为目录路径,然后重新编译它。第一部分(解析别名)已完成。
当前代码
当我使用 NextJS 时,我的 webpack 配置如下所示:
webpack: (config, { buildId, dev, isServer, defaultLoaders }) => {
// Fixes npm packages that depend on `fs` module
config.node = {
fs: "empty"
};
const aliases = {
...
"@package1/backendProvider": "../../API/REST/"
};
Object.keys(aliases).forEach(alias => {
config.module.rules.push({
test: /\.(js|jsx)$/,
include: [path.resolve(__dirname, aliases[alias])],
use: [defaultLoaders.babel]
});
config.resolve.alias[alias] = path.resolve(__dirname, aliases[alias]);
});
return config;
}
【问题讨论】:
标签: javascript webpack babeljs next.js lerna