微前端背景

对于公司内部管理系统、ToB的SaaS系统等一系列的项目中,由于项目本身的生命周期较长,又长期不断的迭代,加入新的功能模块,最终会导致项目本身的体积越来越大,结构越来越复杂。不但影响了日后的维护成本、性能等方面,而且对于开发来讲,也是越写越写不下去,最后的建议可能就是 Emm... 你懂的。

微前端的概念很早就有了,比如说早期的iframe。但对于现在前端的技术的不断发展出现很多优秀的微前端解决方案,比如<strong>[single-spa](https://single-spa.js.org/)strong>、蚂蚁的<strong>[qiankun](https://qiankun.umijs.org/zh/)strong>。有兴趣可以了解下。

实现方案

本文所介绍的微前端是基于Vue的路由预加载的方式实现的,具体架构及流程参考下图:

具体实现

子项目

通过Vue全家桶来构建子项目

规范子项目命名、端口号,在后续的代理、路由命名都以子模块的名字为准

// package.json{    "name": "mobile-wechat",    "devPort": 10011,}

调整目录结构,由于子项目依赖于主项目,所以可以将pubic文件夹删掉,最终大致目录结构如下

├── src              │   ├── views│   ├── router│   ├── main.js├── babel.config.js          ├── vue.config.js      ├── .env.dev       ├── .env.production ├── .env.test   

调整之后配置config文件

// vue.config.jsconst APP_NAME = require('./package.json').name; // 定义项目名const PORT = require('./package.json').devPort;module.exports = {  publicPath: `/${APP_NAME}/`,  chainWebpack: (config) => {    config.externals({      'vue': 'Vue'    })    config.output      .filename('main.js')      .chunkFilename('[name].[chunkhash:8].js')      .jsonpFunction(`webpackJsonp-${APP_NAME}`)      .library(`app-${APP_NAME}`)      .libraryExport('default')      .libraryTarget('umd')    config.plugin('define').use(webpack.DefinePlugin, [{      'process.env.VUE_APP_NAME': JSON.stringify(APP_NAME)    }])    config.plugins      .delete('html')      .delete('preload')      .delete('prefetch')  },  devServer: {    port: PORT,  },};

配置好config后,在入口文件中,将定义的路由表挂载到Vue上,并将路由整理成以下格式,方便管理。

代码如下:

import Vue from 'vue'import router from './router'// 定义__shareRouter__属性用来存放路由信息const shareRouter = (Vue.__shareRouter__ = Vue.__shareRouter__ || {})// 将router定义到属性上shareRouter[process.env.VUE_APP_NAME] = router

最后启动项目

主项目

首先通过webpack将子项目的入口文件打包到主项目中并且在主项目入口文件之前,可以通过

`insert-script-webpack-plugin`插件来实现

// webpack.config.base.jsconst InsertScriptWebpackPlugin  = require('insert-script-webpack-plugin');module.exports = {    // ...    plugins: [        // ...        new InsertScriptWebpackPlugin({            paths: ['/mobile-crm/main.js', '/mobile-wechat/main.js']        }),    ]}

开发环境配置代理,生产环境可以通过Nginx实现代理,加载子项目的入口文件

// webpack.config.dev.jsconst PROXY = {    '/mobile-crm/': {      target: 'http://127.0.0.1:10011/'    },    '/mobile-wechat/': {        target: 'http://127.0.0.1:10012/'    }}

在主项目的路由文件中拦截子项目路由,并添加到主项目路由表中

import Vue from 'vue';import Router from 'vue-router';import routes from './routes/index';Vue.use(Router);const routes_crm = Vue.__shareRouter__routes = Object.values(routes_crm).reduce((acc, prev) =>{    // 将子项目路由注册到 主项目router-view中    const b = {        path: '/',        component: () => import('@/views/index.vue'),        children: [...prev]    }    return  acc.concat(b)}, routes)const router = new Router({    routes,});

启动项目可以看到,主项目已经可以加载子项目的main.js文件了。

注意的问题

* 要确保资源加载顺序,需要优先加载共同依赖的资源->子模块->父模块。

* 需要保证同一前端框架。

* 如果`router`的模式为 `history`,需要服务端配置,将代理资源文件类型限制在`js/css/image`等类型,而非`html`。并设置不能缓存入口文件,具体配置如下:

location ~ \/mobile-crm\/(.+\.js)$ {    if ( $request_uri = /mobile-crm/main.js ){        add_header Cache-Control no-cache;    }}

vue router name命名规范_关于Vue项目微前端的实现相关推荐

  1. vue router name命名规范_超完整的Vue入门指导

    脚本之家 你与百万开发者在一起 作者 | kiba518出品 | 脚本之家(ID:jb51net)前言 新建项目近些年前端开发快速发展,现在学习前端已经不像以前那样仅仅学习一个语法就可以了,它已经是一 ...

  2. vue router name命名规范_vue-router使用

    vue-router基本用法 vue-router的实现原理: 路由不同的页面也就是加载不同的组件. 路由的三个基本概念: router:它是一条路由,test按钮 => test内容,这是一条 ...

  3. vue中headers是什么_【vue】饿了么项目-header组件开发

    1.数据传递的理解 在App.vue中用到了header组件,首先注册组件 components: {'v-header': header } 然后才能引用 :seller="seller& ...

  4. Java软件项目开发命名规范_命名规则

    文章目录 一.项目命名/包命名/虚拟目录/资源路径 二.Java 代码命名 三.属性文件 properties 命名 四.xml文件命名 五.jsp文件命名 六.html文件命名 七.js文件命名 八 ...

  5. android接口类命名规范_超全面的UI基础设计规范来啦,还不收藏 ~

     写在前面的话   很多刚入行的UI设计师开始接触移动端UI设计的时候,对于基础的界面尺寸规范可能会有一定的模糊认知,导致做出来的界面往往会感觉不是那么和谐,却也不知道怎么去完善和改进. 对于大多数的 ...

  6. mysql schema命名规范_数据库设计 命名及编码规范

    http://blog.csdn.net/seusoftware/archive/2010/04/24/5524414.aspx 引用 一.综述 命名和编码过程中,定义有意义的名称,以易于理解.方便书 ...

  7. vue.js 常见面试题_使用Vue.js时应避免的常见错误

    vue.js 常见面试题 Looking for a front-end framework to try out, I started with React and then tried Vue.j ...

  8. vue按钮字体大小设置_用Vue模仿antd的样式造UI组件之button

    一.环境的配遇新是直朋能到置 1.新建一个遇新是直朋能到分览文件夹 mkdir eassyui 2.使用npm作为包管理新直能分支调二浏页器朋代说,工具 npm init -y 3件览客需和下于有快都 ...

  9. mysql id命名规范_数据库设计规范之命名规范

    命名规范 说明:指数据库对象如表(TABLE).序列(SEQUENCE).过程(PROCEDURE).触发器(TRIGGER)等的命名约定. 1. 基本命名原则 (1)规则1:命名使用具有意义的英文词 ...

  10. mysql的库命名规范_数据库命名规范(命名规则)

    数据库命名规范 引言:数据库设计过程中库.表.字段等的命名规范也算是设计规范的一部分,不过设计规范更多的是为了确保数据库设计的合理性.为了项目最终的协调稳定性,而命名规范更多的是为了确保设计的正式和统 ...

最新文章

  1. 为freetextbox1.6.5上传图片加上水印
  2. FPGA笔试题解析(三)
  3. ICMP报文的格式和种类
  4. mac php oracle11g,Oracle11G函数整理
  5. 数据结构算法 | 单调栈
  6. oracle中使用sql查询时字段为空则赋值默认
  7. Ivanti罗琦:IT服务管理中“拧紧螺丝”要有门道儿!
  8. Redis 如何实现主从复制
  9. QTable中header高度
  10. 7-10 数组循环左移 (20 分)
  11. 使用内部类或者外部类
  12. BLOCK_TYPE_US_VALID(pHead-nBlockUse)
  13. Jmeter脚本录制 badboy的下载安装教程
  14. 一些国外学位论文和期刊下载链接
  15. 【ybt金牌导航1-4-3】【luogu P2627】修剪草坪 / Mowing the Lawn G
  16. Bugku CTF 抄错的字符 WP
  17. cad阀门插件lisp_cad lisp程序中看不出怎么输入命令
  18. 《一封来自日本的信——2018年日本社会和生活水平现状》 摘要
  19. 手机电池容量的一些基础知识
  20. 关于各种DLL缺失修复问题

热门文章

  1. 阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第3节 两种获取Stream流的方式_8_Stream流中的常用方法_skip...
  2. Linux基础学习-NFS网络文件系统实时文件共享
  3. SSL-ZYC 2414 简写单词
  4. CTP2交易所成交回报
  5. POJ 1236 Network of Schools (校园网)
  6. 测试Live Writer Beta2功能
  7. java面向对象的基本概念
  8. 每日一码——链表基本操作
  9. easyui datagrid 表格不让选中(双层嵌套)
  10. 18._6索引器在接口中的使用