Webpack 原理与实践之如何优化 Webpack 的打包速度和构建效率

开发 前端
对于不同环境的配置中,需要先导入公共配置文件,我们在后面对前面的属性进行覆盖,但是Object.assign会把之前的完全覆盖。

写在前面

在前面文章中介绍了一些webpack配置和特性,能够提升我们的开发效率,让开发者能够有着更好的开发体验。但是,也伴随这新的问题出现,打包结果会变得越来越臃肿,因为在这个过程中Webpack为了实现这些特性,会自动往打包结果中添加一些内容。例如之前使用的Source Map会在输出结果中添加额外的代码实现相应的功能,但是生产环境和开发环境有所差异,对于生产环境而言注重的运行效率,在开发环境注重的是开发效率。为此,wepack在4.0版本提供了module模式,方便我们在各种环境下进行不同的配置。

不同环境的配置

创建不同的环境配置的方式主要有两种:

  • 在配置文件中添加相应的判断条件,根据环境不同导出不同配置
  • 为不同环境单独添加一个配置文件,一个环境对应一个配置文件
  1. //webpack.config.js  
  2. module.exports = (env,arg)=>{ 
  3.   //不同模式下公共配置 
  4.   const config = { 
  5.    
  6.   } 
  7.    
  8.   if(env === "development"){ 
  9.     //为config添加开发模式下的特殊配置 
  10.     config.mode = "development" 
  11.     config.devtool = "cheap-eval-module-source-map" 
  12.   }else if(env === "production"){ 
  13.     //为config添加生产模式下的特殊配置 
  14.     config.mode = "production" 
  15.     config.devtool = "nosources-source-map" 
  16.   } 
  17.   return config 

通过上面的配置文件,我们可以在终端运行根据不同环境判断执行不同的配置,对于大型环境适合在不同环境条件下使用不同的配置。我们可以将公共模式的文件抽取出来,分别设置开发环境和生产环境下的模式文件。

  1. //webpack.common.js 
  2. module.exports = { 
  3.   //公共配置 
  4.  
  5. //webpack.prod.js 
  6. const common = require("./webpack.common"
  7. module.exports = Object.assign(common,{ 
  8.   //生产模式配置 
  9. }) 
  10.  
  11. //webpack.dev.js 
  12. const common = require("./webpack.common"
  13. module.exports = Object.assign(common,{ 
  14.   //开发模式配置 
  15. }) 

对于不同环境的配置中,需要先导入公共配置文件,我们在后面对前面的属性进行覆盖,但是Object.assign会把之前的完全覆盖。对于plugins数组我们需要在原先的基础中添加配置,为此我们需要lodash的merge函数或者webpack社区的webpack-merge插件进行使用。

  1. //webpack.common.js 
  2. module.exports = { 
  3.   //公共配置 
  4.  
  5. //webpack.prod.js 
  6. const merge = require("webpack-merge"
  7. const common = require("./webpack.common"
  8. module.exports = merge(common,{ 
  9.   //生产模式配置 
  10. }) 
  11.  
  12. //webpack.dev.js 
  13. const merge = require("webpack-merge"
  14. const common = require("./webpack.common"
  15. module.exports = merge(common,{ 
  16.   //开发模式配置 
  17. }) 

在分别配置完成过后,回到命令行终端,尝试运行webpack打包,不过因为这里已经没有默认的配置文件,所以需要通过--config参数来指定所使用的配置文件路径。

  1. $ webpack --config webpack.prod.js 

生产环境下的优化插件

在weback4中新增的production模式下,内部已经自动开启了很多通用的优化功能,对于使用者而言可以开箱即用。对于学习者而言,开箱即用会导致忽略很多需要了解的东西,以至于出现问题无从下手。

  1. const webpack = require("webpack"); 
  2.  
  3. module.exports = { 
  4.   //其他配置 
  5.   plugins:[ 
  6.     new webpack.DefinePlugin({ 
  7.       API_BASE_URL:"https://api.example.com" 
  8.     }) 
  9.   ] 

我们看到值要求的是一个代码片段:

  1. const webpack = require("webpack"); 
  2.  
  3. module.exports = { 
  4.   //其他配置 
  5.   plugins:[ 
  6.     new webpack.DefinePlugin({ 
  7.       API_BASE_URL:JSON.stringify("https://api.example.com"
  8.     }) 
  9.   ] 

参考文章

《webpack原理与实践》

《webpack中文文档》

写在最后

本文介绍了如何在webpack添加不同环境的配置文件,以及在生产模式打包时经常用到的几个插件。我们可以针对生产环境下的打包进行优化,能够提升生产环境的运行效率。

 

责任编辑:武晓燕 来源: 前端万有引力
相关推荐

2021-12-16 22:02:28

webpack原理模块化

2021-12-25 22:29:04

WebpackRollup 前端

2019-03-15 15:00:49

Webpack构建速度前端

2021-12-20 00:03:38

Webpack运行机制

2021-12-19 07:21:48

Webpack 前端插件机制

2021-12-15 23:42:56

Webpack原理实践

2021-07-04 22:22:23

Webpack5前端工具

2024-05-27 00:00:01

2021-12-21 14:00:25

WebpackDevServer的开发

2021-12-22 22:44:49

Webpack热替换模块

2021-12-17 00:02:28

Webpack资源加载

2017-03-24 10:56:21

Webpack技巧建议

2021-09-06 06:45:06

Webpack优化MindMaster

2024-09-27 11:46:51

2017-05-02 16:29:11

Webpack技巧建议

2021-05-10 08:34:47

webpack手段devServer

2021-06-28 05:59:17

Webpack 前端打包与工程化

2020-08-05 08:21:41

Webpack

2020-09-19 21:26:56

webpack

2019-03-26 10:02:16

WebpackJavascript前端
点赞
收藏

51CTO技术栈公众号