缘由

给客户做的项目,一期二期三期地做着。做了三四个后台管理,为了方便管理,把几个项目合并处理。所以在网上搜索资料。原博主地址链接。

single-spa

Single-spa 是一个将多个单页面应用聚合为一个整体应用的 JavaScript 微前端框架。 使用 single-spa 进行前端架构设计可以带来很多好处,例如:

  • 在同一页面上使用多个前端框架 而不用刷新页面 (React, AngularJS, Angular, Ember, 你正在使用的框架)
    独立部署每一个单页面应用
  • 新功能使用新框架,旧的单页应用不用重写可以共存
  • 改善初始加载时间,迟加载代码

新建项目

新建项目,文件名micro-frontend,在该目录下生成app1,app2和layout项目

mkdir micro-frontend && cd micro-frontend
vue create project-name

选项如下,最简约版只要配个路由就行了

app1子项目初始化

其中app2和app1的对于单页面的配置是一样的。
以app1为例
在micro-frontend/app1下新建vue.config.js

const package = require('./package.json')
module.exports = {// 告诉子应用在这个地址加载静态资源,否则会去基座应用的域名下加载publicPath: '//localhost:8081',// 开发服务器devServer: {port: 8081},configureWebpack: {// 导出umd格式的包,在全局对象上挂载属性package.name,基座应用需要通过这个全局对象获取一些信息,比如子应用导出的生命周期函数output: {// library的值在所有子应用中需要唯一library: package.name,libraryTarget: 'umd'}}
}

安装single-spa-vue

npm i single-spa-vue -S

single-spa-vue负责为vue应用生成通用的生命周期钩子,在子应用注册到single-spa的基座应用时需要用到

改造入口文件 main.js

// /src/main.js
import Vue from 'vue'
import App from './App.vue'
import router from './router'
import singleSpaVue from 'single-spa-vue'Vue.config.productionTip = falseconst appOptions = {el: '#microApp',router,render: h => h(App)
}// 支持应用独立运行、部署,不依赖于基座应用。通俗来讲,就是在原有的项目基础上扩展,不侵入
if (!window.singleSpaNavigate) {delete appOptions.elnew Vue(appOptions).$mount('#app')
}// 基于基座应用,导出生命周期函数
const vueLifecycle = singleSpaVue({Vue,appOptions
})export function bootstrap (props) {console.log('app1 bootstrap')return vueLifecycle.bootstrap(() => {})
}export function mount (props) {console.log('app1 mount')return vueLifecycle.mount(() => {})
}export function unmount (props) {console.log('app1 unmount')return vueLifecycle.unmount(() => {})
}

更改视图文件

 // home<div class="home">+ <h1>app1 home page</h1><img alt="Vue logo" src="../assets/logo.png" /><HelloWorld msg="Welcome to Your Vue.js App" /></div>// about<div class="about">+ <h1>app1 about page</h1><h1>This is an about page</h1></div>

环境配置

.env
应用独立运行时的开发环境配置

NODE_ENV=development
VUE_APP_BASE_URL=/

.env.micro
作为子应用运行时的开发环境配置

NODE_ENV=development
VUE_APP_BASE_URL=/app1

.env.buildMicro
作为子应用构建生产环境bundle时的环境配置,但这里的NODE_ENV为development,而不是production,是为了方便,这个方便其实single-spa带来的弊端(js entry的弊端)

NODE_ENV=development
VUE_APP_BASE_URL=/app1

修改路由文件

const router = new VueRouter({mode: 'history',// 通过环境变量来配置路由的 base urlbase: process.env.VUE_APP_BASE_URL,routes
})

修改package.json中的script

{"name": "app1",// ..."scripts": {// 独立运行"serve": "vue-cli-service serve",// 作为子应用运行"serve:micro": "vue-cli-service serve --mode micro",// 构建子应用"build": "vue-cli-service build --mode buildMicro"},// ...
}

启动

作为独立项目

npm run serve

作为子项目 (路径补全 /app1)

npm run serve:micro

app2配置与app1一致,端口改为8082,app1的文字改为app2即可

基座layout

在/micro-frontend/layout目录下进行

安装依赖

npm i single-spa -S

改造基座项目
main.js

// src/main.js
import Vue from 'vue'
import App from './App.vue'
import router from './router'
import { registerApplication, start } from 'single-spa'Vue.config.productionTip = false// 远程加载子应用
function createScript(url) {return new Promise((resolve, reject) => {const script = document.createElement('script')script.src = urlscript.onload = resolvescript.onerror = rejectconst firstScript = document.getElementsByTagName('script')[0]firstScript.parentNode.insertBefore(script, firstScript)})
}// 记载函数,返回一个 promise
function loadApp(url, globalVar) {// 支持远程加载子应用return async () => {await createScript(url + '/js/chunk-vendors.js')await createScript(url + '/js/app.js')// 这里的return很重要,需要从这个全局对象中拿到子应用暴露出来的生命周期函数return window[globalVar]}
}// 子应用列表
const apps = [{// 子应用名称name: 'app1',// 子应用加载函数,是一个promiseapp: loadApp('http://localhost:8081', 'app1'),// 当路由满足条件时(返回true),激活(挂载)子应用activeWhen: location => location.pathname.startsWith('/app1'),// 传递给子应用的对象customProps: {}},{name: 'app2',app: loadApp('http://localhost:8082', 'app2'),activeWhen: location => location.pathname.startsWith('/app2'),customProps: {}},
]// 注册子应用
for (let i = apps.length - 1; i >= 0; i--) {registerApplication(apps[i])
}new Vue({router,mounted() {// 启动start()},render: h => h(App)
}).$mount('#app')

App.vue

<template><div id="app"><div id="nav"><router-link to="/app1">app1</router-link> |<router-link to="/app2">app2</router-link></div><!-- 子应用容器 --><div id = "microApp"><router-view/></div></div>
</template><style>
#app {font-family: Avenir, Helvetica, Arial, sans-serif;-webkit-font-smoothing: antialiased;-moz-osx-font-smoothing: grayscale;text-align: center;color: #2c3e50;
}#nav {padding: 30px;
}#nav a {font-weight: bold;color: #2c3e50;
}#nav a.router-link-exact-active {color: #42b983;
}
</style>

路由

import Vue from 'vue'
import VueRouter from 'vue-router'Vue.use(VueRouter)const routes = []const router = new VueRouter({mode: 'history',base: process.env.BASE_URL,routes
})export default router

启动基座运行,前提app1与app2都处于运行状态

npm run serve


收工

微前端框架 之 single-spa相关推荐

  1. Bifrost微前端框架及其在美团闪购中的实践

    Bifrost(英 ['bi:frɔst])原意彩虹桥,北欧神话中是连通天地的一条通道.而在漫威电影<雷神>中,Bifrost是神域--阿斯加德(Asgard)的出入口,神域的人通过它自由 ...

  2. 2020 非常火的 11 个微前端框架

    点击"开发者技术前线",选择"星标????" 让一部分开发者看到未来 作者 | Jonathan Saring 译者 | Flora https://itnex ...

  3. 2020 非常火的11个微前端框架

    点击上方"Github中文社区",关注 看遍Github,每天提升 作者 | Jonathan Saring 译者 | Flora https://itnext.io/11-mic ...

  4. 三、如何手动实现一个微前端框架雏形

    如何手动实现一个微前端框架雏形 一.了解微前端 1. 什么是微前端 为了解决一整块儿庞大的前端服务所带来的变更和拓展方面的限制,将整体前端服务拆分成一些更小.更简单的,能够独立开发.测试部署的小块儿. ...

  5. 微前端在得物客服域的实践/那么多微前端框架,为啥我们选Qiankun + MF

    一.业务背景 当前客服一站式工作台包含在线服务.电话.工单和工具类四大功能,页面的基本结构如下: 每个业务模块相对独立,各有独立的业务体系,单个模块体积较大,项目整体采用SPA + iframe的架构 ...

  6. 从零到一实现企业级微前端框架,保姆级教学

    前言 这篇文章笔者足足肝了一周多,多次斟酌修改内容,力求最大程度帮助读者造出一个微前端框架,搞懂原理.觉得内容不错的读者点个赞支持下. 微前端是目前比较热门的一种技术架构,挺多读者私底下问我其中的原理 ...

  7. 手写一个微前端框架(内含源码地址)

    来源:伊撒尔 https://zhuanlan.zhihu.com/p/169800579 halo,大家好,我是 132,前阵子冥思了一会儿微前端,然后周六日趁热打铁,马上写了一个微前端框架,名叫 ...

  8. 基于京东micro-app微前端框架的项目实践

    1.微前端应用介绍 1.1.微前端概念 微前端的概念是由ThoughtWorks在2016年提出的,它借鉴了微服务的架构理念,核心在于将一个庞大的前端应用拆分成多个独立灵活的小型应用,每个应用都可以独 ...

  9. 微前端框架qiankun之原理与实战

    目录 一.微前端概述 1. 基本原理 2. 微前端的主要优势 3. 当前微前端方案的一些缺点 二.qiankun与single-spa实现原理 1. single-spa实现原理 (1). 路由问题 ...

  10. 微前端框架哪个好?QianKun还是MicroApp

    在当前云原生微服务.业务中台.低代码平台等IT架构下,不再是传统的烟囱式应用系统建设,而是打破企业业务部门竖井,建立企业级的信息化平台(数据中台.业务中台),那么对业务开发的解耦和聚合将成为关键技术, ...

最新文章

  1. iOS 开发者账号 到期续费问题
  2. Linux错误代码15872,Linux运维常用命令
  3. 【Java】Integer.valueOf()
  4. Linux 设备 eth0 似乎不存在, 初始化操作将被延迟
  5. 【数据竞赛】席卷Kaggle的调参神器,NN和树模型通吃!
  6. [SDOI2007] 单词接龙游戏 dp
  7. 没信号也不怕?iPhone 14或将支持卫星网络连接呼救
  8. 有钱男人更看重女人的美貌还是年轻?
  9. 不能执行已释放 Script 的代码
  10. java个人博客系统源码_Java基于SSM的个人博客系统(源码 包含前后台)
  11. DBA01 - 数据库服务概述 构建MySQL服务器、数据库基本管理 MySQL数据类型
  12. 【LeetCode刷题-中等】2. 两数相加(python c++)
  13. 当下移动开发唱衰,iOS开发者如何才能涅槃重生?
  14. Diana and Liana
  15. 【计算机系统基础4】程序的机器级表示
  16. android netd分析
  17. 机器学习:04 Kaggle 信用卡欺诈
  18. 进制转换(非常详细+算法代码)
  19. [LOJ3086] [GXOI2019] 逼死强迫症
  20. 涂鸦智能季报图解:营收5532万美元同比降3% 亏5500万美元

热门文章

  1. webbuilder安装记录
  2. Android:打造万能通用适配器
  3. docker保存和载入镜像
  4. Python第六讲-列表
  5. 正则表达式中只允许录入汉字和中间点,中间点前后必须有值
  6. telnet ip 端口命令怎么打开
  7. 美团点评学龄前儿童营养午餐公益项目落地湖南湘西
  8. NOIP 2014 试做
  9. 300行代码写一个音乐播放器小程序
  10. 齐次除法(透视除法)的意义