背景: 测试同学反映:为什么我测试环境和生产环境打出的包最后代码不同?
期望:测试环境和生产环境打出的包相同,甚至说,我最好测试环境和生产环境共用一个包。
问题原因分析:
1、代码中含有使用process.env.NODE_ENV判断所处环境执行不同业务的代码。
2、代码api请求时,有process.env.[API],如VUE_APP_ROOTPATH,使用process.env. VUE_APP_ROOTPATH来去请求不同的接口。 以上两种原因都会导致测试和生产最终的代码不同。
(Tips: 每个小伙伴可能的原因都不太相同,但总的来说,就是依据打包时不同的环境,让代码执行了不同的操作)
解决方案:
一、配置:
我们发现在业务代码包括main.js中,均可以访问到window属性,我们可以借助window.location.hostname获取的ip地址来判断当前所处环境。 我们通过在config.js中配置,所有访问地址的枚举值,来反映对应ip地址和环境的映射。
确定获取到当前环境后,我们再通过当前环境,配置好不同环境需要调取的接口ip地址,来通过当前环境,去获取当前接口需要调用的ipd接口地址。
二、挂载和实施:
将获取到当前的环境,和所需要调取接口的ip地址挂载到window上。 此时在业务代码中使用时: 原先判断当前环境环境的process.env.NODE_env将被window.Basedb_performance_env取代。 原先调取对应环境的ip接口地址, process.env.vue_app_rootpath 将被 window.basedb_performance.vue_app_root_path取代。
问题:
vue.config.js中,没有window,此时一些针对环境变量的处理。
在tm和performance中,因为cdn的原因,需要访问不同ip(根据环境判断)地址下的cdn包。
1、如果去除了build时配置的环境参数,那么将在vue.config.js中将只剩下两个环境。 本地环境和打包环境。 在nginx配置过cdn代理之后,各环境会访问自己ip地址对应的cdn包。 本地环境访问localhost的域名不行,需要让其访问到 https://utest.iflytek.com/cdn地址下的cdn。 在打包环境通过nginx转发他就可以访问到自己ip对应的cdn内容了。
2、如果没有去除build时配置的环境参数 保留dev和test/prod配置 最多有三个环境,本地环境,开发环境,测试/生产环境。