我用两个包创建了一个 lerna monorepo:一个 vanilla NestJS 应用程序和 CRA 生成的应用程序。这里我使用 craco 从 monorepo 导入其他包。
在 NestJS 包中,我有一个简单的类,我想在 react 应用程序中共享/使用它。它包含一个节点导入和一些方法:
import countries from 'i18n-iso-countries';
export class Cat {
constructor(private readonly name: string) {}
public get from() {
return countries.alpha2ToAlpha3('DE');
}
public makeSound() {
return 'Meow!';
}
}
在开发模式 ( ) 下运行 CRAyarn run start
可以正常工作。我可以创建很多猫并调用它们的方法。所以基本上 monorepo 设置是有效的。但是,如果我yarn run build
在 CRA 中运行,我会收到此错误:Attempted import error: 'i18n-iso-countries' does not contain a default export (imported as 'countries').
如果我删除 cat 类中的 i18n-iso-countries 导入,它构建得很好。我尝试了几种变体,例如命名导入import {alpha2ToAlpha3} from 'i18n-iso-countries'
和import * as countries from 'i18n-iso-countries'
. 在 CRA 中使用 yarn start 时它们都可以正常工作,但在创建生产版本时会失败。
我的 craco 配置。
const path = require("path");
const { getLoader, loaderByName } = require("@craco/craco");
const absolutePath = path.join(__dirname, "../backend");
http: module.exports = {
webpack: {
alias: {},
plugins: [],
configure: (webpackConfig, { env, paths }) => {
const { isFound, match } = getLoader(webpackConfig, loaderByName("babel-loader"));
if (isFound) {
const include = Array.isArray(match.loader.include)
? match.loader.include
: [match.loader.include];
match.loader.include = include.concat[absolutePath];
}
return webpackConfig;
},
},
};