时间:2021-05-26
一、前言
二、区分开发环境/生产环境的多种方式
2.1 使用命令行
2.1.1 写法一
以上 script 脚本,可以在任意模块内通过 process.env.NODE_ENV 获取当前的环境变量
但无法在 node 环境(webpack 配置文件中)下获取当前的环境变量
// index.js function getEnv() { console.log(process.env.NODE_ENV);// development | production}// webpack.config.jsconst path = require('path');const webpack = require('webpack');console.log('NODE_ENV',process.env.NODE_ENV);// undefinedmodule.exports = { entry:'./src/index.js', output: { filename: 'js/[name].js' }, ...};2.1.2 写法二
和写法一, 是一样的结果
2.1.3 写法三
以上 script 脚本,无法在任意模块内通过 process.env.NODE_ENV 获取当前的环境变量
但可以在 node 环境(webpack 配置文件中)下,通过函数获取当前环境变量
// index.js function getEnv() { console.log(process.env.NODE_ENV);// undefined}// webpack.config.jsconst path = require('path');const webpack = require('webpack');console.log('NODE_ENV',process.env.NODE_ENV);// undefined// 通过函数获取当前环境变量module.exports = (env,argv) => { console.log('env',env);// development | production return { entry:'./src/index.js', output: { filename: 'js/[name].js' }, ... }};2.2 使用 mode
和 2.1 中的写法二,是一样的结果
一个是在命令行中设置,一个是在 webpack 配置文件中设置
2.3 使用 webpack.DefinePlugin
首先得知道这个插件的作用:设置全局变量(并非挂载到 window 上),所有模块都能读取到该变量的值
// index.js function getEnv() { console.log(process.env.NODE_ENV);// development console.log(NODE_ENV);// production}// webpack.config.jsconst path = require('path');const webpack = require('webpack');// 这里只是凑巧和环境变量同名了,所以才不会报错console.log('process.env.NODE_ENV',process.env.NODE_ENV);// undefinedconsole.log('NODE_ENV',NODE_ENV);// error !!!module.exports = { mode:'development',// development | production entry:'./src/index.js', output: { filename: 'js/[name].js' }, plugins:[ new webpack.DefinePlugin({ 'process.env.NODE_ENV':JSON.stringify('development'), 'NODE_ENV':JSON.stringify('production'), }), ], ...};可以在任意模块内通过 process.env.NODE_ENV 获取当前的环境变量
但无法在 node 环境(webpack 配置文件中)下获取当前的环境变量
2.4 使用 cross-env 插件
原先我一直以为这个插件,可以用来设置所有环境(浏览器环境、node 环境)下的变量。经过测试发现,只能设置node 环境下的变量 —— NODE_ENV
2.4.1 写法一
以上 script 脚本,可以在任意模块内通过 process.env.NODE_ENV 获取当前的环境变量
可以在 node 环境(webpack 配置文件中)下,获取当前环境变量
但是会有一个问题: 浏览器环境和 node 环境下获取到的值是不一样的
// !!!!!!// npm run build1 // !!!!!!// index.js function getEnv() { console.log(process.env.NODE_ENV);// production}// webpack.config.jsconst path = require('path');const webpack = require('webpack');console.log('process.env.NODE_ENV',process.env.NODE_ENV);// developmentmodule.exports = { entry:'./src/index.js', output: { filename: 'js/[name].js' }, ...};2.4.2 写法二
以上 script 脚本,可以在任意模块内通过 process.env.NODE_ENV 获取当前的环境变量
可以在 node 环境(webpack 配置文件中)下,获取当前环境变量
所以在能浏览器环境下读取到环境变量的值,靠的是 mode ,在 node 环境下读取到环境变量的值,靠的是 cross-env
// !!!!!!// npm run build2 // !!!!!!// index.js function getEnv() { console.log(process.env.NODE_ENV);// production}// webpack.config.jsconst path = require('path');const webpack = require('webpack');console.log('process.env.NODE_ENV',process.env.NODE_ENV);// productionmodule.exports = { entry:'./src/index.js', output: { filename: 'js/[name].js' }, ...};三、误区
经常在一些群里看到这个问题: cross-env 和 webpack.DefinePlugin 配合使用的时候,无法通过 process.env.xxx 来获取到设置的环境变量,需要通过 webpack.DefinePlugin 里面设置的 key 来获取。
会引发这个问题的可能原因是:先往 cross-env 里设置了 NODE_ENV 变量,然后又到 DefinePlugin里设置了一遍环境变量
"scripts": { "dev": "cross-env NODE_ENV='development' --mode development"}// index.js function getEnv() { console.log(process.env.NODE_ENV);// development}// webpack.config.jsconst path = require('path');const webpack = require('webpack');console.log('process.env.NODE_ENV',process.env.NODE_ENV);// developmentmodule.exports = { entry:'./src/index.js', output: { filename: 'js/[name].js' }, plugins:[ new webpack.DefinePlugin({ // 设置环境变量 'process.env.NODE_ENV':JSON.stringify('development'), }), ], ...};此时会发现浏览器环境和 node 环境都能获取到设置的变量了,然后就认为之后再设置其他的全局变量时,也像这样写就行了。
认为 cross-env 和 DefinePlugin 是配套一起使用的,这个看法本身就很奇怪,因为两者的作用点不一样
四、总结
cross-env 是专门用来设置 node 环境变量的
webpack.DefinePlugin 是专门用来设置浏览器环境下的全局变量(不会挂载到 window 上)
本文只是我个人的理解,如有错误还请告知,万分感谢
好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
webpack.DefinePlugin与cross-env常用于在项目工程化中定义环境变量,webpack.DefinePlugin用于在编译期定义环境变量,
WINDOWS1、MySQL是有一些环境变量可以设置,可输入:showvariables;可查看当前的环境变量设置;2、这些变量当中有一部分与字符相关的设置,可
什么是环境变量?环境变量通常是指在操作系统当中,用来指定操作系统运行时需要的一些参数。通常为一系列的键值对。path环境变量的作用path环境变量是操作系统外部
配置一下环境变量即可:1.我的电脑-->属性--->高级系统设置-->环境变量2.配置环境变量变量名:NLS_LANG变量值:SIMPLIFIEDCHINESE
查看环境变量查看某一环境变量:比如我们需要查看HOME这个环境变量,我们可以在shell下直接输入echo$HOME,我们可以把所有的环境变量和环境变量的值都打