在基于vue-cli的项目自定义打包环境
在工作当中,遇到了下面这个问题:
测试环境与生产环境中的用户权限不一样,因此,就需要根据测试环境打一个包,生产环境又打一个包。
可是,如果每次打包都需要更改权限的配置文件的话,会很麻烦,而且,体现不出一个coder该有的逼格。
为了更有逼格地解决这个问题,于是我百度了一番,上天不负有心人,让我找到了解决方案。
在详叙解决方案之前,先简单介绍下解决方案当中使用到的工具:cross-env,webpack.DefinePlugin
- cross-env是给process.env当中添加变量的,那process.env又是什么呢?
process是一个控制node.js的进程,它是一个global对象,包含进程相关的一些信息,而process.env则是包含用户环境信息的一个对象,例如下面这样的对象:
{
TERM: 'xterm-256color',
SHELL: '/usr/local/bin/bash',
USER: 'maciej',
PATH: '~/.bin/:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin',
PWD: '/Users/maciej',
EDITOR: 'vim',
SHLVL: '1',
HOME: '/Users/maciej',
LOGNAME: 'maciej',
_: '/usr/local/bin/node'
}
使用cross-env可以往这个process.env对象当中添加自定义的数据,然后可以在任何node.js的执行环境当中获取,一般是在打包配置当中获取process.env.NODE_ENV来判断是哪种环境,然后再作相应的配置。
如何使用cross-env
- 安装:npm i cross-env -D
- 在npm自定义命令当中使用;
"script":{
"build:testing":"cross-env NODE_ENV=‘testing’ webpack"
}
然后,我们执行npm run build:testing的时候,就好执行以上的命令,cross-env就会在process.env当中添加一个NODE_ENV的属性,属性的值就是‘testing’字符串,注意这里是加了单引号的,因为这样才是一个字符串,如果不加的话,就相当于一个代码片段,还要在获取完之后通过JSON.stringify去转成字符串。
- webpack.DefinePlugin又是什么呢?
webpack.DefinePlugin是webpack自带的一个插件,它的作用是在编译的时候生成一些全局变量的,这里说的全局变量指的是客户端的全局变量,相当于挂载在window对象上的变量,我们可以利用它的这个功能在不同的环境(开发,测试,或者生产)当中定义不同的行为。
介绍完两个插件了,是时候说一下两者结合在实际当中如何使用了。
下面将展示如何解决本文开头一开始所提到的根据测试和生产环境配置不同的用户权限的问题。
在config目录下,根据不同的环境创建不同的配置文件
如上图所示,test.env.js是测试环境的配置文件,prod.env.js则是生产环境的配置文件
- test.env.js的配置
const merge = require('webpack-merge')
const devEnv = require('./dev.env')
module.exports = merge(devEnv, {
NODE_ENV: '"testing"'
})
- prod.env.js的配置
module.exports = {
NODE_ENV:"production"
}
分别创建测试与生产的权限配置文件
- test.authority.js 测试环境权限
function getAuthority(userAuthority){
const menus = [];
switch(userAuthority){
case 'zhangsan':
menus = ["a","b","c","d"]; //这里的a,b,c,d相当与路由配置当中页面的name
break;
case 'lishi':
menus = ["a","b","c"];
break;
case 'wangwu':
menus = ["b","c","d"];
break;
default:
menus = ["a","b"];
}
return menus;
}
export default getAuthority;
- prod.authority.js 生产环境的配置方法页和上面一样,只不过是menus里的配置不同
使用cross-env配置对应的NODE_ENV
- package.json
"scripts":{
"build:testing": "cross-env NODE_ENV='testing' node build/build.js",
"build": "cross-env NODE_ENV='production' node build/build.js"
}
npm run build:testing执行的是测试环境的打包,npm run build则是生产环境的打包。
将当前环境的配置添加到客户端全局
- build/webpack.prod.conf.js
const env = process.env.NODE_ENV === 'testing' ? require("../config/test.env.js") : require("../config/prod.env.js");
//配置webpack.DefinePlugin将env添加到全局变量当中
plugins:[
new webpack.DefinePlugin({
"ENV":env
})
]
根据环境信息配置用户权限
要对用户权限进行控制是要先知道当前登录的是哪个用户,因此用户权限配置的操作是在登录页面完成的。
- login.vue
//获取环境信息,然后根据环境信息读取对应的权限配置文件
const env = ENV.NODE_ENV === "testing" ? "test" : "prod";
import getAuthority from `${env}.authority.js`;
export default {
methods:{
login(){
axios({...}).then(res => { //调用登录接口获取当前用户信息
let userAuthority = getAuthority(res.userName); //获取当前登录用户的页面权限
sessionStorage.setItem("authorityPages",JSON.stringify(userAuthority)) //将用户的页面权限保存起来,在生成侧边栏的时候通过v-if指令判断是否渲染
})
}
}
}
来到这里,就能够解决本文一开始所提的问题了,下面总结一下。
总结
- 根据不同的环境编写对应的打包环境信息配置文件;
- 根据不同环境编写对应用户权限配置文件;
- 根据不同环境编写对应的npm打包命令,使用cross-env设置对应的运行时环境;
- 在打包配置文件当中根据运行时环境获取对应的环境配置信息,然后使用webpack.DefinePulgin添加到客户端全局变量当中;
- 登录页根据全局变量中的环境信息获取对应的用户权限配置文件;
- 用户登录之后根据获取的用户权限文件中的方法获取登录用户的权限,并把当前登录用户的权限保存起来以便之后使用。
原文地址:https://segmentfault.com/a/1190000016962001
在基于vue-cli的项目自定义打包环境的更多相关文章
- 基于Vue的工作流项目模块中,使用动态组件的方式统一呈现不同表单数据的处理方式
在基于Vue的工作流项目模块中,我们在查看表单明细的时候,需要包含公用表单信息,特定表单信息两部分内容.前者表单数据可以统一呈现,而后者则是不同业务的表单数据不同.为了实现更好的维护性,把它们分开作为 ...
- 基于vue cli 3.0创建前端项目并安装cube-ui
前提条件: 安装node.js. 国内的开发者最好先配置淘宝镜像. 之后用cnpm来代替npm命令. 项目创建过程: 打开cmd,输入命令进入目标工作空间,以本机项目为例: cd /d d: cd D ...
- 基于vue脚手架的项目打包上线(发布)方法和误区
最近要把vue脚手架开发的一个项目上线,只知道vue脚手架是基于node的服务端项目,那么只需要 npm run dev 就可以轻松启动整个项目,当我想当然的给服务器配置合适的node环境(这里也遇到 ...
- 基于@vue/cli 的构建项目(3.0)
1.检测node的版本号 注意:1.Vue CLI需要Node.js的版本 8.9+(推荐8.11.0+) 所以在安装Vue CLI之前先看下node的版本 node -v 2.安装@vue/cli ...
- 基于Vue的WebApp项目开发(二)
利用webpack解析和打包.vue组件页面 相关知识: vue项目中的每个页面其实都是一个.vue的文件,这种文件,Vue称之为组件页面,必须借助于webpack的vue-loader才能运行,所以 ...
- 基于vue+uniapp直播项目|uni-app仿抖音/陌陌直播室
一.项目简介 uni-liveShow是一个基于vue+uni-app技术开发的集小视频/IM聊天/直播等功能于一体的微直播项目.界面仿制抖音|火山小视频/陌陌直播,支持编译到多端(H5.小程序.Ap ...
- VUE+Ionic,项目搭建&打包成APK
安装Vue&创建Vue工程 1.安装Vue CLI: npm install -g vue-cli 2.创建新的Vue项目,创建最后一步会提醒是否使用npm install 自动安装,如果选择 ...
- 解决@vue/cli 创建项目是安装chromedriver时失败的问题
最近在使用新版vue的命令行工具创建项目时,安装chromedriver老是失败,导致后面的步骤也没有进行.网上搜索了一下,全是使用 工作中常见问题汇总及解决方案 npm install chrome ...
- vue和cordova项目整合打包,并实现vue调用android的相机的demo
经过网上查找很多资料,发现很多只有vue+cordova的项目整合,但是vue使用cordova插件的文章很少,现在把从创建cordova和创建vue到vue使用插件到项目打包到android手机运行 ...
随机推荐
- AJAX下拉框联动
function getProvince() { var ProName = $("#dvProv").val(); LoadProvince(ProName); } functi ...
- Linux Shell命令系列(1)
1. ls命令ls命令是列出目录内容(List Directory Contents)的意思.运行它就是列出文件夹里的内容,可能是文件也可能是文件夹.“ls -l”命令以详情模式(long listi ...
- Spark最简安装
该环境适合于学习使用的快速Spark环境,采用Apache预编译好的包进行安装.而在实际开发中需要使用针对于个人Hadoop版本进行编译安装,这将在后面进行介绍. Spark预编译安装包下载——Apa ...
- jQuery jQuery on()方法
jQuery on()方法是官方推荐的绑定事件的一个方法. $(selector).on(event,childSelector,data,function,map) 由此扩展开来的几个以前常见的方法 ...
- JAVA 集合类小结
一 集合和数组 因为本人也是个go的爱好者,所以对于集合类算是摸的比较透的. 说到集合,必须了解数组和集合. Java的数组长度固定,集合长度不定.集合是特定的数据结构的集合. 而go里面并没有集合, ...
- java如何调用服务端的WSDL接口
如何使用http://192.168.0.170:8090/kaoshi?wsdl调用服务端暴露在外面可以使用的接口 1.首先创建调用ws的web项目,就一个普通的web项目就行: 2.通过eclip ...
- iOS开发ReactiveCocoa学习笔记(六)
RAC操作方法三. demo地址:https://github.com/SummerHH/ReactiveCocoa.git doNext deliverOn timeout interval del ...
- ECMAScript 原始值和引用值
原始值和引用值 在ECMAScript中,变量可以存在两种类型的值,即原始值和引用值 原始值 存储
- javascript Boolean
Boolean 对象表示两个值:true 或 false 创建Boolean对象的语法 new Boolean(value) //构造函数 Boolean(value; //转换函数 参数 参数va ...
- 初识Notification
通知(Notification)是 Android 系统中比较有特色的一个功能,当某个应用程序希望向用户发出一些提示信息,而该应用程序又不在前台运行时,就可以借助通知来实现.发出一条通知后,手机最上方 ...