webpack
webpack.DefinePlugin介绍
基本用法
这个插件用来定义全局变量,在webpack打包的时候会对这些变量做替换。
先看个例子
|
|
编译完的结果如下:
|
|
可以看到代码中 SOMETHINE 被直接替换为 This is something we needed. 但是我们的本意中 SOMETHINE 是一个字符串,而直接替换后却不是一个字符串。怎么办呢?
方法一:可以将 SOMETHINE 的值写成
|
|
方法二: 借助 JSON.tringify ,转为字符串
|
|
推荐使用方法二,它不仅可以处理字符串,还可以处理Object中的字符串和Array。如下:
|
|
编译结果
|
|
还剩下 Number 和 Boolean 两种变量类型,对于这两种类型,就不像上面介绍的这么麻烦了,直接写就行
|
|
编译结果
|
|
实际运用
介绍了这么多,在实际使用中, DefinePlugin 最为常用的用途就是用来处理我们开发环境和生产环境的不同。比如一些 debug 的功能在生产环境中需要关闭、开发环境中和生产环境中 api 地址的不同。以 vue-cli 生成的打包文件为例子,来看看在实际中的使用。
vue-cli 生成的目录中编译、打包相关的有两个文件夹 build 和 config 。
build 文件夹中找到 wbepack.dev.conf.js 和 webpack.prod.conf.js ,这两个文件中都通过 DefinePlugin 插件定义了 process.env 这个变量
|
|
config 中对 env 的定义分别放在 config/dev.env.js 和 config/prod.env.js 中
|
|
到此可以看到,在 wbepack.dev.conf.js 中最终为
|
|
在 webpack.prod.conf.js 中最终为
|
|
在我们的代码中,如果部分只是在开发环境下才执行的逻辑,那么可以通过下面的方式
|
|
Webpack.merge插件
webpack-merge插件可以用来merge两个webpack的配置。它的底层引用了lodash中的merge,但针对webpack的特点,专门对loaders,preLoaders,postLoaders专门做了处理。
一般情况下,对于以下两个module
|
|
进行merge(module, moduleExtend)后会得到如下结果:
|
|
因为loaders是数组,所以结果中的css的loader信息丢失了。所以为了保证merge之后,loaders,preLoaders,postLoaders中的内容不会丢失,webpack-merge中对于loaders,preLoaders,postLoaders进行了特殊处理,采用concat对数组内容进行合并
|
|
如此,merge的结果为
|
|
但是如果遇到两个test值相同的loader时,仅仅用concat的话,会产生两条结果
|
|
这时对于js文件会先用babel-loader处理,然后再用coffee-loader处理。但是更多的,我们希望merge的结果是,后一个可以覆盖掉前一个。此外,在loaders中,除了可以写loader:’coffee’,还会有loaders:[‘xx’]的形式,如果一律采用concat的形式,显然过于粗暴了。所以,webpack-merge提供了更为聪明的的merge.smart函数,可以将test值相同的loader(preLoaders,postLoaders)进行合并。
- 对于loader,后面的会覆盖前面的属性
|
|
- loaders将会合并为一个去重后的数组
|
|
注意:对于loaders中带参数的形式,如babel?plugins[]=object-assign,在smart merge时会认为和babel、babel?…为同一类,后一个会对前一个产生覆盖
|
|
- 如果后一个loaders,前一个为loader,则merge时会将loader转化为loaders,然后进行merge
|
|
- 如果后一个为loader,前一个为loaders,则merge的结果为loader
|
|
注意:include和exclude的配置同时也会影响loader是否会被合并。如果两个loaders有不同的include或者exclude值(后一个loaders不包含include或exclude除外),那么loaders最终不会进行合并,而是像merge中进行了concat。
|
|