摘要:前言微前端理論篇微前端項目上一篇中,我們完成了項目的搭建,算是完成了整個微前端架構的一半工程了。項目項目是作為頁面的菜單顯示的,主要用于路由的控制。源碼地址源碼地址項目源碼地址微前端理論篇微前端項目微前端項目
前言
????????微前端 —— 理論篇
????????微前端 —— portal項目
????????上一篇中,我們完成了portal項目的搭建,算是完成了整個微前端架構的一半工程了?,F在開始新建我們的業務小應用。
????????menu項目是作為頁面的菜單顯示的,主要用于路由的控制。
????????項目的結構如下:
????????接下來就開始實現它吧。
新建項目文件夾menu,在根目錄執行npm init -y
安裝相關依賴,由于react相關的幾個依賴已經在portal項目中抽離出來,因此我們這不需要安裝了。
???????? package.js文件內容如下:
{ "name": "menu", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo "Error: no test specified" && exit 1", "start": "webpack-dev-server --config ./webpack.dev.js --port 8235", "build": "webpack --config ./webpack.config.js -p" }, "keywords": [], "author": "", "license": "ISC", "dependencies": { "antd": "^3.20.7", "babel-plugin-import": "^1.12.0", "copy-webpack-plugin": "^5.0.4", "react-router": "4.3.1", "react-router-dom": "4.3.1", "single-spa-react": "2.8.1", "@reach/router": "1.2.1" }, "devDependencies": { "@babel/core": "7.0.0", "@babel/plugin-proposal-class-properties": "7.0.0", "@babel/plugin-proposal-decorators": "7.1.0", "@babel/plugin-proposal-object-rest-spread": "7.0.0", "@babel/plugin-syntax-dynamic-import": "^7.0.0", "@babel/preset-env": "7.0.0", "@babel/preset-react": "7.0.0", "autoprefixer": "9.1.5", "babel-core": "6.26.3", "babel-loader": "8.0.0", "clean-webpack-plugin": "0.1.19", "css-loader": "1.0.0", "postcss-loader": "3.0.0", "style-loader": "0.23.0", "webpack": "4.17.1", "webpack-cli": "3.1.0", "webpack-dev-server": "^3.1.14" } }
????????新建src文件夾,在src文件夾下創建components文件夾,在components文件夾中新建文件Menu.js,內容如下:
import React from "react" import {Menu, Icon} from "antd" import { Link } from "@reach/router" const MenuItem = Menu.Item export default class Menu_ extends React.Component { render () { return () } } const menuStyle = { display: "inline-block", position: "fixed", width: "300px", height: "100%" }menu!
????????現在我們已經實現了菜單的頁面代碼。在src目錄下新建文件root.component.js,引入導出Menu組件
import React from "react" import { BrowserRouter, Route, Switch, Redirect } from "react-router-dom" import Menu from "./components/Menu" export default class Root extends React.Component { state = { hasError: false } componentDidCatch (error, info) { this.setState({hasError: true}) } render () { return ( ) } }
????????在src目錄下新建文件set-public-path.js
// For lazy loading within an application to work you need to set webpack"s public path // basically webpack"s internal module system always looks for code-splits (modules) at the root export default function setPublicPath() { return Promise.all([getUrl()]).then(values => { const [url] = values const webpackPublicPath = url.slice(0, url.lastIndexOf("/") + 1) __webpack_public_path__ = webpackPublicPath return true }) } function getUrl () { return window.System.resolve("@portal/menu") }
????????在src目錄下新建文件menu.js,用于組件的注冊
import React from "react" import ReactDOM from "react-dom" import singleSpaReact from "single-spa-react" import { property } from "lodash" import setPublicPath from "./set-public-path.js" const reactLifecycles = singleSpaReact({ React, ReactDOM, loadRootComponent: () => import(/* webpackChunkName: "people-app" */"./root.component.js").then(property("default")), domElementGetter, }) export const bootstrap = [ () => { return setPublicPath() }, reactLifecycles.bootstrap, ] export const mount = [ reactLifecycles.mount, ] export const unmount = [ reactLifecycles.unmount, ] export const unload = [ reactLifecycles.unload, ] function domElementGetter() { let el = document.getElementById("menu"); if (!el) { el = document.createElement("div"); el.id = "menu"; document.body.appendChild(el); } return el; }
????????最后編寫webpack配置文件,在項目根目錄下創建文件webpack.config.js、webpack.dev.js
????????webpack.config.js
/* eslint-env node */ const webpack = require("webpack") const path = require("path"); const CleanWebpackPlugin = require("clean-webpack-plugin"); const CopyWebpackPlugin = require("copy-webpack-plugin"); module.exports = { entry: path.resolve(__dirname, "src/menu.js"), output: { filename: "menu.js", library: "menu", libraryTarget: "amd", path: path.resolve(__dirname, "build/menu"), }, mode: "production", module: { rules: [ {parser: {System: false}}, { test: /.js?$/, exclude: [path.resolve(__dirname, "node_modules")], loader: "babel-loader", }, { test: /.css$/, exclude: [path.resolve(__dirname, "node_modules")], use: [ "style-loader", { loader: "css-loader", options: { modules: true, localIdentName: "[path][name]__[local]", }, }, { loader: "postcss-loader", options: { plugins() { return [ require("autoprefixer") ]; }, }, }, ], }, { test: /.css$/, include: [path.resolve(__dirname, "node_modules")], exclude: [/.krem.css$/], use: ["style-loader", "css-loader"], }, ], }, resolve: { modules: [ __dirname, "node_modules", ], }, plugins: [ new CleanWebpackPlugin(["build/menu"]), new CopyWebpackPlugin([ {from: path.resolve(__dirname, "src/Menu.js")} ]), ], devtool: "source-map", externals: [ /^@portal/*/, /^lodash$/, /^single-spa$/, /^rxjs/?.*$/, /^react$/, /^react/lib.*/, /^react-dom$/, /.*react-dom.*/, ], };
????????公共依賴就別多帶帶打包了
????????webpack.dev.js
/* eslint-env node */ const config = require("./webpack.config.js"); const webpack = require("webpack"); config.plugins.push(new webpack.NamedModulesPlugin()); config.plugins.push(new webpack.HotModuleReplacementPlugin()); config.devServer = { headers: { "Access-Control-Allow-Origin": "*", }, } config.mode = "development" module.exports = config;
????????menu項目的源碼大概就這些
3.project1
????????project1項目也是通過react框架實現的,主要是實現了不同路由匹配不同頁面,最后運行打包的時候,暴露出一個js文件,共portal項目調用。詳細的就不闡述了,跟menu項目大同小異,也就只是頁面代碼不一樣。
????????menu源碼地址
????????project1源碼地址
????????項目源碼地址
????????微前端 —— 理論篇
????????微前端 —— portal項目
????????微前端 —— project2項目(VUE)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/106340.html
摘要:現在開始從頭搭建我們的微前端架構。項目源碼微前端項目微前端微前端項目 1. 微前端 ????????基于spa類的單頁應用,隨著企業工程項目的體積越來越大,開發的功能越來越多,頁面也越來越多,項目隨之也變得越來越臃腫,維護起來十分困難,往往改一個logo,或者改一個小樣式,都要將項目全部重新打包一遍,維護困難,部署也困難。 ????????因此前端在借鑒后端的微服務架構模式后,衍生了...
摘要:前言微前端理論篇微前端項目微前端前一篇文章講解了項目在微前端架構中的應用,本篇為最后一篇,項目在此架構中的應用。項目我們就不自己搭建了,直接使用腳手架生成。 前言 ????????微前端 —— 理論篇????????微前端 —— portal項目????????微前端 —— menu&&project1(React)????????前一篇文章講解了react項目在single-spa微...
摘要:前言微前端理論篇上一篇介紹了微前端的理念,本片將開始介紹項目。先實現公共依賴的引入吧。在上一步我們沒有引入的依賴包,是因為的依賴包是作為公共依賴導入的。里面全是我的公共依賴文件在下新建文件夾,新建文件,作為我們整個項目的頁面文件。 前言 微前端 —— 理論篇 上一篇介紹了微前端的理念,本片將開始介紹portal項目。 portal項目介紹 ????????portal項目包括兩個...
背景 在項目中要求在后臺系統控制管理權限。在之前做過的后臺管理系統權限控制是用Vue,這樣的話就可以用路由鉤子里做權限比對和攔截處理。但這次我們說的是在一個后臺系統需要加入權限管理控制,技術棧是React?,F在我們就看看實現過程吧?! ≡a基于 react 16.x、dva 2.4.1 實現,所以本文是參考了ant-design-pro v1內部對權限管理的實現 所謂的權限控制是什么?...
一、前言大型中后臺項目一般包括10個以上的子項目,如果維護在一個單頁面應用中,項目就會越來越大,而且不利于版本的迭代,微前端就很好的解決了這些問題。這篇文章主要來體驗下螞蟻的微前端:qiankun,雖然比較成熟了,但在體驗過程中還是有一些問題,記錄總結下,項目代碼實踐項目以react單頁面應用為主應用,然后構建了三個微應用:react、vue3、node靜態頁面二、前期準備微前端要求多個前端服務,...
閱讀 1637·2021-10-27 14:13
閱讀 1881·2021-10-11 10:59
閱讀 3377·2021-09-24 10:26
閱讀 1934·2019-08-30 12:48
閱讀 3045·2019-08-30 12:46
閱讀 2040·2019-08-30 11:16
閱讀 1423·2019-08-30 10:48
閱讀 2748·2019-08-29 16:54