[关闭]
@Dale-Lin 2022-03-09T19:50:38.000000Z 字数 2846 阅读 477

qiankun

微前端


使用方法

微应用

  1. /** 只在微应用初始化时调用一次,重新进入时会调用 mount */
  2. export const bootstrap = async () => {
  3. console.log('bootstraping')
  4. }
  5. /** 每次进入都会调用 mount 钩子,通常在这里渲染应用 */
  6. export const mount = async (props) => {
  7. ReactDOM.render(<App />, props.container)
  8. }
  9. /** 每次切出/卸载会调用的方法,通常在这里卸载应用实例 */
  10. export const unmount = async (props) => {
  11. ReactDOM.unmountComponentAtNode(props.container)
  12. }
  13. /** 仅当使用 loadMicroApp 方式加载微应用时生效 */
  14. export const update = async (props) => {
  15. console.log('update props')
  16. }
  1. // public-path.js
  2. if (window.__POWERED_BY_QIANKUN__) {
  3. __webpack_public_path__ = window.__INJECTED_PUBLIC_PATH_BY_QIANKUN
  4. }
  1. // index.ts
  2. import './public-path'
  3. // ......
  1. const pkgName = require('./package.json').name
  2. let publicPath = '/' // dev
  3. if (process.env === 'production') {
  4. publicPath = 'https://cdn.example.com/${pkgname}/'
  5. }
  6. module.exports = {
  7. output: {
  8. publicPath: publicPath,
  9. library: pkgName,
  10. libraryTarget: 'window',
  11. }
  12. }

主应用

  1. $ yarn add qiankun
  1. import { registerMicroApps, start } from 'qiankun'
  2. // 注册微应用
  3. // qiankun 会取 container 字段对应的 DOM 节点,传给微应用的 props.container
  4. registerMicroApp([
  5. {
  6. name: 'sizeChartService',
  7. entry: "https://cdn.example.com/app1/index.html",
  8. container: '#container',
  9. activeRule: '/sizeChart',
  10. props: {
  11. // 主应用传给微应用的数据
  12. }
  13. },
  14. {
  15. name: 'workflowService',
  16. entry: "https://cdn.example.com/app2/index.html",
  17. container: '#container',
  18. activeRule: '/workflow'
  19. }
  20. ], {
  21. // 微应用暴露的生命周期钩子
  22. beforeLoad: () => Promise<any>,
  23. beforeMount: () => Promise<any>,
  24. afterMount: () => Promise<any>,
  25. beforeUnmount: () => Promise<any>,
  26. afterUnmount: () => Promise<any>,
  27. })
  28. // 启动 qiankun,参数都可选
  29. start({
  30. // 是否开启沙箱模式
  31. sandbox: false,
  32. // 自定义 fetch 微应用资源的方法
  33. fetch: (entry) {
  34. // 请求资源带 timestamp 保证最新
  35. return window.fetch(
  36. `${entry}?timestamp=${Date.now()}`
  37. )
  38. }
  39. })

activeRule 可以是一个接受 loction 对象的函数,在例如主应用是 hash 路由时, 可以通过一个函数返回 true/false 的方式来动态控制:

  1. const getHashActiveRule = (activeHash) => (location) => location.hash.startsWith(activeHash)
  2. registerMicroApp([
  3. {
  4. name: 'hashApp',
  5. entry: 'https://cdn.example.com/hashApp/index.html',
  6. container: '#container',
  7. activeRule: getHashActiveRule('#/hashActivePrefix/hashApp')
  8. }
  9. ])

如果微应用同时在 hash 路由和 history 路由的容器环境使用,内部其实需要根据容器路由模式判断使用 <BrowserRouter><HashRouter>

  1. import { loadMicroApp } from 'qiankun'
  2. // ...
  3. const [microApp, setMicroApp] = useState(null)
  4. const container = useRef(null)
  5. useEffect({
  6. if (container.current) {
  7. const app = loadMicroApp({
  8. // 必选,微应用的唯一名称
  9. name: 'sizeChartService',
  10. // 必选,微应用入口资源
  11. entry: `https://cdn.example.com/microAppName/index.html?timestamp=${Date.now()}`,
  12. // 必选,容器节点选择器或是 DOM 节点的 ref.current
  13. container: containerRef.current,
  14. // 可选,传给微应用的属性
  15. props: {}
  16. }, {
  17. // configuration 同 qiankun.start
  18. // ...
  19. })
  20. setMicroApp(app)
  21. }
  22. }, [container])
  23. useEffect(() => () => {
  24. // 组件卸载时需要手动卸载微应用
  25. if (microApp) microApp.unmount()
  26. }, [microApp])

如果微应用暴露了 update 生命周期钩子,还可以在主应用调用 microApp.update({ ...props }) 更新。

在一个路由下需要渲染多个微应用时,就必须使用手动挂载方式

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注