首页 > 其他分享 >基于 Webpack4 和 Vue 的可热插拔式微前端架构

基于 Webpack4 和 Vue 的可热插拔式微前端架构

时间:2023-08-10 18:11:17浏览次数:49  
标签:npm Webpack4 run 热插拔 代码 基座 Vue 模块 架构

如果项目对你有所帮助,可以给个star Github地址

什么是 Puzzle

Puzzle 是基于 Vue 和 Webpack4 实现的一种项目结构;业务模块可以像拼图一样与架构模块组合,形成不同的系统,而这一切都是可以在生产环境热插拔的;这意味着你可以随时向你的系统添加新的功能模块,甚至改版整个系统,而不需要停掉它。

特点

  • 核心:支持生产环境模块热插拔
  • 支持业务模块的灵活组合
  • 基座作为基座模块,也支持多个并存(这意味着你可以很轻松的进行灰度测试)

如何做到的

  1. 将基座/业务模块以umd模块的方式用 webpack 打包出来
  2. 通过 LoadJS 对这些模块进行挂载,会在 window 对象上附加该模块对象
  3. 通过动态路由的方式将该对象加载到架构中

运行项目

开发环境

安装依赖

npm install

构建第三方依赖

npm run dll

运行

npm start

生产环境

安装依赖

npm install

构建第三方依赖

npm run dll

构建,在这步你可以选择需要打包的基座模块和业务模块方便进行灵活组合

npm run build

热插拔相关

前端项目根据后端菜单请求进行模块加载,如本项目中后端请求返回格式为(数据来自阿里云):

[
  {
    id: "elastic",
    name: "弹性计算",
    leaf: false,
    children: [
      {
        id: "ecs",
        name: "云服务器 ECS",
        leaf: true,
        page: "/ecs",
        puzzle: "elastic"
      },
      // ...
    ],
    icon: "aperture",
    puzzle: "elastic"
  },
  {
    id: "database",
    name: "数据库",
    leaf: false,
    children: [
        // ...
    ],
    icon: "aperture",
    puzzle: "database"
  },
  // ...
]

规定以第一级目录为模块目录(这里看自己的需求可以对项目进行修改)

规定以第一级目录为模块目录(这里看自己的需求可以对项目进行修改)

固模块 ID 为 elastic、database 等,系统会在生产环境对所有子系统的入口文件进行请求,尝试加载模块,并生成路由;

所以通过不同用户的不同业务模块返回结果,可以进行不同模块的加载,从而进行权限控制;

同理通过不同用户的不同基座模块返回结果,可以进行不同基座的加载,从而进行灰度测试等操作(目前系统所用基座是写在public/config.js中,固此条仅作参考,项目本身可以自由发挥);

单独打包架构

npm run core

单独打包基座模块

npm run frame --name="xxx"

单独打包业务模块

npm run puzzle --name="xxx"

通过上述操作打包出的模块,可以直接新增到生产环境或者替换生产环境对应应模块

代码结构

开发环境结构

 

config

此文件夹内包含webpack所有打包配置文件

public

config.js:项目配置,用于生产环境配置

index.html:HTML 模版

src -> core

架构代码

src -> frames

基座模块代码,多个基座模块并列放置

src -> puzzles

业务模块代码,多个业务模块并列放置

static

主要用于放置静态资源,将会直接复制到生产环境static文件夹

static -> dll

npm run dll生成的第三方库和公共代码等

生产环境结构

生产环境代码按照一定结构放置,可以自由升级替换对应模块

 

 

core

由 npm run core 生成的架构代码

frames

由 npm run frame 生成的基座模块代码

puzzles

由 npm run puzzle 生成的业务模块代码

static

静态资源,包含打包生成的第三方库和公共代码等

PS

此架构仅作为日常工作的一个总结,具体业务场景,可以进行修改,基座模块等可以进行自由发挥;业务模块返回的信息也可以按照需求增加;只要各个模块遵循一定标准,并在core中进行统一处理,均可以达到可插拔的效果。

具体可以看项目代码,方便的话可以给个star Github地址

标签:npm,Webpack4,run,热插拔,代码,基座,Vue,模块,架构
From: https://www.cnblogs.com/Im-Victor/p/17621167.html

相关文章

  • vue3怎么使用defineExpose
    在使用单文件组件<scriptsetup>创建一个子组件,会遇到父组件需要调用子组件的方法或变量的情况,这个时候,子组件中就需要使用defineExpose把子组件中那些需要被父组件调用的方法或变量给输出,方便父组件使用。 1.子组件在子组件中,定义updata方法、getData方法、num变量<templat......
  • 项目vue2升级vue3
    Vue2迁移vue3操作指南#一、前言有个自动化迁移工具gogocode-cli,尝试后发现不好用且得不偿失,就放弃了,感兴趣的可以去了解一下,本指南选择手动迁移迁移开始之前,我们先来梳理下思路:现在有一个vue2的项目,首先我们升级框架,得到了一个vue3的框架,但是上面放着vue2的代码,跑不起来,然后我......
  • 全局引用ant-design-vue的TreeSelect没有样式
    在全局只按需引用了TreeSelect---vue.use(TreeSelect)没有样式.........需要在babel.config.js里的plugins配置plugins:[["import",{"libraryName":"ant-design-vue",//库名称"libraryDirectory"......
  • vue自定义指令(防抖)
    importVuefrom'vue'/***按钮防抖,300毫秒内只触发一次请求*区分了一下传参和不传参的情况*///不传参数,用法:v-debounce="test_debounce"Vue.directive('debounce',{inserted:function(el,binding){lettimerel.addEventListener('click',......
  • npm uninstall -g @vue/cli 命令卸载脚手架失败
     解决方法如下:1、执行:npmconfigls-l命令;在展示信息的userconfig键值中找到.npmrc文件的路径;将.npmrc文件删除。查询结果如下: 2、执行:wherevue命令;删除查询出的两个文件。文件如下图: 3、执行:vue-V命令。发现vue命令已经不可用,说明已经删除成功。 ......
  • vue3源码入口
    vue有两个阶段  分为编译时和运行时webpack  把vue模板编译生成对应的js代码,vue组件组件对应的template模板会被编译器转化为render函数。 运行时编译后代码执行render函数并返回VNode,最后将VNode渲染成真实的DOM节点createApp>ensureRenderer>createRenderer>ba......
  • 精简的Vue Elenent ui界面
    仓库地址:https://gitee.com/JSTGitee/element-jst-admin 登录  首页   表格   前言该方案作为一套多功能的后台框架模板,适用于绝大部分的后台管理系统开发。基于Vue2,使用vue-cli2脚手架,引用Elementui组件库,方便开发快速简洁好看的组件。 功能......
  • Vue3中的defineProps方法
    1.什么是definePropsdefineProps是Vue3中的一种新的组件数据传递方式,可以用于在子组件中定义接收哪些父组件的props。当父组件的props发生变化时,子组件也会随之响应。2.如何使用defineProps?在子组件中可以使用defineProps声明该组件需要接收的props,它需要传递一个包含props字段......
  • vue cli 解决浏览器缓存问题
    在vue打包时会遇到前端明明发布了,但是浏览器却没有更新。需要强制刷新才能看到最新的内容。解决方法一加时间戳后缀在vue.config.js的文件中加入constTimestamp=newDate().getTime();module.exports={configureWebpack:{//webpack配置output:{//输出重构......
  • 使用vue+openLayers开发离线地图以及离线点位的展示
    1.下载引入到需要的组件中npminstallol2.需要用到的api...(根据开发需求以及实际情况进行引入)importolfrom"ol";import"ol/ol.css";importMapfrom"ol/Map";importViewfrom"ol/View";importFeaturefrom"ol/Feature";importPoin......