成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

微前端qiankun安裝使用

社區(qū)管理員 / 1834人閱讀

一、前言

大型中后臺項(xiàng)目一般包括10個(gè)以上的子項(xiàng)目,如果維護(hù)在一個(gè)單頁面應(yīng)用中,項(xiàng)目就會越來越大,而且不利于版本的迭代,微前端就很好的解決了這些問題。

這篇文章主要來體驗(yàn)下螞蟻的微前端:qiankun,雖然比較成熟了,但在體驗(yàn)過程中還是有一些問題,記錄總結(jié)下,項(xiàng)目代碼

實(shí)踐項(xiàng)目以react單頁面應(yīng)用為主應(yīng)用,然后構(gòu)建了三個(gè)微應(yīng)用:react、vue3、node靜態(tài)頁面

二、前期準(zhǔn)備

微前端要求多個(gè)前端服務(wù),所以我們先準(zhǔn)備幾個(gè)應(yīng)用,使用不同的技術(shù)棧,體驗(yàn)微前端的強(qiáng)大

1、項(xiàng)目架構(gòu)

mirco-front-demo作為整個(gè)服務(wù)的根目錄,為了便于實(shí)踐,主應(yīng)用和微應(yīng)用將放在一起。

主應(yīng)用:

  • my-app

    • port: 10000

    • create-react-app

微應(yīng)用:

  • micro-reat-1

    • port: 10100

    • create-react-app

  • micro-vue-2

    • port: 10200

    • vue3

  • micro-static-3

    • port: 10300

    • node + html

2、主應(yīng)用my-app

需要提前安裝create-react-app:sudo npx install create-react-app

通過create-react-app創(chuàng)建主應(yīng)用my-app,其他的微應(yīng)用都會掛載到主應(yīng)用。

# 在根目錄 mkdir mirco-front-demo cd mirco-front-demo # 新建主應(yīng)用my-app npx create-react-app my-app cd my-app # 通過.env文件修改啟動端口 echo "PORT=10000" > .env yarn start 復(fù)制代碼

3、微應(yīng)用micro-react-1

cd micro-front-demo npx create-react-app micro-react-1 復(fù)制代碼

同主應(yīng)用一樣創(chuàng)建一個(gè)React應(yīng)用,命名micro-react-1,并修改啟動端口號(也可以使用.env文件修改)

修改啟動端口號:

{     "scripts": {         "start": "PORT=10100 react-app-rewired start",         "build": "react-app-rewired build",         "test": "react-app-rewired test",         "eject": "react-app-rewired eject"     } } 復(fù)制代碼

4、微應(yīng)用micro-vue-2

使用vue3.0,提前安裝vue-cli:yarn global add @vue/cli,官方文檔

vue create micro-vue-2 cd micro-vue-2 touch vue.config.js 復(fù)制代碼

除了微應(yīng)用1和微應(yīng)用2修改啟動端口號的方法,這里也可以對webpack進(jìn)行覆蓋

vue-config.js

const { defineConfig } = require('@vue/cli-service') module.exports = defineConfig({   transpileDependencies: true,   devServer: {     // 監(jiān)聽端口     port: 10200,     // 配置跨域請求頭,解決開發(fā)環(huán)境的跨域問題     headers: {       "Access-Control-Allow-Origin": "*",     }   } } 復(fù)制代碼

啟動微應(yīng)用yarn serve

5、微應(yīng)用micro-static-3

# 新建微應(yīng)用項(xiàng)目3 mkdir micro-static-3 cd micro-static-3 npm init yarn add express cors # 新建項(xiàng)目文件 mkdir static touch index.js cd static touch index.html 復(fù)制代碼

index.js

const express = require('express') const cors = require('cors') const app = express() const port = 10300 app.use(cors()) app.use(express.static('static')); app.listen(port, () => {   console.log(`Example app listening on port ${port}`) }) 復(fù)制代碼

啟動微應(yīng)用node index.js

6、同時(shí)啟動微應(yīng)用

cd mirco-front-demo npm init yarn add npm-run-all -D 復(fù)制代碼

修改當(dāng)前目錄下package.json

{     "scripts": {         "test": "echo \"Error: no test specified\" && exit 1",         "start": "npm-run-all --parallel start:*",         "start:main": "cd my-app && yarn start",         "start:micro-react": "cd micro-react-1 && yarn start",         "start:micro-vue": "cd micro-vue-2 && yarn serve",         "start:micro-static": "cd micro-static-3 && node index.js"     } } 復(fù)制代碼

執(zhí)行命令

cd micro-front-demo yarn start 復(fù)制代碼

這樣就同時(shí)啟動了四個(gè)前端服務(wù)

三、配置qiankun

1、主應(yīng)用路由和樣式

改造下主應(yīng)用樣式,整個(gè)頂部導(dǎo)航欄和側(cè)邊欄屬于主應(yīng)用,而中間空白的部分可以展示主應(yīng)用或子應(yīng)用的頁面。

主應(yīng)用路由安裝react-router-dom,通過history模式渲染。

image.png

在側(cè)邊欄點(diǎn)擊不同的鏈接會加載不同的子應(yīng)用,樣式和路由具體可以看示例代碼

2、注冊微應(yīng)用

修改單頁面應(yīng)用渲染根節(jié)點(diǎn)rootmain-root,防止和微應(yīng)用中渲染節(jié)點(diǎn)沖突。

image.png

并且增加一個(gè)通過id標(biāo)記的DIV,用來嵌入微應(yīng)用,接著引入qiankun,這里id=subApp用來掛載微應(yīng)用

yarn add qiankun  復(fù)制代碼

image.png

src/index.js中配置

import React from 'react'; import ReactDOM from 'react-dom'; import { registerMicroApps, start } from 'qiankun'; import './index.css'; import App from './App'; function render(){   ReactDOM.render(<App />, document.querySelector('#main-root')); } render({}); registerMicroApps([   {     name: 'react', // app name registered     entry: '//localhost:10100',     container: "#subApp",     activeRule: '/react'   },   {     name: 'vue', // app name registered     entry: '//localhost:10200',     container: "#subApp",     activeRule: '/vue'   },   {     name: 'static', // app name registered     entry: '//localhost:10300',     container: "#subApp",     activeRule: '/static'   } ], {   beforeLoad: app => {     console.log('before load app.name=====>>>>>', app.name)   },   beforeMount: [     app => {       console.log('[LifeCycle] before mount %c%s', 'color: green;', app.name)     }   ],   afterMount: [     app => {       console.log('[LifeCycle] after mount %c%s', 'color: green;', app.name)     }   ],   afterUnmount: [     app => {       console.log('[LifeCycle] after unmount %c%s', 'color: green;', app.name)     }   ] }) start() 復(fù)制代碼

3、微應(yīng)用配置

1) micro-react-1

引入react-router-dom給微應(yīng)用配置路由,展示不同的頁面,如下:

image.png

修改src/index.js下啟動文件

function render(props) {   const { container } = props;   ReactDOM.render(<App />, container ? container.querySelector('#root') : document.querySelector('#root')); } if (!window.__POWERED_BY_QIANKUN__) {   render({}); } export async function bootstrap() {   console.log('[react16] react app bootstraped'); } export async function mount(props) {   console.log('[react16] props from main framework', props);   render(props); } export async function unmount(props) {   const { container } = props;   ReactDOM.unmountComponentAtNode(container ? container.querySelector('#root') : document.querySelector('#root')); } 復(fù)制代碼

給微應(yīng)用添加導(dǎo)出聲明周期函數(shù),微應(yīng)用掛載成功時(shí),渲染到當(dāng)前應(yīng)用的root節(jié)點(diǎn)。

當(dāng)前cra并沒有釋放webpack配置,所以要通過插件覆蓋配置:

yarn add react-app-rewired -D 復(fù)制代碼

"scripts": {     "start": "PORT=10100 react-app-rewired start",     "build": "react-app-rewired build",     "test": "react-app-rewired test",     "eject": "react-app-rewired eject" } 復(fù)制代碼

在當(dāng)前微應(yīng)用根目錄下touch config-overrides.js

const { name } = require('./package'); module.exports = {     webpack: (config, env) => {         config.output.library = `${name}-[name]`;         config.output.libraryTarget = 'umd';         config.output.globalObject = 'window';         config.output.chunkLoadingGlobal = `webpackJsonp_${name}`;         return config;     },     devServer: (_) => {         const config = _;         config.headers = {           'Access-Control-Allow-Origin': '*',         };         config.historyApiFallback = true;         config.hot = false;         config.watchContentBase = false;         config.liveReload = false;         config.injectClient = false         return config;     } } 復(fù)制代碼

啟動微應(yīng)用yarn start,正常運(yùn)行

2) micro-vue-2

新增 public-path.js 文件,用于修改運(yùn)行時(shí)的 publicPath

src/public-path.js

if (window.__POWERED_BY_QIANKUN__) {     __webpack_public_path__ = window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__; } 復(fù)制代碼

引入vue路由,設(shè)置成history模式,baseRouter設(shè)置成vue,導(dǎo)出聲明周期函數(shù)

import { createApp } from 'vue' import App from './App.vue' import router from './router' import './public-path' const app = createApp(App); function render(props) {   const { container } = props;   app.use(router)   .mount(container ? container.querySelector('#app') : '#app') } export async function bootstrap() {     console.log('bootstrap'); } export async function mount(props) {     console.log('mount', props);     render(props); } export async function unmount() {     console.log('unmount');     app.unmount(); } 復(fù)制代碼

修改webpack配置vue.config.js

module.exports = defineConfig({     configureWebpack: {         output: {           // 微應(yīng)用的包名,這里與主應(yīng)用中注冊的微應(yīng)用名稱一致           library: name,           // 將你的 library 暴露為所有的模塊定義下都可運(yùn)行的方式           libraryTarget: "umd",           // 按需加載相關(guān),設(shè)置為 webpackJsonp_微應(yīng)用名稱 即可           chunkLoadingGlobal: `webpackJsonp_${name}`,         }     } }) 復(fù)制代碼

啟動應(yīng)用yarn serve

3) micro-static-3

這是一個(gè)express服務(wù)啟動的靜態(tài)服務(wù)

文件入口導(dǎo)出聲明周期entry.js

const render = ($) => {     $('#app').html('Hello, render html, 一個(gè)通過http服務(wù)部署的靜態(tài)網(wǎng)站');     return Promise.resolve(); }; ((global) => {     global['static'] = {       bootstrap: () => {         console.log('purehtml bootstrap');         return Promise.resolve();       },       mount: () => {         console.log('purehtml mount');         return render($);       },       unmount: () => {         console.log('purehtml unmount');         return Promise.resolve();       },     }; })(window); 復(fù)制代碼

然后在模版文件導(dǎo)入

image.png

其實(shí)也是掛載在了app節(jié)點(diǎn)。

啟動當(dāng)前微服務(wù)node index.js

4、啟動所有應(yīng)用

cd micro-front-demo yarn start 復(fù)制代碼

四、報(bào)錯處理

1、報(bào)錯信息

'__webpack_public_path__' is not defined

Uncaught Error: single-spa minified message #20

覆蓋CRA的Webpack配置

const { name } = require('./package'); module.exports = {   webpack: (config) => {     config.output.library = `${name}-[name]`;     config.output.libraryTarget = 'umd';     config.output.jsonpFunction = `webpackJsonp_${name}`;     config.output.globalObject = 'window';     return config;   },   devServer: (_) => {     const config = _;     config.headers = {       'Access-Control-Allow-Origin': '*',     };     config.historyApiFallback = true;     config.hot = false;     config.watchContentBase = false;     config.liveReload = false;     return config;   }, }; 復(fù)制代碼

這里報(bào)錯,是因?yàn)槭莣ebpack5.x不兼容config.output.jsonpFunction的寫法,需要替換成config.output.chunkLoadingGlobal

2、報(bào)錯信息

construct.js:17 Uncaught Error: application 'react' died in status LOADING_SOURCE_CODE: [qiankun]: You need to export lifecycle functions in react entry

沒有將生命周期暴露出來,需要挨個(gè)檢查下面的配置

Invalid configuration object. Webpack has been initialized using a configuration object that does not match the API schema.  - configuration.output has an unknown property 'jsonpFunction'. These properties are valid:    object { assetModuleFilename?, asyncChunks?, auxiliaryComment?, charset?, chunkFilename?, chunkFormat?, chunkLoadTimeout?, chunkLoading?, chunkLoadingGlobal?, clean?, compareBeforeEmit?, crossOriginLoading?, cssChunkFilename?, cssFilename?, devtoolFallbackModuleFilenameTemplate?, devtoolModuleFilenameTemplate?, devtoolNamespace?, enabledChunkLoadingTypes?, enabledLibraryTypes?, enabledWasmLoadingTypes?, environment?, filename?, globalObject?, hashDigest?, hashDigestLength?, hashFunction?, hashSalt?, hotUpdateChunkFilename?, hotUpdateGlobal?, hotUpdateMainFilename?, iife?, importFunctionName?, importMetaName?, library?, libraryExport?, libraryTarget?, module?, path?, pathinfo?, publicPath?, scriptType?, sourceMapFilename?, sourcePrefix?, strictModuleErrorHandling?, strictModuleExceptionHandling?, trustedTypes?, umdNamedDefine?, uniqueName?, wasmLoading?, webassemblyModuleFilename?, workerChunkLoading?, workerWasmLoading? }    -> Options affecting the output of the compilation. `output` options tell webpack how to write the compiled files to disk.    Did you mean output.chunkLoadingGlobal (BREAKING CHANGE since webpack 5)?


作者:前端中后臺
鏈接:https://juejin.cn/post/7075607657205710855
來源:稀土掘金
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。


文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/127964.html

相關(guān)文章

  • 可能是你見過最完善的前端解決方案

    摘要:而從技術(shù)實(shí)現(xiàn)角度,微前端架構(gòu)解決方案大概分為兩類場景單實(shí)例即同一時(shí)刻,只有一個(gè)子應(yīng)用被展示,子應(yīng)用具備一個(gè)完整的應(yīng)用生命周期。為了解決產(chǎn)品研發(fā)之間各種耦合的問題,大部分企業(yè)也都會有自己的解決方案。 原文鏈接:https://zhuanlan.zhihu.com/p/... Techniques, strategies and recipes for building a modern ...

    Kahn 評論0 收藏0
  • 使用midi.js寫一個(gè)可視化鋼琴

    摘要:可視化鋼琴使用鋼琴音色播放文件,并且將按鍵可視化到鋼琴鍵盤上。如圖主界面鏈接在線 可視化鋼琴 使用鋼琴音色播放Midi文件,并且將按鍵可視化到鋼琴鍵盤上。如圖: 主界面: showImg(https://segmentfault.com/img/bVbmEzC?w=1920&h=943); github鏈接 https://github.com/qk44077907...在線demo ...

    graf 評論0 收藏0
  • [前端] H5頁檢測手機(jī)是否安裝app 相關(guān)流程

    摘要:近期公司需要針對分享流程進(jìn)行優(yōu)化,其中一點(diǎn)就是前端檢測是否安裝應(yīng)用,來進(jìn)行不同的判斷下載或直接跳轉(zhuǎn)到中。為回調(diào)函數(shù),根據(jù)返回來判斷是否安裝。 近期公司需要針對分享流程進(jìn)行優(yōu)化,其中一點(diǎn)就是前端H5檢測是否安裝應(yīng)用,來進(jìn)行不同的判斷(下載或直接跳轉(zhuǎn)到app中)。原理很簡單:創(chuàng)建一個(gè)iframe去打開uri。如果打開app成功網(wǎng)頁進(jìn)入后臺,再切換回來時(shí)間會超過2.5s。利用時(shí)間去檢測。下面...

    bawn 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<