前言
用 create-react-app
工具创建出来的 react 应用接入 qiankun
的说明create-react-app
工具创建出来的 react 应用使用 react-scripts
核心包进行 dev 和 build。react-scripts
工具是基于 webpack
打包工具的,将 webpack
的配置都封装到了包里面。如果想更改或新增 webpack 配置的话,有两种方式可供选择:
- 运行
npm run eject
命令,将react-scripts
包里对 webpack 的配置都拿出来进行修改和新增。 - 使用
react-app-rewired
和customize-cra
包扩展 webpack 配置。
导出生命周期
let root: any = null;
function render(props: any) {
const { container } = props;
root = ReactDOM.createRoot(
// 容器限制查找范围
container ? container.querySelector('#root') : document.getElementById('root') as HTMLElement
);
root.render(
<React.StrictMode>
<RouterProvider router={router}></RouterProvider>
</React.StrictMode>
);
}
if (!window.__POWERED_BY_QIANKUN__) {
render({});
}
// 导出生命周期
export async function bootstrap() {
console.log('[react16] react app bootstraped');
}
export async function mount(props: any) {
console.log('[react16] props from main framework', props);
render(props);
}
export async function unmount() {
root.unmount();
root = null;
}
配置路由 base
const router = createBrowserRouter([
{
path: "/",
element: <App />,
children: [
{
path: "contacts/:contactId",
element: <Contact />
}
]
}
], {
// 配置路由 base
basename: window.__POWERED_BY_QIANKUN__ ? '/app2' : '/'
});
配置 webpack
配置资源路径
qiankun 在加载子应用的资源的时候由于子应用资源是 /xx/x
这样的路径,会自动拼接主应用的域名导致资源加载 404。qiankun 有提供一个运行时的变量 window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__
,该值为加载的子应用的域名地址。修改打包工具的资源动态 base 即可。
在 src 目录新增 public-path.ts
// public-path.ts
if (window.__POWERED_BY_QIANKUN__) {
//@ts-ignore
__webpack_public_path__ = window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__;
}
export {}
安装工具包和修改script
安装修改 cra webpack 配置的工具包
npm i -D react-app-rewired customize-cra
创建
config-override.js
文件并进行如下配置: ```javascript const { name } = require(‘./package’); const { override, overrideDevServer } = require(“customize-cra”);
module.exports = {
webpack: override((config) => {
// 配置入口导出时挂载的全局变量的名字
config.output.library = ${name}-[name]
;
// 配置打包格式为 umd
config.output.libraryTarget = ‘umd’;
// webpack 5 需要把 jsonpFunction 替换成 chunkLoadingGlobal
config.output.chunkLoadingGlobal = webpackJsonp_${name}
;
// 配置全局变量为浏览器的 window
config.output.globalObject = ‘window’;
return config;
}),
devServer: overrideDevServer((config) => ({
...config,
headers: {
// 配置允许跨越
"Access-Control-Allow-Origin": "*",
},
})),
}
3. 修改 `package.json`
```json
{
"scripts": {
"start": "react-app-rewired start",
"build": "react-app-rewired build",
"test": "react-scripts test",
"eject": "react-scripts eject"
}
}