前端微服務化解決方案3 - 模組載入器
微前端的模組載入器,主要功能為:
- 專案配置檔案的載入
- 專案對外介面檔案的載入(訊息匯流排會用到,後續會提)
- 專案入口檔案的載入
以上也是每一個單模組,不可缺少的三部分
配置檔案
我們實踐微前端的過程中,我們對每個模組專案,都有一個對外的配置檔案.
是模組在註冊到singe-spa時候所用到的資訊.
{
"name": "name", //模組名稱
"path": "/project", //模組url字首
"prefix": "/module-prefix/", //模組檔案路徑字首
"main": "/module-prefix/main.js", //模組渲染出口檔案
"store": "/module-prefix/store.js",//模組對外介面
"base": true
// 當模組被定性為baseApp的時候,
// 不管url怎麼變化,專案也是會被渲染的,
// 使用場景為,模組職責主要為整個框架的佈局或者一直被渲染,不會改變的部分
}
當我們的模組,有多種url字首的時候,path也可以為陣列形式
{
"path": ["/project-url-path1/","/project-url-path2/"], //專案url字首
}
配置自動化
我們每個模組都有上面所描述的配置檔案,當我們的專案多個模組的時候,我們需要把所有模組的配置檔案聚合起來.
我這裡也有寫一個指令碼.
使用方法:
npm install micro-auto-config -g
# 在專案根目錄,用pm2啟動該指令碼,便可啟動這個專案的配置自動化
pm2 start micro-auto-config
大概思路是:當模組部署,伺服器檢測到專案檔案發生改變,便開始找出所有模組的配置檔案,把他們合併到一起.
以陣列包物件的形式輸出一個總體的新配置檔案project.config.js
.
當我們一個模組配置有更新,部署到線上的時候,專案配置檔案會自動更新.
模組載入器
這個檔案直接引入到html中,也就是上一篇文章中的single-spa-config.js
升級版.
在載入模組的時候,我們使用SystemJS作為我們的模組載入工具.
"use strict";
import '../libs/es6-promise.auto.min'
import * as singleSpa from 'single-spa';
import { registerApp } from './Register'
async function bootstrap() {
// project.config.js 檔案為所有模組的配置集合
let projectConfig = await SystemJS.import('/project.config.js' )
// 遍歷,註冊所有模組
projectConfig.projects.forEach( element => {
registerApp({
name: element.name,
main: element.main,
url: element.prefix,
store:element.store,
base: element.base,
path: element.path
});
});
// 專案啟動
singleSpa.start();
}
bootstrap()
Register.js
import '../libs/system'
import '../libs/es6-promise.auto.min'
import * as singleSpa from 'single-spa';
// hash 模式,專案路由用的是hash模式會用到該函式
export function hashPrefix(app) {
return function (location) {
let isShow = false
//如果該應用 有多個需要匹配的路勁
if(isArray(app.path)){
app.path.forEach(path => {
if(location.hash.startsWith(`#${path}`)){
isShow = true
}
});
}
// 普通情況
else if(location.hash.startsWith(`#${app.path || app.url}`)){
isShow = true
}
return isShow;
}
}
// pushState 模式
export function pathPrefix(app) {
return function (location) {
let isShow = false
//如果該模組 有多個需要匹配的路徑
if(isArray(app.path)){
app.path.forEach(path => {
if(location.pathname.indexOf(`${path}`) === 0){
isShow = true
}
});
}
// 普通情況
else if(location.pathname.indexOf(`${app.path || app.url}`) === 0){
isShow = true
}
return isShow;
}
}
// 應用註冊
export async function registerApp(params) {
singleSpa.registerApplication(params.name, () => SystemJS.import(params.main), params.base ? (() => true) : pathPrefix(params));
}
//陣列判斷 用於判斷是否有多個url字首
function isArray(o){
return Object.prototype.toString.call(o)=='[object Array]';
}
未完待續 ...
相關文章
Demo
相關文章
- 前端微服務化解決方案4-新模組構建前端微服務
- 前端微服務化解決方案3-工程設計模式前端微服務設計模式
- 前端微服務化解決方案1-介紹前端微服務
- 前端微服務化解決方案2-使用必要性前端微服務
- 前端單頁應用微服務化解決方案2 - Single-SPA前端微服務
- silky微服務模組微服務
- 前端模組化之迴圈載入前端
- JavaScript 模組化解析JavaScript
- ES6系列之模組載入方案
- ES6 系列之模組載入方案
- 解讀:Java 11中的模組感知服務載入器Java
- 微服務總體功能模組微服務
- nodejs微服務解決方案NodeJS微服務
- 最全的前端模組化方案前端
- 關於前端模組化 CommonJS、AMD、CMD、ES6中模組載入前端JS
- iOS元件化解決方案iOS元件化
- 模切企業的業財一體化解決方案
- swiper 模組載入
- nodejs微服務框架解決方案NodeJS微服務框架
- SAP智慧機器人流程自動化解決方案機器人
- swoole 模組的載入
- ABP - 模組載入機制
- Helloworld 驅動模組載入
- Spring Cloud微服務(一):公共模組的搭建SpringCloud微服務
- Docker:Docker部署Jenkins並共用宿主機Docker部署微服務多模組(二)構建微服務後端多模組DockerJenkins微服務後端
- Spring Cloud 微服務架構解決方案SpringCloud微服務架構
- Alibaba 阿里微服務springcloud flowable 工作流 自定義表單 模組設計方案阿里微服務SpringGCCloud
- 模組化與微服務比較 MircoService VS OSGI微服務
- 讀懂CommonJS的模組載入JS
- nodejs模組載入分析(1).mdNodeJS
- Python實現模組熱載入Python
- Abp vNext 模組載入機制
- Python 模組的載入順序Python
- OrchardCore 如何動態載入模組?
- 微服務治理平臺產品化實踐與應用微服務化解析微服務
- 微服務架構及分散式事務解決方案微服務架構分散式
- Angular入門到精通系列教程(11)- 模組(NgModule),延遲載入模組Angular
- Python 3 快速入門 3 —— 模組與類Python