qiankun & @umijs/plugin-qiankun實(shí)戰(zhàn)

qiankun 是一個(gè)基于 single-spa微前端實(shí)現(xiàn)庫(kù)
umi 插件,提供了 @umijs/plugin-qiankun 供 umi 應(yīng)用一鍵切換成微前端架構(gòu)系統(tǒng)。

搭建主應(yīng)用

yarn create umi
yarn add @umijs/plugin-qiankun -D

注冊(cè)qiankun

config.js 添加qiankun配置項(xiàng)

qiankun: {
    master: {
      // 注冊(cè)子應(yīng)用信息
      apps: [
        {
          name: 'app1', // 唯一 id
          entry: '//localhost:8081', // html entry
        },
      ],
    //   jsSandbox: true, // 是否啟用 js 沙箱,默認(rèn)為 false
    //   prefetch: true, // 是否啟用 prefetch 特性,默認(rèn)為 true
    },
  },
引用子應(yīng)用
  • 使用路由的方式
    config.js 的 router 配置中添加
{
  name: 'app1',
  path: '/app1',
  microApp: 'app1', // 對(duì)應(yīng)上一步注冊(cè)中的name
},
  • 使用組件的方式
    在組件中
import { MicroApp } from 'umi';
export function MyPage() {
  
  return (
    <div>
      <div>
        <MicroApp name="app1" /> 
      </div>
    </div>
  )
}

搭建子應(yīng)用

yarn create umi
yarn add @umijs/plugin-qiankun -D

注冊(cè)qiankun

config.js 添加qiankun配置項(xiàng)

  qiankun: {
    slave: {}
  }

注冊(cè)鉤子 src/app.ts

export const qiankun = {
    // 應(yīng)用加載之前
    async bootstrap(props) {
      console.log('app1 bootstrap', props);
    },
    // 應(yīng)用 render 之前觸發(fā)
    async mount(props) {
      console.log('app1 mount', props);
    },
    // 應(yīng)用卸載之后觸發(fā)
    async unmount(props) {
      console.log('app1 unmount', props);
    },
  };

排坑

在config.js 中注冊(cè)qiankun后運(yùn)行項(xiàng)目,觀察到react項(xiàng)目被渲染到了id為root-master/root-slave 的DOM節(jié)點(diǎn),而非antdpro默認(rèn)的id為root的DOM節(jié)點(diǎn),然而在最新版本的antdpro中,#root節(jié)點(diǎn)已經(jīng)被寫了一些預(yù)設(shè)樣式,如height:100% ,會(huì)將開啟qiankun后的真正的應(yīng)用試圖“擠”到視窗下方,影響體驗(yàn)。


DOM結(jié)構(gòu)

所以需要將相關(guān)的預(yù)設(shè)樣式清除,需要調(diào)整的地方有src/document.ejs,src/global.less

然后便可以繼續(xù)愉快的玩耍了。

通信

主項(xiàng)目
  • 使用路由方式引用的

主項(xiàng)目新建 src/app.ts

// src/app.ts
export function useQiankunStateForSlave() {
  const [masterState, setMasterState] = useState({});
 
  return {
    masterState,
    setMasterState,
  }
}

其中state的值可以自己定義。但是,由于app.ts 沒有在<Provider> 內(nèi)部,所以無(wú)法通過(guò)useSelector和useDispatch來(lái)獲取主應(yīng)用model中的值和dispatch方法。

  • 使用組件方式引用的

通過(guò)props傳值

function MyPage() {
  const [name, setName] = useState(null);
  return <MicroApp name={name} onNameChange={newName => setName(newName)} />
}
子項(xiàng)目
import { connectMaster } from 'umi';
function MyPage(props) {
  return <div>{ JSON.strigify(props) }</div>;
}
export default connectMaster(MyPage);

思考

  • 在實(shí)際業(yè)務(wù)中,子項(xiàng)目承擔(dān)什么角色? 一整套應(yīng)用 or 僅展示層?
  • 基礎(chǔ)配置如何共享(如鑒權(quán)/用戶信息)

for umi2

使用上個(gè)版本的qiankun插件
https://github.com/umijs/umi-plugin-qiankun

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容