Single-Spa构建第一个微前端项目

简介: 微前端是前端web开发的趋势,微服务允许你将后端分解成更小的部分,受此启发,微前端允许你独立构建、测试和部署前端应用。根据你选择的微前端框架,你甚至可以让多个微前端应用——用React、Angular、Vue或其他工具编写的——在同一个大应用中无扰共存!之前在这里《认识微前端:一种用于前端 Web 开发的微服务》大概介绍了一下。

微前端是前端web开发的趋势,微服务允许你将后端分解成更小的部分,受此启发,微前端允许你独立构建、测试和部署前端应用。根据你选择的微前端框架,你甚至可以让多个微前端应用——用React、Angular、Vue或其他工具编写的——在同一个大应用中无扰共存!之前在这里《认识微前端:一种用于前端 Web 开发的微服务》大概介绍了一下。

在本文中,将使用 single-spa 开发一个由微前端组成的应用程序,将使用 Travis CI 设置持续集成。每个CI管道将为微前端应用绑定JavaScript,最后,我们将对其中一个微前端应用程序进行更新,看看它如何独立于其他微前端应用程序部署到生产环境中。

概述

在讨论步骤之前,先来快速了解一下演示应用程序的组成部分,这个应用程序由四个子应用程序组成:

  1. 一个容器应用程序,作为主要容器,协调微前端应用程序的安装和卸载
  2. 始终显示在页面上的微前端导航栏应用程序
  3. 一个微前端 account 应用程序,只有活跃时才显示
  4. 一个微前端 products 应用程序,也只显示当活跃

这四个应用程序都位于单独的代码仓库中,可在 GitHub 上找到。

就用户界面而言,最终的结果相当简单,但要清楚的是,用户界面并不是这里的重点。如果您是在自己的机器上学习,那么在本文结束时,您也将拥有开始使用自己的微前端应用程序所需的所有底层基础设施!

在项目开始之前,先创建一个目录来存放所有微前端应用,执行一下命令:

mkdir crayon-micro-apps

创建容器应用

按照以下步骤创建容器应用程序(也称为根配置),作为所有微前端的应用的入口:

cd crayon-micro-apps
mkdir crayon-micro-root
cd crayon-micro-root
npm init

按照 CLI 步骤输入相应的信息,本文示例不使用Single-Spa推荐的root-config方式。接下来安装serve,执行下面命令:

npm install serve --save

安装完成之后,打开 package.json 增加启动脚本:

"serve": "serve -s -l 9010"

在项目根目录新建文件 index.html,代码如下:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
        <title>Crayon Vue Microfrontends</title>
        <meta name="viewport" content="width=device-width, initial-scale=1" />
        <meta name="importmap-type" content="systemjs-importmap" />
        <script type="systemjs-importmap">
            {
                "imports": {
                    "single-spa": "https://cdnjs.cloudflare.com/ajax/libs/single-spa/4.3.7/system/single-spa.min.js",
                    "vue": "https://cdn.jsdelivr.net/npm/vue@2.6.10/dist/vue.js",
                    "vue-router": "https://cdn.jsdelivr.net/npm/vue-router@3.0.7/dist/vue-router.min.js"
                }
            }
        </script>
        <link
            rel="preload"
            href="https://cdnjs.cloudflare.com/ajax/libs/single-spa/4.3.7/system/single-spa.min.js"
            as="script"
            crossorigin="anonymous"
        />
        <link
            rel="preload"
            href="https://cdn.jsdelivr.net/npm/vue@2.6.10/dist/vue.js"
            as="script"
            crossorigin="anonymous"
        />
        <script src="https://unpkg.com/import-map-overrides@2.3.3/dist/import-map-overrides.js"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/systemjs/6.1.1/system.min.js"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/systemjs/6.1.1/extras/amd.min.js"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/systemjs/6.1.1/extras/named-exports.js"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/systemjs/6.1.1/extras/named-register.min.js"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/systemjs/6.1.1/extras/use-default.min.js"></script>
    </head>
    <body>
        <import-map-overrides-full
            show-when-local-storage="overrides-ui"
        ></import-map-overrides-full>
    </body>
</html>

创建微前端的App

接下来将使用CLI工具 create-single-spa 来创建微前端的应用,具体安装介绍可以查看官方文档

按照上面的步骤来创建导航栏微前端应用,命名为 crayon-micro-navbar

mkdir crayon-micro-navbar
cd crayon-micro-navbar
create-single-spa

按照CLI提示进行操作:

  1. 选择 single-spa application / parcel
  2. 选择 vue
  3. 输入组织名称 crayon

按照同样方式创建 crayon-micro-accountcrayon-micro-products

创建crayon-micro-account使用vue3,创建crayon-micro-products使用vue2

完成之后,稍微调整一下启动信息,主要是配置端口、降低vue-cli-plugin-single-spa版本为^1.3.2,增加依赖"systemjs-webpack-interop": "^2.3.7",修改文件 package.json

"serve": "vue-cli-service serve --port 9011",
  • crayon-micro-navbar9011
  • crayon-micro-account9012
  • crayon-micro-products9013

由于修改了依赖库的版本,需要重新执行 npm install

先进入项目目录crayon-micro-navbar/src,增加文件 set-public-path.js,代码如下:

import { setPublicPath } from "systemjs-webpack-interop";
setPublicPath("crayon-navbar");

将上述文件在 main.js 头部导入:

import "./set-public-path";

接下来修改crayon-micro-navbar/account,如下:

import { setPublicPath } from "systemjs-webpack-interop";
setPublicPath("crayon-account");

crayon-micro-navbar/products,如下:

import { setPublicPath } from "systemjs-webpack-interop";
setPublicPath("crayon-products");

向容器应用注册微前端应用

每个应用程序都包含自己的启动脚本,这意味着在本地开发期间,每个应用程序都将在自己的开发服务器上本地运行。如上所见,导航栏应用程序在端口90011上,account应用程序在端口9012上,products应用程序在端口9013上。

打开文件 crayon-micro-root/index.html,注册三个应用:

<script type="systemjs-importmap">
{
    "imports": {
        "crayon-navbar": "http://localhost:9011/js/app.js",
        "crayon-account": "http://localhost:9012/js/app.js",
        "crayon-products": "http://localhost:9013/js/app.js",
        "single-spa": "https://cdnjs.cloudflare.com/ajax/libs/single-spa/4.3.7/system/single-spa.min.js",
        "vue": "https://cdn.jsdelivr.net/npm/vue@2.6.10/dist/vue.js",
        "vue-router": "https://cdn.jsdelivr.net/npm/vue-router@3.0.7/dist/vue-router.min.js"
    }
}
</script>
<script>
            (function () {
                Promise.all([
                    System.import("single-spa"),
                    System.import("vue"),
                    System.import("vue-router"),
                ]).then(function ([singleSpa, Vue, VueRouter]) {
                    Vue.use(VueRouter);
                    singleSpa.registerApplication(
                        "crayon-navbar",
                        () => System.import("crayon-navbar"),
                        (location) => true
                    );
                    singleSpa.registerApplication(
                        "crayon-account",
                        () => System.import("crayon-account"),
                        (location) => location.pathname.startsWith("/account")
                    );
                    singleSpa.registerApplication(
                        "crayon-products",
                        () => System.import("crayon-products"),
                        (location) => location.pathname.startsWith("/products")
                    );
                    singleSpa.start();
                });
            })();
        </script>

本地运行

为了更好的查看效果,为每个微前端应用增加简单的UI,在这里就不介绍了。打开四个终端,执行相应的APP,打开浏览器输入:http://localhost:9010/,可以看到下面的效果:

image.png

总结

本文设计的代码仓库地址:github.com/QuintionTan…,这只是完成了一个简单的实现,如需要在团队实际落地还需要规划一些开发规范和工具。


相关文章
|
7月前
|
JSON 自然语言处理 前端开发
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
318 72
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
|
7月前
|
前端开发 算法 NoSQL
前端uin后端php社交软件源码,快速构建属于你的交友平台
这是一款功能全面的社交软件解决方案,覆盖多种场景需求。支持即时通讯(一对一聊天、群聊、文件传输、语音/视频通话)、内容动态(发布、点赞、评论)以及红包模块(接入支付宝、微信等第三方支付)。系统采用前后端分离架构,前端基于 UniApp,后端使用 PHP 框架(如 Laravel/Symfony),配合 MySQL/Redis 和自建 Socket 服务实现高效实时通信。提供用户认证(JWT 集成)、智能匹配算法等功能,助力快速上线,显著节约开发成本。
162 1
前端uin后端php社交软件源码,快速构建属于你的交友平台
|
8月前
|
前端开发 Java Shell
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
479 20
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
8月前
|
安全 前端开发 开发工具
【01】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-优雅草卓伊凡拟开发一个一站式家政服务平台-前期筹备-暂定取名斑马家政软件系统-本项目前端开源-服务端采用优雅草蜻蜓Z系统-搭配ruoyi框架admin后台-全过程实战项目分享-从零开发到上线
【01】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-优雅草卓伊凡拟开发一个一站式家政服务平台-前期筹备-暂定取名斑马家政软件系统-本项目前端开源-服务端采用优雅草蜻蜓Z系统-搭配ruoyi框架admin后台-全过程实战项目分享-从零开发到上线
378 5
【01】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-优雅草卓伊凡拟开发一个一站式家政服务平台-前期筹备-暂定取名斑马家政软件系统-本项目前端开源-服务端采用优雅草蜻蜓Z系统-搭配ruoyi框架admin后台-全过程实战项目分享-从零开发到上线
|
8月前
|
JSON 前端开发 API
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
353 5
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
|
7月前
|
人工智能 JavaScript 前端开发
Vue 性能革命:揭秘前端优化的终极技巧;Vue优化技巧,解决Vue项目卡顿问题
Vue在处理少量数据和有限dom的情况下技术已经非常成熟了,但现在随着AI时代的到来,海量数据场景会越来越多,Vue优化技巧也是必备技能。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
8月前
|
Dart 前端开发 Android开发
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
206 4
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
8月前
|
监控 前端开发 Java
构建高效Java后端与前端交互的定时任务调度系统
通过以上步骤,我们构建了一个高效的Java后端与前端交互的定时任务调度系统。该系统使用Spring Boot作为后端框架,Quartz作为任务调度器,并通过前端界面实现用户交互。此系统可以应用于各种需要定时任务调度的业务场景,如数据同步、报告生成和系统监控等。
285 9
|
12月前
|
存储 人工智能 前端开发
前端大模型应用笔记(三):Vue3+Antdv+transformers+本地模型实现浏览器端侧增强搜索
本文介绍了一个纯前端实现的增强列表搜索应用,通过使用Transformer模型,实现了更智能的搜索功能,如使用“番茄”可以搜索到“西红柿”。项目基于Vue3和Ant Design Vue,使用了Xenova的bge-base-zh-v1.5模型。文章详细介绍了从环境搭建、数据准备到具体实现的全过程,并展示了实际效果和待改进点。
894 14
|
12月前
|
JavaScript 前端开发 程序员
前端学习笔记——node.js
前端学习笔记——node.js
237 0