做者:水涛
座右铭:天行健,君子以自强不息
自白:我写博文上来蹭蹭就是干,我忽然以为我须要幽默一点了,好了,下面咱们说正经的javascript
DefinePlugin
容许建立一个在编译时能够配置的全局常量。这可能会对开发模式和生产模式的构建容许不一样的行为很是有用。若是在开发构建中,而不在发布构建中执行日志记录,则可使用全局常量来决定是否记录日志。这就是 DefinePlugin
的用处,设置它,就能够忘记开发环境和生产环境构建的规则。html
new webpack.DefinePlugin({ // Definitions... });
每一个传进 DefinePlugin
的键值都是一个标志符或者多个用 .
链接起来的标志符。html5
typeof
,它会被定义为 typeof 调用。这些值会被内联进那些容许传一个代码压缩参数的代码中,从而减小冗余的条件判断。java
new webpack.DefinePlugin({ PRODUCTION: JSON.stringify(true), VERSION: JSON.stringify('5fa3b9'), BROWSER_SUPPORTS_HTML5: true, TWO: '1+1', 'typeof window': JSON.stringify('object'), 'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV) });
console.log('Running App version ' + VERSION); if(!BROWSER_SUPPORTS_HTML5) require('html5shiv');
When defining values for
process
prefer'process.env.NODE_ENV': JSON.stringify('production')
overprocess: { env: { NODE_ENV: JSON.stringify('production') } }
. Using the latter will overwrite theprocess
object which can break compatibility with some modules that expect other values on the process object to be defined.webpack
注意,由于这个插件直接执行文本替换,给定的值必须包含字符串自己内的实际引号。一般,有两种方式来达到这个效果,使用
'"production"'
, 或者使用JSON.stringify('production')
。web
一、官网中说的“可使用这个插件定义一些编译时的全局常量”浏览器
编译时这几个字很重要,webpack会根据配置文件将将入口文件解析、打包、转译为浏览器可识别的js文件最后输出到出口,而他转译的过程其实就是webpack编译过程,也就是官网说的编译时。函数
二、官网中说的“插件会直接替换文本”ui
> 在编译过程当中(转译为浏览器可识别的js文件时),会将源文件中全部用到DefinePlugin中定义的常量的地方直接替换为对应的值文本,注意,是文本不管语义上是对象仍是字符串仍是函数,都直接做为文本替换过去。插件
假设在配置文件中定义编译时全局常量 process.env.firstName
new webpack.DefinePlugin({ 'process.env.firstName': JSON.stringify("ShuiTao") });
console.log(process.env.firstName)
console.log('ShuiTao')
能够看到,在编译生成新js文件时,将process.env.firstName
常量直接替换成了他对应的值文
假设在配置文件中定义编译时全局常量 process.env.info
new webpack.DefinePlugin({ 'process.env.info': JSON.stringify({ name:'ShuiTao', age:23 }) });
console.log(process.env.info)
console.log({ name:'ShuiTao', age:23 })
能够看到,在编译生成新js文件时,将process.env.info
常量直接替换成了他对应的值文本
假设在配置文件中定义编译时全局常量 process.env.info
new webpack.DefinePlugin({ 'process.env.info': JSON.stringify({ name:'ShuiTao', age:23 }) });
console.log(process.env); console.log(process.env.info);
console.log(process.env); console.log({ name:'ShuiTao', age:23 });
能够看到,在编译生成新js文件时,将process.env.info
常量直接替换成了他对应的值文本,而process.env
没有被替换,由于没有在DefinePlugin中定义process.env
运行最终转译后的js文件时,process.env
指向的是Node中的process
,在process.env
中找不到info
属性,足以证实在DefinePlugin定义的process.env.info
和Node
的process
没有任何关系,他只是一个在插件中定义的编译时的常量,编译后就已经被替换了,所以 理解清楚概念,他只是个编译时的常量,转译后就会被替换,只是刚好常量的名字是process.env.info