日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
5個(gè)步驟將隨機(jī)React應(yīng)用程序轉(zhuǎn)換為微前端

什么是微型前端方法?微前端術(shù)語(yǔ)首先在2016年11月的思想技術(shù)雷達(dá)中提出來(lái)。它將微服務(wù)的概念擴(kuò)展到前端開(kāi)發(fā)。

創(chuàng)新互聯(lián)建站自成立以來(lái),一直致力于為企業(yè)提供從網(wǎng)站策劃、網(wǎng)站設(shè)計(jì)、成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)、電子商務(wù)、網(wǎng)站推廣、網(wǎng)站優(yōu)化到為企業(yè)提供個(gè)性化軟件開(kāi)發(fā)等基于互聯(lián)網(wǎng)的全面整合營(yíng)銷(xiāo)服務(wù)。公司擁有豐富的網(wǎng)站建設(shè)和互聯(lián)網(wǎng)應(yīng)用系統(tǒng)開(kāi)發(fā)管理經(jīng)驗(yàn)、成熟的應(yīng)用系統(tǒng)解決方案、優(yōu)秀的網(wǎng)站開(kāi)發(fā)工程師團(tuán)隊(duì)及專(zhuān)業(yè)的網(wǎng)站設(shè)計(jì)師團(tuán)隊(duì)。

該方法是通過(guò)分解應(yīng)用功能來(lái)將基于瀏覽器的代碼拆分為微前端。通過(guò)制作較小且特征為中心的CodeBases,我們實(shí)現(xiàn)了解耦的軟件開(kāi)發(fā)目標(biāo)。

雖然Codebases已經(jīng)解耦,但用戶(hù)體驗(yàn)是連貫的。此外,每個(gè)代碼庫(kù)都可以獨(dú)立實(shí)現(xiàn),升級(jí),更新和部署。

這是微前端的天堂。無(wú)論框架和版本如何,javascript應(yīng)用程序都由容器啟動(dòng)。這些應(yīng)用程序,遺留和新的,無(wú)縫地一起工作,并類(lèi)似于一個(gè)應(yīng)用程序。

在我們的示例中,我們將解決更簡(jiǎn)單的React微型前端的情況。

在建立發(fā)起React應(yīng)用程序的微型前端容器的前程工作

此容器需要具有啟動(dòng)隨機(jī)反應(yīng)應(yīng)用程序的能力,而不知道許多細(xì)節(jié)。此外,由于微前端的概念,這層需要很薄,商業(yè)邏輯很少。

幸運(yùn)的是,Cam Jackson公布了他的微觀前端工作,讓我們采用。他的工作在這個(gè)地點(diǎn)可以獲得:

  • 容器:微前端演示的入口點(diǎn)和容器應(yīng)用。
  • 用于瀏覽餐館的微型前端:瀏覽。
  • 從餐廳訂購(gòu)食物的微型前端:餐廳訂購(gòu)。
  • 內(nèi)容服務(wù)器:將靜態(tài)內(nèi)容存儲(chǔ)微前端演示的位置。

這是微型前端工作的工作流程:

  • 啟動(dòng)內(nèi)容服務(wù)器。
  • 在特定端口啟動(dòng)瀏覽和餐廳訂購(gòu)應(yīng)用程序。
  • 基于URL,容器將路線到其中一個(gè)微型前端。
  • 所選的Micro前端轉(zhuǎn)到特定端口以獲取應(yīng)用程序的資產(chǎn)清單.JSON。從此JSON文件中,包含的main.js置于腳本標(biāo)記并加載。

清單文件包含對(duì)其相應(yīng)的輸出文件的所有資產(chǎn)文件名的映射,以便在不必解析index.html的情況下可以選擇它。該容器的核心是以下Microfrontend.js:

 
 
 
 
  1. import React from 'react';
  2. class MicroFrontend extends React.Component {
  3.   componentDidMount() {
  4.     const { name, host, document } = this.props;
  5.     const scriptId = `micro-frontend-script-${name}`;
  6.     if (document.getElementById(scriptId)) {
  7.       this.renderMicroFrontend();
  8.       return;
  9.     }
  10.     fetch(`${host}/asset-manifest.json`)
  11.       .then(res => res.json())
  12.       .then(manifest => {
  13.         const script = document.createElement('script');
  14.         script.id = scriptId;
  15.         script.crossOrigin = '';
  16.         script.src = `${host}${manifest['main.js']}`;
  17.         script.onload = this.renderMicroFrontend;
  18.         document.head.appendChild(script);
  19.       });
  20.   }
  21.   componentWillUnmount() {
  22.     const { name, window } = this.props;
  23.     window[`unmount${name}`](`${name}-container`);
  24.   }
  25.   renderMicroFrontend = () => {
  26.     const { name, window, history } = this.props;
  27.     window[`render${name}`](`${name}-container`, history);
  28.   };
  29.   render() {
  30.     return ;
  31.   }
  32. }
  33. MicroFrontend.defaultProps = {
  34.   document,
  35.   window,
  36. };
  37. export default MicroFrontend;

第13到22行包含要啟動(dòng)微型前端的代碼。通常,微前端之間沒(méi)有通信,并且容器與微前端之間的通信有限。

通常,它是從容器到微前端的一種方式。在這里,第34行通過(guò)ContainerID和歷史,因?yàn)樗奈⑶岸舜尸F(xiàn)如下:

 
 
 
 
  1. ReactDOM.render(
  2.     document.getElementById(containerId));

第18行將腳本的Crondorigin值設(shè)置為空,這相當(dāng)于匿名。這意味著元素的請(qǐng)求將使其模式設(shè)置為CORS及其憑據(jù)模式設(shè)置為相同原點(diǎn)。

我們?cè)趯?shí)際代碼中修改了Came的示例。無(wú)論如何,這是我們使用的基礎(chǔ)。基于此,我們可以向您展示如何將應(yīng)用程序轉(zhuǎn)換為微前端。

5個(gè)步驟將隨機(jī)反應(yīng)應(yīng)用程序轉(zhuǎn)換為微前端

我們?yōu)殡S機(jī)反應(yīng)應(yīng)用程序的選擇是創(chuàng)建React應(yīng)用程序。將其變成微前端需要五個(gè)步驟。

關(guān)于Facebook的皇冠珠寶應(yīng)用程序的許多原則都在創(chuàng)建React應(yīng)用程序的10個(gè)有趣的事實(shí)中描述。在本文中,我們強(qiáng)調(diào)應(yīng)用這些原則。

第1步:修改package.json以設(shè)置端口并使用“React-App-Rewifire”

 
 
 
 
  1. {
  2.   "name": "my-app",
  3.   "version": "0.1.0",
  4.   "private": true,
  5.   "dependencies": {
  6.     "@testing-library/jest-dom": "^4.2.4",
  7.     "@testing-library/react": "^9.4.0",
  8.     "@testing-library/user-event": "^7.2.1",
  9.     "react": "^16.12.0",
  10.     "react-dom": "^16.12.0",
  11.     "react-scripts": "3.4.0",
  12.     "react-app-rewired": "2.1.5"
  13.   },
  14.   "scripts": {
  15.     "start": "PORT=4000 react-app-rewired start",
  16.     "build": "react-app-rewired build",
  17.     "test": "react-app-rewired test",
  18.     "eject": "react-scripts eject"
  19.   },
  20.   "eslintConfig": {
  21.     "extends": "react-app"
  22.   },
  23.   "browserslist": {
  24.     "production": [
  25.       ">0.2%",
  26.       "not dead",
  27.       "not op_mini all"
  28.     ],
  29.     "development": [
  30.       "last 1 chrome version",
  31.       "last 1 firefox version",
  32.       "last 1 safari version"
  33.     ]
  34.   }
  35. }
  • 在第12行中,添加react-app-rewired作為依賴(lài)項(xiàng),這允許在不彈出它的情況下自定義應(yīng)用程序。
  • 在第15行中,應(yīng)用程序的啟動(dòng)端口已從默認(rèn)端口3000更改為所選的4000 - 這避免了由于容器本身在端口3000上運(yùn)行以來(lái)端口沖突。
  • 從15號(hào)線到第17行,反應(yīng)腳本由Reft-App-Rewifired替換。

使用新端口,創(chuàng)建React應(yīng)用程序顯示UI如下所示。(我們欺騙了一點(diǎn)。使用React-App-Rewired需要在應(yīng)用程序運(yùn)行之前更改步驟2。)

步驟2:使用config-overrides.js禁用代碼拆分

默認(rèn)情況下,啟用代碼拆分。應(yīng)用程序分為多個(gè)可以獨(dú)立加載到頁(yè)面上的塊。

http:// localhost:4000 / asset-manifest.json 顯然顯示該應(yīng)用程序已被捆綁。

此加載優(yōu)化會(huì)導(dǎo)致掛載和卸載Micro Front-Ender的問(wèn)題。我們需要通過(guò)創(chuàng)建或編輯config-overrides.js來(lái)禁用塊,如下所示:

 
 
 
 
  1. module.exports = {
  2.   webpack: (config, env) => {
  3.     config.optimization.runtimeChunk = false;
  4.     config.optimization.splitChunks = {
  5.       cacheGroups: {
  6.         default: false,
  7.       },
  8.     };
  9.     return config;
  10.   },
  11. };

之后,http:// localhost:4000 / asset-manifest.json顯示沒(méi)有塊。

如果未從Create React應(yīng)用程序生成React應(yīng)用程序,則可以通過(guò)修改WebPack配置來(lái)完成步驟1和步驟2。

如果使用我們的改進(jìn)的MicroFrontend.js,則不必在步驟1中使用React-App-Rewifirew,并且可以完全跳過(guò)步驟2。5步減少到3.5。詳細(xì)信息描述于“您不必對(duì)微前端丟失優(yōu)化”中。

此保存在此回購(gòu)的ChunkOptimization分支中捕獲。

第3步:在SRC / index.js中進(jìn)行更改以定義渲染和卸載功能

讓我們來(lái)看看瀏覽Micro前端的SRC / index.js:

 
 
 
 
  1. import 'react-app-polyfill/ie11';
  2. import React from 'react';
  3. import ReactDOM from 'react-dom';
  4. import App from './App';
  5. import { unregister } from './registerServiceWorker';
  6. window.renderBrowse = (containerId, history) => {
  7.   ReactDOM.render(
  8.     ,
  9.     document.getElementById(containerId),
  10.   );
  11.   unregister();
  12. };
  13. window.unmountBrowse = containerId => {
  14.   ReactDOM.unmountComponentAtNode(document.getElementById(containerId));
  15. };

window.RenderBrowse和window.unmountBrowse定義。這些方法由容器的Microfrontend.js調(diào)用。需要為Create React應(yīng)用程序的SRC / index.js 定義類(lèi)似的方法。

 
 
 
 
  1. import React from 'react';
  2. import ReactDOM from 'react-dom';
  3. import './index.css';
  4. import App from './App';
  5. import * as serviceWorker from './serviceWorker';
  6. // render micro frontend function
  7. window.renderCreatereactapp = (containerId, history) => {
  8.   ReactDOM.render(
  9.     ,
  10.     document.getElementById(containerId)
  11.   );
  12.   serviceWorker.unregister();
  13. };
  14. // unmount micro frontend function
  15. window.unmountCreatereactapp = containerId => {
  16.   ReactDOM.unmountComponentAtNode(document.getElementById(containerId));
  17. };
  18. // Mount to root if it is not a micro frontend
  19. if (!document.getElementById('Createreactapp-container')) {
  20.   ReactDOM.render(, document.getElementById('root'));
  21. }
  22. // If you want your app to work offline and load faster, you can change
  23. // unregister() to register() below. Note this comes with some pitfalls.
  24. // Learn more about service workers: https://bit.ly/CRA-PWA
  25. serviceWorker.unregister();

從第7行到第19行,窗口.RenderCreateActApp和Window.unmountCreaterActApp正在添加。

第23線變?yōu)闂l件。如果它是一個(gè)獨(dú)立的應(yīng)用程序,它將被呈現(xiàn)為根元素。如果它是一個(gè)微型前端,它將通過(guò)window.rendercreateActapp呈現(xiàn)給ContainID。

第4步:使用src / setupproxy.js設(shè)置CORS規(guī)則

在Web瀏覽器中啟動(dòng)Micro前端時(shí),我們獲得了CORS錯(cuò)誤:

 
 
 
 
  1. Access to fetch at ‘http://localhost:4000/asset-manifest.json' from origin ‘http://localhost:3000' has been blocked by CORS policy: No ‘Access-Control-Allow-Origin’ header is present on the requested resource. If an opaque response serves your needs, set the request’s mode to ‘no-cors’ to fetch the resource with CORS disabled.

必須通過(guò)創(chuàng)建或編輯src / setupproxy.js來(lái)設(shè)置以下代理。

 
 
 
 
  1. module.exports = app => {
  2.   app.use((req, res, next) => {
  3.     res.header('Access-Control-Allow-Origin', '*');
  4.     next();
  5.   });
  6. };

在進(jìn)行第5步之前,我們?yōu)槿萜髯隽艘恍╊~外的工作。

在.env文件中,需要添加新的Host

React_App_CreateActApp_Host。端口4000需要匹配創(chuàng)建React App正在運(yùn)行的Real Port。

 
 
 
 
  1. REACT_APP_BROWSE_HOST=http://localhost:3001
  2. REACT_APP_RESTAURANT_HOST=http://localhost:3002
  3. REACT_APP_CREATEREACTAPP_HOST=http://localhost:4000
  4. REACT_APP_CONTENT_HOST=http://localhost:5000

需要對(duì).env.生產(chǎn)需要做類(lèi)似的變化:

 
 
 
 
  1. REACT_APP_BROWSE_HOST=https://browse.demo.microfrontends.com
  2. REACT_APP_RESTAURANT_HOST=https://order.demo.microfrontends.com
  3. REACT_APP_CREATEREACTAPP_HOST=https://createreactapp.demo.microfrontends.com
  4. REACT_APP_CONTENT_HOST=https://content.demo.microfrontends.com

在App Header.is中添加導(dǎo)航鏈接,以使UI可訪問(wèn)。這是可選的。

 
 
 
 
  1. import React from 'react';
  2. import { NavLink } from 'react-router-dom';
  3. import './AppHeader.css';
  4. const AppHeader = () => (
  5.   
  6.     
  7.       

     Feed me

  8.     
  •     
  •       
  •         
  •           Browse restaurants
  •         
  •         
  •           Surprise me
  •         
  •         
  •           Create React App
  •         
  •         
  •           About
  •         
  •       
  •     
  •   
  • );
  • export default AppHeader;
  • 將CreateAteActApp及其路由添加到Container的App.js中:

     
     
     
     
    1. import React from 'react';
    2. import { BrowserRouter, Switch, Route, Redirect } from 'react-router-dom';
    3. import AppHeader from './AppHeader';
    4. import MicroFrontend from './MicroFrontend';
    5. import About from './About';
    6. const {
    7.   REACT_APP_BROWSE_HOST: browseHost,
    8.   REACT_APP_RESTAURANT_HOST: restaurantHost,
    9.   REACT_APP_CREATEREACTAPP_HOST: createreactappHost,
    10. } = process.env;
    11. let numRestaurants = 0;
    12. fetch(`${process.env.REACT_APP_CONTENT_HOST}/restaurants.json`)
    13.   .then(res => res.json())
    14.   .then(restaurants => {
    15.     numRestaurants = restaurants.length;
    16.   });
    17. const getRandomRestaurantId = () =>
    18.   Math.floor(Math.random() * numRestaurants) + 1;
    19. const Browse = ({ history }) => (
    20.   
    21. );
    22. const Restaurant = ({ history }) => (
    23.   
    24. );
    25. const Createreactapp = ({ history }) => (
    26.   
    27. );
    28. const Random = () => ;
    29. const App = () => (
    30.   
    31.     
    32.       
    33.       
    34.         
    35.         
    36.         
    37.         
    38.         
    39.       
    40.     
    41.   
    42. );
    43. export default App;

    現(xiàn)在讓我們?cè)囍故疚覀兊奈⑿颓岸恕?/p>

    • 內(nèi)容服務(wù)器:NPM啟動(dòng)。
    • 瀏覽Micro前端:NPM開(kāi)始。
    • 餐廳訂購(gòu)微型前端:NPM開(kāi)始。
    • Create React App Micro前端:NPM開(kāi)始。
    • 容器:NPM開(kāi)始。

    轉(zhuǎn)到localhost:3000 / createActapp來(lái)啟動(dòng)頁(yè)面。

    哎呀,React spinning 日志在哪里?

    讓我們重新審視http:// localhost:4000 / asset-manifest.json。Micro前端的徽標(biāo)是一個(gè)單獨(dú)的文件:

     
     
     
     
    1. {
    2.   "files": {
    3.     "main.js": "/static/js/bundle.js",
    4.     "main.js.map": "/static/js/bundle.js.map",
    5.     "index.html": "/index.html",
    6.     "static/media/logo.svg": "/static/media/logo.5d5d9eef.svg"
    7.   },
    8.   "entrypoints": [
    9.     "static/js/bundle.js"
    10.   ]
    11. }

    我們忘了抓住它!

    查看此徽標(biāo)SVG文件的來(lái)源,該文件被設(shè)置為/static/media/logo.5d5d9eef.svg。此文件可在Create React App(HTTPS:// localhost:4000)中使用,但不在容器中(http:// localhost:3000)。

    這是我們的最后一步。

    步驟5:在.env文件中配置內(nèi)容主機(jī)并將其用來(lái)前綴靜態(tài)內(nèi)容

    創(chuàng)建或編輯.env以設(shè)置內(nèi)容主機(jī):

     
     
     
     
    1. REACT_APP_CONTENT_HOST=http://localhost:4000

    當(dāng)Micro前端使用靜態(tài)內(nèi)容時(shí),它需要在HTML中的%React_App_Content_host%前綴,并在JavaScript中的

    Process.env.reacect_app_content_host。

    在這里,我們?cè)趕rc / app.js中更改了第9行:

     
     
     
     
    1. import React from 'react';
    2. import logo from './logo.svg';
    3. import './App.css';
    4. function App() {
    5.   return (
    6.     
    7.       
    8.         
    9.         

    10.           Edit src/App.js and save to reload.
    11.         

    12.         
    13.           className="App-link"
    14.           
    15.           target="_blank"
    16.           rel="noopener noreferrer"
    17.         >
    18.           Learn React
    19.         
    20.       
    21.     
  •   );
  • }
  • export default App;
  • 使用此更改,徽標(biāo)SVG文件以http:// localhost:4000前綴。

    該應(yīng)用程序現(xiàn)在正常工作。


    網(wǎng)站名稱(chēng):5個(gè)步驟將隨機(jī)React應(yīng)用程序轉(zhuǎn)換為微前端
    文章起源:http://www.dlmjj.cn/article/coocgog.html