如何在基于vue-cli的项目自定义打包环境


Posted in Javascript onNovember 10, 2018

在工作当中,遇到了下面这个问题:

测试环境与生产环境中的用户权限不一样,因此,就需要根据测试环境打一个包,生产环境又打一个包。

可是,如果每次打包都需要更改权限的配置文件的话,会很麻烦,而且,体现不出一个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

  1. 安装:npm i cross-env -D
  2. 在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目录下,根据不同的环境创建不同的配置文件

如何在基于vue-cli的项目自定义打包环境

如上图所示,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指令判断是否渲染
      })
    }
  }
}

来到这里,就能够解决本文一开始所提的问题了,下面总结一下。

总结

  1. 根据不同的环境编写对应的打包环境信息配置文件;
  2. 根据不同环境编写对应用户权限配置文件;
  3. 根据不同环境编写对应的npm打包命令,使用cross-env设置对应的运行时环境;
  4. 在打包配置文件当中根据运行时环境获取对应的环境配置信息,然后使用webpack.DefinePulgin添加到客户端全局变量当中;
  5. 登录页根据全局变量中的环境信息获取对应的用户权限配置文件;
  6. 用户登录之后根据获取的用户权限文件中的方法获取登录用户的权限,并把当前登录用户的权限保存起来以便之后使用。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js控制的回到页面顶端goTop的代码实现
Mar 20 Javascript
js 图片随机不定向浮动的实现代码
Jul 02 Javascript
jQuery实现360°全景拖动展示
Mar 18 Javascript
JavaScript中Textarea滚动条不能拖动的解决方法
Dec 15 Javascript
jQuery模拟完美实现经典FLASH导航动画效果【附demo源码下载】
Nov 09 Javascript
浅谈JS验证表单文本域输入空格的问题
Feb 14 Javascript
jQuery+vue.js实现的九宫格拼图游戏完整实例【附源码下载】
Sep 12 jQuery
初试vue-cli使用HBuilderx打包app的坑
Jul 17 Javascript
countUp.js实现数字动态变化效果
Oct 17 Javascript
微信小程序indexOf的替换方法(推荐)
Jan 14 Javascript
JS数组方法concat()用法实例分析
Jan 18 Javascript
js实现百度登录窗口拖拽效果
Mar 19 Javascript
Vue项目报错:Uncaught SyntaxError: Unexpected token
Nov 10 #Javascript
node+express框架中连接使用mysql(经验总结)
Nov 10 #Javascript
vue axios请求频繁时取消上一次请求的方法
Nov 10 #Javascript
微信小程序实现跑马灯效果
Oct 21 #Javascript
微信小程序使用scroll-view标签实现自动滑动到底部功能的实例代码
Nov 09 #Javascript
vue.js自定义组件directives的实例代码
Nov 09 #Javascript
详解处理Vue单页面应用SEO的另一种思路
Nov 09 #Javascript
You might like
PHP与javascript对多项选择的处理
2006/10/09 PHP
php基础知识:类与对象(3) 构造函数和析构函数
2006/12/13 PHP
PHP把网页保存为word文件的三种方法
2014/04/01 PHP
C#使用PHP服务端的Web Service通信实例
2014/04/08 PHP
PHP提示Cannot modify header information - headers already sent by解决方法
2014/09/22 PHP
php使用gettimeofday函数返回当前时间并存放在关联数组里
2015/03/19 PHP
laravel执行php artisan migrate报错的解决方法
2019/10/09 PHP
一文看懂PHP进程管理器php-fpm
2020/06/01 PHP
添加到收藏夹代码(兼容几乎所有的浏览器)
2007/01/09 Javascript
jquery Firefox3.5中操作select的问题
2009/07/10 Javascript
js 函数的执行环境和作用域链的深入解析
2009/11/01 Javascript
javascript开发中因空格引发的错误
2010/11/08 Javascript
jquery获取复选框被选中的值
2014/04/10 Javascript
javascript实现dom元素可拖动
2016/03/21 Javascript
AngularJs Modules详解及示例代码
2016/09/01 Javascript
javascript入门之window对象【新手必看】
2016/11/22 Javascript
利用浮层使select不可选的实现方法
2016/12/03 Javascript
jQuery validate插件功能与用法详解
2016/12/15 Javascript
js select下拉联动 更具级联性!
2020/04/17 Javascript
JavaScript事件冒泡与事件捕获实例分析
2018/08/01 Javascript
vue 实现动态路由的方法
2020/07/06 Javascript
[01:09]模型精美,特效酷炫!TI9不朽宝藏Ⅰ鉴赏
2019/05/10 DOTA
Java实现的执行python脚本工具类示例【使用jython.jar】
2018/03/29 Python
python3+PyQt5 使用三种不同的简便项窗口部件显示数据的方法
2019/06/17 Python
Numpy中np.random.rand()和np.random.randn() 用法和区别详解
2020/10/23 Python
HTML5 Canvas 破碎重组的视频特效的示例代码
2019/09/24 HTML / CSS
预订全球最佳旅行体验:Viator
2018/03/30 全球购物
星空联盟C# .net笔试题
2014/12/05 面试题
京剧自荐信
2014/01/26 职场文书
2014厂务公开实施方案
2014/02/17 职场文书
租房协议书怎么写
2014/04/10 职场文书
英语课外活动总结
2014/08/27 职场文书
2014矛盾纠纷排查调处工作总结
2014/12/09 职场文书
2015暑期社会实践个人总结
2015/07/13 职场文书
志愿者工作心得体会
2016/01/15 职场文书
redis使用不当导致应用卡死bug的过程解析
2021/07/01 Redis