Node 环境变量 process.env.NODE_ENV 之webpack应用
转载来源:https://github.com/wfzong/NODE_ENV_TEST,这里还有源码可以学习,谢谢原作者的分享!
对于process.env.NODE_ENV困惑起因为在配置webpack时,明明配置了:process.env.NODE_ENV为production,如下:
new webpack.DefinePlugin({
'process.env.NODE_ENV': JSON.stringify('production')
}),
new webpack.optimize.UglifyJsPlugin({
compress: process.env.NODE_ENV === 'production'
})
但最终并没有生效,得到的 compress:false,本着有困难就gg的原则,找找找各种文档,总算理清了其中的关系。
文档中说:
DefinePlugin 在原始的源码中执行查找和替换操作,在导入的代码中,任何出现 process.env.NODE_ENV的地方都会被替换为"production"。因此,形如if (process.env.NODE_ENV !== 'production') console.log('...') 的代码就会等价于 if (false) console.log('...') 并且最终通过UglifyJS等价替换掉。
也就是说,webpack config文件中定义的变量:
new webpack.DefinePlugin({
'process.env.NODE_ENV': JSON.stringify('production')
})
是为了你将要打包的文件中用的。 那如何在webpack config文件中使用 process.env.NODE_ENV 呢?答案是corss-env
进入主题
如上信息看着也许很乱,那通过一个实例来一步步验证一下吧~ 第一步:
npm init
生成一下package.json,然后install需要的模块:
npm install --save-dev webpack clean-webpack-plugin html-webpack-plugin webpack-merge cross-env
一、接下来进入主题,开始配置 webpack.config.js:
const path = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const config = {
entry:path.join(__dirname,"src/app.js"),
output:{
path:path.join(__dirname,"dist"),
filename:"bundle.js"
},
plugins:[
new HtmlWebpackPlugin()
]
}
module.exports = config
console.log("process.env.NODE_ENV 的值是(webpack.config.js):"+ process.env.NODE_ENV)
然后新建文件 src/app.js
console.log("app test")
console.log("process.env.NODE_ENV 的值是(app.js):"+ process.env.NODE_ENV)
一切准备好后,给package.json加一行 :"build":"webpack"
"scripts": {
"build":"webpack"
}
然后执行:npm run build,控制台会有如下输出:
λ npm run build
> node@1.0.0 build D:\works\test\VUE\NODE_ENV
> webpack
process.env.NODE_ENV 的值是(webpack.config.js):undefined
Hash: f323df4deba684f859b8
Version: webpack 3.4.1
Time: 589ms
Asset Size Chunks Chunk Names
bundle.js 8.18 kB 0 [emitted] main
index.html 182 bytes [emitted]
[0] ./src/app.js 97 bytes {0} [built]
+ 1 hidden module
Child html-webpack-plugin for "index.html":
[2] (webpack)/buildin/global.js 509 bytes {0} [built]
[3] (webpack)/buildin/module.js 517 bytes {0} [built]
+ 2 hidden modules
由于没有进行任何配置,所以上面的输出中给出的信息是:
process.env.NODE_ENV 的值是(webpack.config.js):undefined
通过浏览器访问/dist/index.html,控制台有如下信息输出:
app test process.env.NODE_ENV 的值是(app.js):undefined
也就是说,在/src/app.js里,process.env.NODE_ENV 也未定义
二、通过webpack -p参数控制
在package.json里增加一行:
"scripts": {
"build":"webpack",
"build-p":"webpack -p"
}
然后执行: npm run build-p 命令行输出没有任何变化,任然是:
process.env.NODE_ENV 的值是(webpack.config.js):undefined
但通过浏览器访问/dist/index.html,控制台有如下信息输出:
app test process.env.NODE_ENV 的值是(app.js):production
也就是说,通过webpack -p,然process.env.NODE_ENV值传递给app.js了(webpack.config.js并未获取到~)
三、通过 webpack.DefinePlugin 定义
接着看,假设webpack.config.js是基本定义,针对上线产品,额外定义了webpack.config.prod.js,然后通过webpack-merge合并两个配置文件webpack.config.prod.js如下:
const webpack = require('webpack')
const merge = require('webpack-merge')
const config = require("./webpack.config.js")
module.exports = merge(config,{
plugins:[
new webpack.DefinePlugin({
'process.env.NODE_ENV': JSON.stringify('production')
}),
new webpack.optimize.UglifyJsPlugin({
compress: process.env.NODE_ENV === 'production'
})
]
})
console.log("process.env.NODE_ENV 的值是(webpack.config.prod.js):"+ process.env.NODE_ENV)
可以看到,在这个文件里,我们通过webpack.DefinePlugin定义了process.env.NODE_ENV,现在在package.json里增加一行,并通过--config指定配置文件:
"scripts": {
"build":"webpack",
"build-p":"webpack -p",
"build-prod":"webpack --config webpack.config.prod.js"
},
然后执行:npm run build-prod 命令行里有如下输出:
process.env.NODE_ENV 的值是(webpack.config.js):undefined process.env.NODE_ENV 的值是(webpack.config.prod.js):undefined
通过浏览器访问/dist/index.html,控制台有如下信息输出:
app test process.env.NODE_ENV 的值是(app.js):production
这次没有用webpack -p参数,而是在webpack.config.prod.js里通过webpack.DefinePlugin定义了process.env.NODE_ENV,取得了相当的效果。
四、在config文件里获取NODE_ENV值
解决了在app.js获取NODE_ENV的值,如何在webpack配置文件里获取NODE_ENV的值呢,这样就可以根据不同的值定义相关的参数了,如上所述,答案是:corss-env,在package.json里增加一行:
"scripts": {
"build":"webpack",
"build-p":"webpack -p",
"build-prod":"webpack --config webpack.config.prod.js",
"build-cross-env":"cross-env NODE_ENV=production webpack"
}
这里执行:npm run build-cross-env,命令行里会得到:
process.env.NODE_ENV 的值是(webpack.config.js):production
通过浏览器访问/dist/index.html,控制台有如下信息输出:
app test process.env.NODE_ENV 的值是(app.js):undefined
可以看到,通过cross-env NODE_ENV=production,然信息传递给了webpack的配置文件,但app.js并没有获取到。
五、总结
很自然的想到,如果里要在配置文件里和业务代码里,都获取到NODE_ENV,那将3、4结合起来:
"scripts": {
"build":"webpack",
"build-p":"webpack -p",
"build-prod":"webpack --config webpack.config.prod.js",
"build-cross-env":"cross-env NODE_ENV=production webpack",
"build-cross-env-with-prod":"cross-env NODE_ENV=production webpack --config webpack.config.prod.js"
}
运行: npm run build-cross-env-with-prod,命令行中有显示:
process.env.NODE_ENV 的值是(webpack.config.js):production process.env.NODE_ENV 的值是(webpack.config.prod.js):production
通过浏览器访问/dist/index.html,控制台有如下信息输出:
app test process.env.NODE_ENV 的值是(app.js):production
Node 环境变量 process.env.NODE_ENV 之webpack应用的更多相关文章
- webpack配置中环境变量-process.env. NODE_ENV
背景 webpack有一特性就是可以让使用者灵活的在不同环境(开发环境,生产环境等)进行相应的特性的策略打包,比如: 是否使用反向代理使用接口,针对不同的静态资源(如图片等)是直接拷贝还是进行打包编译 ...
- Node环境变量 process.env 的那些事儿
前言 这两天在和运维GG搞部署项目的事儿. 碰到一个问题就是,咱们的dev,uat,product环境的问题. 因为是前后端分离,所以在开发和部署的过程中会有对后端接口的域名的切换问题.折腾了一下午, ...
- Node.js中环境变量process.env详解
Node.js中环境变量process.env详解process | Node.js API 文档http://nodejs.cn/api/process.html官方解释:process 对象是一个 ...
- node与webpack的process.env.NODE_ENV
先看两篇文章 1.前端工程项目的NODE_ENV 2. Node 环境变量 process.env.NODE_ENV 之webpack应用 3.process.env.NODE_ENV 下面全部是在w ...
- 关于如何在部署环境修改process.env & 本地测试
前言 最近在搞一些监控的东西, 需要根据不同的环境上报到不同的地址,中间遇到了一些问题,在这里简单总结分享下. 关于process.env 假如你对process.env 相关的概念还不熟悉, 请移步 ...
- node服务开发环境判断和启动端口指定---process.env.NODE_ENV
在node启动的时候我们需要在代码里面判断服务器运行环境 可以根据process.env.NODE_ENV来判断 一.开发环境的判断 1.安装 npm i -g cross-env 2.启动 cros ...
- 理解webpack之process.env.NODE_ENV详解(十八)
在node中,有全局变量process表示的是当前的node进程.process.env包含着关于系统环境的信息.但是process.env中并不存在NODE_ENV这个东西.NODE_ENV是用户一 ...
- 理解webpack中的process.env.NODE_ENV
参考资料 一. process 要理解 process.env.NODE_ENV 就必须要了解 process,process 是 node 的全局变量,并且 process 有 env 这个属性,但 ...
- process.env.NODE_ENV理解
1.理解NODE_ENV 在node中,有全局变量process表示的是当前的node进程.process.env包含着关于系统环境的信息.但是process.env中并不存在NODE_ENV这个东西 ...
随机推荐
- 探索PowerShell 【十三】WMI对象
原文:探索PowerShell ][十三]WMI对象 我记得在xp时代,经常使用的工具有一个叫做WMI Administrative Tools,是微软官方提供的用来查看.编辑WMI对象的,只是现在好 ...
- gRPC源码分析(c++)
首先需要按照grpc官网上说的办法从github上下载源码,编译,然后跑一跑对应的测试代码.我分析的代码版本为v1.20.0. 在cpp的helloworld例子中,client端,第一个函数是创建c ...
- python3 整数类型PyLongObject 和PyObject源码分析
python3 整数类型PyLongObject 和PyObject源码分析 一 测试环境介绍和准备 测试环境: 操作系统:windows10 Python版本:3.7.0 下载地址 VS版本:vs2 ...
- python 包以及循环导入
包的认识 包通过文件夹来管理一系列功能相近的模块 包:一系列模块的集合体重点:包中一定有一个专门用来管理包中所有模块的文件包名:存放一系列模块的文件夹名字包名(包对象)存放的是管理模块的那个文件的地址 ...
- Linux系统 Cetos 7 中重置root密码
几个月前在自己电脑上面安装了一个Linux 的虚拟机环境,当时是为了测试某一个小功能,用完就扔那里了,长时间没有使用,发现Root密码忘记了,登陆不了,怎么办呢?(ps:如果实际情况中忘记密码的这个服 ...
- git学习02 - log查看&版本回退
1.查看更新记录 git log / git log --pretty=oneline D:\learn\git_test>git log commit a915e7b12076673d778 ...
- postgresSQL 实现数据修改后,自动更新updated_date/ts等字段
1. 需求说明: 实现MYSQL中有on update CURRENT_TIMESTAMP 2. 需求分析 由于数据库迁移需要将MYSQL中的数据迁移到postgresSQL中,由于MYSQL中有on ...
- Python基础学习笔记4-28(持续更新)
Python学习笔记 第一章 计算机基础 1.1 硬件 计算机基本的硬件由:CPU / 内存 / 主板 / 硬盘 / 网卡 / 显卡 等组成,只有硬件但硬件之间无法进行交流和通信.需要操作系统进行协调 ...
- mybatis if test 判断字符串的坑
今天调试一个非常简单的test判断字符串查询语句,怎么调试都是不好用,后来百度才发现,是我写的test标签写错了,我写成: <if test="record.current != nu ...
- MySQL8.0.19主从环境搭建(CentOS7)
默认情况下,复制是异步的,从站不需要永久连接以接收来自主站的更新.根据配置,您可以复制数据库中的所有数据库,所选数据库甚至选定的表. MySQL中复制的优点包括: 横向扩展解决方案 - 在多个从站之间 ...