Next.js 项目是需要单独配置的,且用的是
babel-plugin-injectcomponentcode1.x 版本, 其他项目 使用 2.x 版本 (2.x 版本使用glob模式,完成支持glob配置语法)
背景:使用
react-i18next对react项目进行国际化,每个组件都需要反复import react-i18next且在 组件内部使用 反复的写const { t } = useTranslation();现已有多语言高阶组件,但是高阶组件需要每个组件去 import,现在 使用自定义babel plugin对文件进行 AST 自动实现HOC, 降低开发者心智负担
- 如何使用
// npm i babel-plugin-injectcomponentcode -D
// babel.config.js
module.exports = {
...
plugins: [
...
[
['babel-plugin-injectcomponentcode', {
importComponentFilePath: "@/components/withWrapperCom",
importComponentName: "withWrapperCom",
isImportDefault: true,
globIgnorePath: "src/page/Home/index.tsx", // 这里完全支持 glob 语法
globMatchPath: ["src/modules/**/*.tsx"], // 这里完全支持 glob 语法
}]
]
]
}
-
本质上就是识别到文件路径,在编译阶段对文件进行
HOC行为,降低业务开发者 反复 import -
babel-plugin-injectcomponentcode有5个参数globIgnorePath: 需要被忽略的 path (完全适配glob语法规则)globMatchPath: 需要 被自动注入hoc 的 组件path (完全适配glob语法规则)importComponentFilePath: 需要导入的组件的地址importComponentName: import 组件的 nameisImportDefault: 是否默认导出
-
如果需要被包装的组件已经被准备
HOC的组件包装过,那么此 babel 插件将不再进行高阶
效果:
### 输入
import xx from 'xx'
const Demo = () => {}
export default Demo
### 输出
import PageWrapper from '@/components/withWrapperCom'
import xx from 'xx'
const Demo = () => {}
export default withWrapperCom(Demo)