Vue根据不同的路由文件实现打包差异化
有些时候我们经常一个项目中开发不同的功能,有可能一个前端项目中夹杂着不同系统之间的需求,最后打包发布的时候经常会将与项目不相关的代码一同打包进去,实际来讲这种操作也是不严谨的。那有没有办法可以根据某些不同的配置来实现打包的结果不同呢?答案是肯定的。在介绍下边的方法之前,希望读者有一些关于webpack以及Vue router的概念和应用,废话不多说,开始介绍。
首先来讲webpack,webpack是一个模块打包器他会收集各个组件之间的依赖关系,并通过此依赖关系来将所有的js、css、jpg等等都打成一个一个的组件依赖。而在Vue中也是使用webpack来进行模块打包工作,那么在Vue中有没有明确的依赖关系描述呢?在Vue中的所有的跳转都是通过Vue router进行的,那是不是可以认为router拥有着组件之间的依赖关系。而router中跳转的关键是通过不同的router.js加载不同的*.Vue组件,而后通过别名或者path进行跳转。当然的在router中需要使用index.js文件来引入不同的router.js,由此Vue才可以正确的去寻找并去加载*.Vue文件。
既然知道了Vue是通过router中index.js文件去加载的,那么就意味着可以通过定义不同的index.js来实现打包差异化。但是,定义多个index.js虽然可行,打包的时候webpack又怎么会知道加载那个index.js文件呢?这时候就可以使用webpack中的一个内置组件NormalModuleReplacementPlugin来完成(NormalModuleReplacementPlugin的原理请自行GooGle),首先,使用npm run build的时候Vue会去加载webpack.prod.conf.js文件,这时候就可以在webpack.prod.conf.js文件中使用NormalModuleReplacementPlugin,方法如下:
- var appTarget = env.PROJ_NAME
- plugins: [
- new webpack.NormalModuleReplacementPlugin(/.*APP_TARGET\./,
- function (resourse) {
- var str = appTarget.replace("\"","").replace("\"","");
- resourse.request = resourse.request.replace(/APP_TARGET/, `${str}`);
- }),
- ]
这个组件的实际上是所有的xxxx.APP_TARGET后边的APP_TARGET替换为指定的字符,由此再去加载文件,其中env.PROJ_NAME是定义在prod.env.js中的一个标识,这样就可以通过定义在prod.env.js中的这个标识去寻找相对应的index_xxxx.js文件,进而实现打包差异化。比如,你需要A项目的代码,只需要将prod.env.js中的PROJ_NAME字段改为A
- 'use strict'
- module.exports = {
- NODE_ENV: '"production"',
- PROJ_NAME:'"A"'
- }
这样Vue就会去加载index_A.js,同理当你需要B项目代码的时候只需要将PROJ_NAME更改为B即可。
当决定使用以上方法的时候,在main.js文件中引入路由主文件就不可以像下边这样引用了
- import router from './router/index.js'
要修改成
- import router from './router/index_APP_TARGET.js'
这样引用router才会去动态加载并实现打包差异化,这时候用户需要在定义不同的index.js文件来实现不同的vue组件引用,比如
index_A.js
index_B.js
index_C.js
在上述条件都完成之后可以使用以下命令来验证打包结果
- npm run build --report
注:npm run build --report 命令实际是对 webpack-bundle-analyzer的一个使用 webpack-bundle-analyzer是一个可视化资源分析工具 用户可以在其中查看资源的分布情况
Vue根据不同的路由文件实现打包差异化的更多相关文章
- Vue 项目中对路由文件进行拆分(解构的方法)
项目需求场景: 在开发项目过程中,在项目过于庞大,路由信息非常多的情况下,如果将路由配置信息都放在一个文件里面,那么这个JS是不方便维护的, 那么,这个时候需要我们把这个庞大的路由文件,根据项目功能分 ...
- K8s nginx-ingress 如何配置二级目录转发远程静态服务器基于Vue路由history模式打包的应用程序
背景 首先这标题有点绕,我先解释下: 首先我们有静态服务器,上面某个目录有Vue路由history模式打包的应用程序(也就是build后的产物): 但是静态服务器一般不做对外域名用的,我们需要在k8s ...
- Vue 多路由文件的合并
Vue 多路由文件的合并 1.使用的是ES6 数组的合并方法 let routes = new Set([...routes1, ...homerouters]);2.两个路由文件,导出的实际上就是一 ...
- vue(18)路由懒加载
什么是路由懒加载 官方的解释: 当打包构建应用时,JavaScript 包会变得非常大,影响页面加载. 如果我们能把不同路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应组件,这样就更 ...
- vue学习记录④(路由传参)
通过上篇文章对路由的工作原理有了基本的了解,现在我们一起来学习路由是如何传递参数的,也就是带参数的跳转. 带参数的跳转,一般是两种方式: ①.a标签直接跳转. ②点击按钮,触发函数跳转. 在上篇文章中 ...
- vue组件,axios ,路由
组件(Component)自定义封装的功能. 把一个功能相关的[HTML.css和javascript]代码封装在一起组成一个整体的代码块封装模式,我们称之为“组件”. 组件就是一个html网页中的功 ...
- vue中怎样实现 路由拦截器
vue中怎样实现 路由拦截器(当用户没有登录的时候,跳转到登录页面,已经登录的时候,不能跳转到登录页,除非后台token失效) 在 我们需要实现这样 一个功能,登录拦截 其实就是 路由拦截,首先在定义 ...
- 如何在Vue项目中给路由跳转加上进度条
1.前言 在平常浏览网页时,我们会注意到在有的网站中,当点击页面中的链接进行路由跳转时,页面顶部会有一个进度条,用来标示页面跳转的进度(如下图所示).虽然实际用处不大,但是对用户来说,有个进度条会大大 ...
- vue学习笔记(十)路由
前言 在上一篇博客vue学习笔记(九)vue-cli中的组件通信内容中,我们学习组件通信的相关内容和进行了一些组件通信的小练习,相信大家已经掌握了vue-cli中的组件通信,而本篇博客将会带你更上一层 ...
随机推荐
- window下golang生成静态库给C语言调用
buidmod为c-archive能在window下生成 ,c-shared则不行 1.golang生成c-archive静态库 main.go package main import "C ...
- C#图片处理之:旋转图片90度的整数倍
原文:C#图片处理之:旋转图片90度的整数倍 旋转图片90的整数倍那真是太简单了. public static Bitmap KiRotate90(Bitmap img) ...
- Android零基础入门第80节:Intent 属性详解(下)
上一期学习了Intent的前三个属性,本期接着学习其余四个属性,以及Android系统常用内置组件的启动. 四.Data和Type属性 Data属性通常用于向Action属性提供操作的数据.Data属 ...
- 如何把zip文件直接解压到内存里?
解压到硬盘再读进来耽误时间. var LZip: TZipFile; LMem: TMemoryStream; LBytes: TBytes;begin LZip := TZipFile.Cr ...
- libevent for qt的讨论
一直对Qt官方的QtNetwork模块抱有遗憾,Qt自带的网络模块用的是select模型,无法支持高并发的服务器开发.最近在网上看到有个libevent for qt的东西,它直接替换了Qt的sele ...
- QTcpSocket 对连接服务器中断的不同情况进行判定
http://blog.csdn.net/goforwardtostep/article/details/52300335
- Angular4初学
[1].在学习Angular4之前,首先要了解一些typescript的知识. 以下是我的总结:https://gitee.com/FangXiaoQi123/angularJSCeShi/blob/ ...
- sublimetext插件安装
sublimetext 一.下载地址: https://www.sublimetext.com/ 二.安装Package Control 方式一: Ctrl + Shift + P , 输入insta ...
- Vim入门操作整理
根据小甲鱼的vim入门视频整理,供查阅 移动指令:上下左右 k j h l 翻页: ctrl + b ctrl + f 保存退出:ZZ 普通模式:vim fileName 首次进入的就是普通模式 从 ...
- uint16,uint32是什么?
记得之前在刷笔试题的时候就看见过这个问题,发现当时上网百度后又忘了. 最近在看CryEngine3引擎代码的时候又晕了,趁现在赶紧记下来~ 在查看CE3的代码时我发现了这个变量,TFlowNodeId ...