有些时候我们经常一个项目中开发不同的功能,有可能一个前端项目中夹杂着不同系统之间的需求,最后打包发布的时候经常会将与项目不相关的代码一同打包进去,实际来讲这种操作也是不严谨的。那有没有办法可以根据某些不同的配置来实现打包的结果不同呢?答案是肯定的。在介绍下边的方法之前,希望读者有一些关于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根据不同的路由文件实现打包差异化的更多相关文章

  1. Vue 项目中对路由文件进行拆分(解构的方法)

    项目需求场景: 在开发项目过程中,在项目过于庞大,路由信息非常多的情况下,如果将路由配置信息都放在一个文件里面,那么这个JS是不方便维护的, 那么,这个时候需要我们把这个庞大的路由文件,根据项目功能分 ...

  2. K8s nginx-ingress 如何配置二级目录转发远程静态服务器基于Vue路由history模式打包的应用程序

    背景 首先这标题有点绕,我先解释下: 首先我们有静态服务器,上面某个目录有Vue路由history模式打包的应用程序(也就是build后的产物): 但是静态服务器一般不做对外域名用的,我们需要在k8s ...

  3. Vue 多路由文件的合并

    Vue 多路由文件的合并 1.使用的是ES6 数组的合并方法 let routes = new Set([...routes1, ...homerouters]);2.两个路由文件,导出的实际上就是一 ...

  4. vue(18)路由懒加载

    什么是路由懒加载 官方的解释: 当打包构建应用时,JavaScript 包会变得非常大,影响页面加载. 如果我们能把不同路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应组件,这样就更 ...

  5. vue学习记录④(路由传参)

    通过上篇文章对路由的工作原理有了基本的了解,现在我们一起来学习路由是如何传递参数的,也就是带参数的跳转. 带参数的跳转,一般是两种方式: ①.a标签直接跳转. ②点击按钮,触发函数跳转. 在上篇文章中 ...

  6. vue组件,axios ,路由

    组件(Component)自定义封装的功能. 把一个功能相关的[HTML.css和javascript]代码封装在一起组成一个整体的代码块封装模式,我们称之为“组件”. 组件就是一个html网页中的功 ...

  7. vue中怎样实现 路由拦截器

    vue中怎样实现 路由拦截器(当用户没有登录的时候,跳转到登录页面,已经登录的时候,不能跳转到登录页,除非后台token失效) 在 我们需要实现这样 一个功能,登录拦截 其实就是 路由拦截,首先在定义 ...

  8. 如何在Vue项目中给路由跳转加上进度条

    1.前言 在平常浏览网页时,我们会注意到在有的网站中,当点击页面中的链接进行路由跳转时,页面顶部会有一个进度条,用来标示页面跳转的进度(如下图所示).虽然实际用处不大,但是对用户来说,有个进度条会大大 ...

  9. vue学习笔记(十)路由

    前言 在上一篇博客vue学习笔记(九)vue-cli中的组件通信内容中,我们学习组件通信的相关内容和进行了一些组件通信的小练习,相信大家已经掌握了vue-cli中的组件通信,而本篇博客将会带你更上一层 ...

随机推荐

  1. 规则“Microsoft Visual Studio 2008 的早期版本”失败。此计算机上安装了 Microsoft Visual Studio 2008 的早期版本。请在安装 SQL Server 2008 前将 Microsoft Visual Studio 2008 升级到 SP1。

    今天重装了一下系统后,需要装开发工具,我用的开发工具是Visual Studio2008 和SQL Server2008R2,装完Visual Studio2008的时候在装数据库的时候却出现这样的问 ...

  2. PopupWindow设置动画效果

    创建popupwindow的方法 Button menu; private void showPopupWindow() { //设置contentView float density = Densi ...

  3. msys2 安装笔记(可以按照这个关键字搜索)

    以前一直在用 msys,最近发现还有个 msys2,并且msys2 配套的编译器是MinGW-w64. 就试着用了用,感觉还不错,这里把安装过程记录一下. 简单的说,MSYS2 是MSYS的一个升级版 ...

  4. easyui tree后台传json处理问题

    一.tree json格式 [ { "id": 1, "text": "权限管理", "iconCls": " ...

  5. [每天记录一个Bug]Cell中由于block加载网络请求产生的复用

    Bug 出现场景:   cell中使用加载图片的网络请求出现复用,截图如下:         复用原因:   Cell Model中只有一个用户的uid,所有用户相关信息:例如头像\名称\信息等是通过 ...

  6. PHP调用语音合成接口

    百度TTS 语音合成 //百度文件转换成语音 private function toSpeech($text) { define('DEMO_CURL_VERBOSE', false); $obj=[ ...

  7. Java基础(五) final关键字浅析

    前面在讲解String时提到了final关键字,本文将对final关键字进行解析. static和final是两个我们必须掌握的关键字.不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提 ...

  8. python 方法无法在线程中使用(附python获取网络流量)

    在python中,定义一个方法,直接调用可以,但是创建一个线程来调用就可能导致失败.这种现象多出现在使用com对象进行系统操作时,而且是以线程的形式调用. 异常提示如下:syntax error.WM ...

  9. Spring Boot的学习之路(02):和你一起阅读Spring Boot官网

    官网是我们学习的第一手资料,我们不能忽视它.却往往因为是英文版的,我们选择了逃避它,打开了又关闭. 我们平常开发学习中,很少去官网上看.也许学完以后,我们连官网长什么样子,都不是很清楚.所以,我们在开 ...

  10. 关于C# 异步

    关于C# 异步操作整理 按照个人的理解, 写一个接口用Task异步操作(态度:接受并且学习,您提出宝贵的经验与理解,我会认真学习): 在主线程中调用异步方法,如果主线程依赖异步方法的返回值那么你一定会 ...