vue router name命名规范_关于Vue项目微前端的实现
微前端背景
对于公司内部管理系统、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项目微前端的实现相关推荐
- vue router name命名规范_超完整的Vue入门指导
脚本之家 你与百万开发者在一起 作者 | kiba518出品 | 脚本之家(ID:jb51net)前言 新建项目近些年前端开发快速发展,现在学习前端已经不像以前那样仅仅学习一个语法就可以了,它已经是一 ...
- vue router name命名规范_vue-router使用
vue-router基本用法 vue-router的实现原理: 路由不同的页面也就是加载不同的组件. 路由的三个基本概念: router:它是一条路由,test按钮 => test内容,这是一条 ...
- vue中headers是什么_【vue】饿了么项目-header组件开发
1.数据传递的理解 在App.vue中用到了header组件,首先注册组件 components: {'v-header': header } 然后才能引用 :seller="seller& ...
- Java软件项目开发命名规范_命名规则
文章目录 一.项目命名/包命名/虚拟目录/资源路径 二.Java 代码命名 三.属性文件 properties 命名 四.xml文件命名 五.jsp文件命名 六.html文件命名 七.js文件命名 八 ...
- android接口类命名规范_超全面的UI基础设计规范来啦,还不收藏 ~
写在前面的话 很多刚入行的UI设计师开始接触移动端UI设计的时候,对于基础的界面尺寸规范可能会有一定的模糊认知,导致做出来的界面往往会感觉不是那么和谐,却也不知道怎么去完善和改进. 对于大多数的 ...
- mysql schema命名规范_数据库设计 命名及编码规范
http://blog.csdn.net/seusoftware/archive/2010/04/24/5524414.aspx 引用 一.综述 命名和编码过程中,定义有意义的名称,以易于理解.方便书 ...
- vue.js 常见面试题_使用Vue.js时应避免的常见错误
vue.js 常见面试题 Looking for a front-end framework to try out, I started with React and then tried Vue.j ...
- vue按钮字体大小设置_用Vue模仿antd的样式造UI组件之button
一.环境的配遇新是直朋能到置 1.新建一个遇新是直朋能到分览文件夹 mkdir eassyui 2.使用npm作为包管理新直能分支调二浏页器朋代说,工具 npm init -y 3件览客需和下于有快都 ...
- mysql id命名规范_数据库设计规范之命名规范
命名规范 说明:指数据库对象如表(TABLE).序列(SEQUENCE).过程(PROCEDURE).触发器(TRIGGER)等的命名约定. 1. 基本命名原则 (1)规则1:命名使用具有意义的英文词 ...
- mysql的库命名规范_数据库命名规范(命名规则)
数据库命名规范 引言:数据库设计过程中库.表.字段等的命名规范也算是设计规范的一部分,不过设计规范更多的是为了确保数据库设计的合理性.为了项目最终的协调稳定性,而命名规范更多的是为了确保设计的正式和统 ...
最新文章
- 为freetextbox1.6.5上传图片加上水印
- FPGA笔试题解析(三)
- ICMP报文的格式和种类
- mac php oracle11g,Oracle11G函数整理
- 数据结构算法 | 单调栈
- oracle中使用sql查询时字段为空则赋值默认
- Ivanti罗琦:IT服务管理中“拧紧螺丝”要有门道儿!
- Redis 如何实现主从复制
- QTable中header高度
- 7-10 数组循环左移 (20 分)
- 使用内部类或者外部类
- BLOCK_TYPE_US_VALID(pHead-nBlockUse)
- Jmeter脚本录制 badboy的下载安装教程
- 一些国外学位论文和期刊下载链接
- 【ybt金牌导航1-4-3】【luogu P2627】修剪草坪 / Mowing the Lawn G
- Bugku CTF 抄错的字符 WP
- cad阀门插件lisp_cad lisp程序中看不出怎么输入命令
- 《一封来自日本的信——2018年日本社会和生活水平现状》 摘要
- 手机电池容量的一些基础知识
- 关于各种DLL缺失修复问题
热门文章
- 阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第3节 两种获取Stream流的方式_8_Stream流中的常用方法_skip...
- Linux基础学习-NFS网络文件系统实时文件共享
- SSL-ZYC 2414 简写单词
- CTP2交易所成交回报
- POJ 1236 Network of Schools (校园网)
- 测试Live Writer Beta2功能
- java面向对象的基本概念
- 每日一码——链表基本操作
- easyui datagrid 表格不让选中(双层嵌套)
- 18._6索引器在接口中的使用