前言
用 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 />}]}], {// 配置路由 basebasename: window.__POWERED_BY_QIANKUN__ ? '/app2' : '/'});
配置 webpack
配置资源路径
qiankun 在加载子应用的资源的时候由于子应用资源是 /xx/x这样的路径,会自动拼接主应用的域名导致资源加载 404。qiankun 有提供一个运行时的变量 window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__,该值为加载的子应用的域名地址。修改打包工具的资源动态 base 即可。
在 src 目录新增 public-path.ts
// public-path.tsif (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"}}
