V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
feig
V2EX  ›  程序员

基于 Webpack4 和 Vue 的可插拔式微前端架构,求 Star

  •  
  •   feig · 2019-06-03 15:16:01 +08:00 · 2586 次点击
    这是一个创建于 2004 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如果对你有帮助的话,可以帮我点个 Star !!! github.com/CyberFei/puzzle

    Puzzle Logo

    什么是 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"
    

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

    代码结构

    开发环境结构

    dev

    config

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

    public

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

    index.html:HTML 模版

    src -> core

    架构代码

    src -> frames

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

    src -> puzzles

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

    static

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

    static -> dll

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

    生产环境结构

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

    prod

    core

    npm run core 生成的架构代码

    frames

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

    puzzles

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

    static

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

    PS

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

    具体可以看项目代码,方便的话可以给个 star github.com/CyberFei/puzzle

    8 条回复    2020-05-30 23:07:08 +08:00
    CyberFei
        1
    CyberFei  
       2019-06-03 17:36:33 +08:00
    目前基座是一个简单的 demo,后面我会更新一个功能完整的基座
    DonaldY
        2
    DonaldY  
       2019-06-03 17:42:14 +08:00
    怎么感觉只是生产环境支持热更新?

    我要是前端,我应该不会用这个。
    CyberFei
        3
    CyberFei  
       2019-06-04 08:44:07 +08:00
    @DonaldY 不是很懂你的意思,就是生产环境热更新比较困难啊,开发环境要什么热更新呢,开发环境本身就是支持的
    baixiaoyu2997
        4
    baixiaoyu2997  
       2019-07-08 15:14:03 +08:00
    公司的微前端项目,每个模块关闭时,或者新打开一个模块时都会刷新一下页面,这是为什么
    duanzs
        5
    duanzs  
       2019-07-09 17:32:48 +08:00
    看你的描述和我的需求简直一模一样
    我可以这么理解吗:基座模块相当于 vscode,业务模块相当于 vscode 的一个个小模块,所以:业务模块更新不需要整个项目更新重新打包发布<==>vscode 插件更新不需要 vscode 重新打包更新
    duanzs
        6
    duanzs  
       2019-07-09 17:36:39 +08:00
    @duanzs vscode 的插件
    squallvince
        7
    squallvince  
       2019-08-19 14:49:38 +08:00
    对这个很感兴趣,可惜 vue 没研究过。想研究下这个把 ssr 加进去不知道楼主有没有建议?
    1340641314
        8
    1340641314  
       2020-05-30 23:07:08 +08:00
    @squallvince 我想你需要的应该是这个,CSR 、SSR 的微前端都能支持

    https://github.com/fmfe/genesis
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3509 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 11:00 · PVG 19:00 · LAX 03:00 · JFK 06:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.