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中的组件通信,而本篇博客将会带你更上一层 ...
随机推荐
- 十七 bootstrap-table tableExport 导出xlsx格式表格
原文:十七 bootstrap-table tableExport 导出xlsx格式表格 在[十六.bootstrap-table javascript导出数据]中,打开导出的表格时,总会弹出一个提示 ...
- .NET Core整合log4net以及全局异常捕获实现
在使用log4net之前先安装log4net.这里操作很简单,通过nuget下载并安装log4net很方便.如下图. log4net配置 <?xml version="1.0" ...
- Delphi&C#代码模拟“显示桌面”的功能(使用CreateOleObject('Shell.Application'))
今天有人问我:“用shell打开文件(显示桌面.scf)的方式还是用模拟键盘(Win+D)显示桌面”这应该有更好的方法,就搜了搜,关键字定位“ToggleDesktop”因为显示桌面.scf的内容是: ...
- 深入探索ScrollWindow
最近做WIN32 API开发时发现对ScrollWindow的一些工作原理并不是太清楚,于是做了相关研究,记载下来和大家共同学习. 首先在WM_CREATE中获取系统字符的宽度和高度 case WM_ ...
- win7 docker安装文件及安装问题
最近在玩爬虫,需要装docker,但是官网对于win7版本,只支持docker tool box,在官网找了半天才找到安装包,特此上传百度网盘,方便各位下载 链接:https://pan.baidu. ...
- CrossOver for Mac v18.5 中文破解版下载-可以安装Windows软件
CrossOver for Mac v18.5 中文破解版: http://h5ip.cn/kADD Crossover Mac 破解版是Mac 和 Windows 系统之间的兼容工具.使 Mac 操 ...
- What?Tomcat-竟然也算中间件?
关于 MyCat 的铺垫文章已经写了两篇了: MySQL 只能做小项目?松哥要说几句公道话! 北冥有 Data,其名为鲲,鲲之大,一个 MySQL 放不下! 今天是最后一次铺垫,后面就可以迎接大 Bo ...
- Web前端——JavaScript练习
Js练习 显示和隐藏,改变display属性(点击查看图片) 关键代码: e.style.display = "block"; e.style.display = "no ...
- C++程序设计1(侯捷video 1-6)
一.头文件的防御式声明(video2) #ifndef __COMPLEX__ #define __COMPLEX__ //内容 #endif 二.初步感受模板(video2) 定义的时候: //复数 ...
- Scala 学习之路(一)—— Scala简介及开发环境配置
一.Scala简介 1.1 概念 Scala全称为Scalable Language,即“可伸缩的语言”,之所以这样命名,是因为它的设计目标是希望伴随着用户的需求一起成长.Scala是一门综合了面向对 ...