当前位置:Gxlcms > JavaScript > 一次Webpack配置文件的分离实战记录

一次Webpack配置文件的分离实战记录

时间:2021-07-01 10:21:17 帮助过:49人阅读

前言

随着前端技术的发展,业务逻辑的增多及功能化的繁琐已经成为前端人员最烧脑的问题。前端自动化构建工具的出现,为前端人员带来了项目构建上的福音,成为每个前端工程师必回的技术栈,目前比较流行的Webpack以万物皆模块的思想构建我们的前端项目,同样也是笔者正在使用的一个前端自动化构建工具。

Webpack对于每个前端人员来说都不会怎么陌生,它将每一个静态文件当做一个模块,经过一系列的处理为我们整合出最后的需要的js、css、图片、字体等文件。

webpack.config.js就是Webpack的配置文件,这个文件需要自己在项目根目录下手动建立。

下面话不多说了,来一起看看详细的介绍吧

单个配置文件所造成的问题

本文默认电脑前的你已经了解一些Webpack基础的配置,并懂得了webpack.config.js配置文件的基础搭建。

随着我们业务逻辑的增多,图片、字体、css、ES6以及CSS预处理器和后处理器逐渐的加入到我们的项目中来,进而导致配置文件的增多,使得配置文件书写起来比较繁琐,更严重者(书写特定文件的位置会出现错误)。更由于项目中不同的生产环境和开发环境的配置,使得配置文件变得更加糟糕。

使用单个的配置文件会影响到任务的可重用性,随着项目需求的增长,我们必须要找到更有效地管理配置文件的方法。

管理配置文件的几种方法

配置文件的管理有一下几种方法。

  • 在每个环境的多个文件中维护配置,并通过--config参数将webpack指向每个文件,通过模块导入共享配置。
  • 将配置文件推送到库,然后引用库。
  • 将配置文件推送到工具。
  • 维护单个配置文件的所有配置并在那里进行分支并依赖--env参数。

本文以第四种方式阐述webpack配置文件的分离。

分离配置文件

我们在根目录下创建config文件夹,并创建四个配置文件,分别是:

  • webpack.comm.js   公共环境的配置文件
  • webpack.development.js    开发环境下的配置文件
  • webpack.production.js     生产环境下的配置文件
  • webpack.parts.js      各个配置零件的配置文件


合并配置文件的工具

如果配置文件被分成了许多不同的部分,那么必须以某种方式来组合他们,通常就是合并数组和对象,webpack-merge很好的做到了这一点。

webpack-merge做了两件事:它允许连接数组并合并对象,而不是覆盖组合。

  1. const merge = require("webpack-merge");
  2. merge(
  3. {a : [1],b:5,c:20},
  4. {a : [2],b:10, d: 421}
  5. )
  6. //合并后的结果
  7. {a : [1,2] ,b :10 , c : 20, d : 421}

使用webpack-merge合并配置文件

首先将webpack-merge添加到项目中

  1. npm install webpack-merge --save-dev

首先设置各个配置文件的连接

webpack.config.js

  1. const commConfig = require("./config/webpack.comm");
  2. const developmentConfig = requie("./config/webpack.development");
  3. const productionConfig = require("./config/webpack.development")
  4. const merge = require("webpack-merge");
  5. module.exports = mode => {
  6. if(mode === "production"){
  7. return merge(commConfig,productionConfig,{mode});
  8. }
  9. return merge(commConfig,developmentConfig,{mode});
  10. }

上面代码利用mode的值来判断是开发环境还是生产环境

webpack.comm.js

  1. const merge = require("webpack-merge");
  2. const parts = require("./webpack.parts") //引入配置零件文件
  3. const config = {
  4. //书写公共配置
  5. }
  6. module.exports = merge([
  7. config,
  8. parts......
  9. ])

webpack.production.js

  1. const merge = require("webpack-merge");
  2. const parts = require("./webpack.parts"); //引入配置零件文件
  3. const config = {
  4. //书写公共配置
  5. }
  6. modules.exports = merge([
  7. config,
  8. parts......
  9. ])

webpack.development.js

  1. const merge = require("webpack-merge");
  2. const parts = require("./webpack.parts"); //引入配置零件文件
  3. const config = {
  4. //书写公共配置
  5. }
  6. modules.exports = merge([
  7. config,
  8. parts......
  9. ])

使用--env值传参

使用--env允许将字符串传递给配置。我们来修改下package.json

  1. "dev": "webpack --env development ",
  2. "prod": "webpack --env production",
  3. "dev:server": "webpack-dev-server --env development "

这样就使得env参数mode环境参数传入到webpack.config.js中,就可以判断是生产环境还是开发环境。

如何写出可配置的webpack.parts.js

上面可以看出我们新建了一个webpack.parts.js文件,这个文件中主要是存放我们的一些配置零件。如何写出可配置,可拔插的配置零件。就是我们这个文件的最重要的部分。

以loadCSS为例:

  1. exports.loadCSS = ({reg = /\.css$/,include,exclude,uses = []} = {}) => ({
  2. module : {
  3. rules:[{
  4. test : reg,
  5. include,
  6. exclude,
  7. use[{
  8. loader : "style-loader",
  9. },{
  10. loader : "css-loader",
  11. }].concat(uses),
  12. }]
  13. }
  14. })

上面代码中,利用exports导出单个配置零件,通过解构赋值来传入参数。使用数组的concat来连接外部导入的loader。参数解析:

  • reg:表示loader匹配的test正则,默认为css,这里可以是(less、sass、stylus)。
  • include:表示所要打包的文件夹。
  • exclude:表示要跳过打包的文件夹。
  • uses:外部导入的loader。

在webpack.development.js中引入

  1. module.exports = merge([
  2. config,
  3. parts.loadCSS({
  4. reg : /\.less/,
  5. use : ["less-loader"]
  6. }),
  7. parts.loadCSS(),
  8. ])

分离配置文件的好处

配置文件拆分可以是我们继续扩展配置。最重要的收益是我们可以提取不同目标之间的共性。并且还可以识别要组合的较小配置部件,这些配置不见可以推送到自己的软件包以跨项目使用。还可以将配置作为依赖项进行管理,而不是在多个项目中复制类似的配置。

我自己的parts配置

展示一部分我自己的部件配置,由于在学习阶段,不足的地方还望大佬们提出,学习进步。

  1. /**
  2. * @name 本地服务器配置
  3. * @param host 打开的url
  4. * @param port 打开url的端口号
  5. *
  6. */
  7. exports.devServer = ({ host, port} = {}) => ({
  8. devServer : {
  9. stats : "errors-only",
  10. host,
  11. port,
  12. open : true,
  13. overlay : true,
  14. }
  15. })
  16. /**
  17. * @name 未从js中分离的cssLoader配置
  18. * @param reg 匹配文件的后缀名test
  19. * @param include 所要打包的文件夹
  20. * @param exclude 跳过打包的文件夹
  21. * @param uses 所要向loadCSS中添加的loader
  22. */
  23. exports.loadCSS = ({reg = /\.css$/,include,exclude,uses = []} = {}) => {
  24. return {
  25. module: {
  26. rules: [{
  27. test: reg,
  28. use: [{
  29. loader: "style-loader"
  30. }, {
  31. loader: "css-loader"
  32. }].concat(uses),
  33. include,
  34. exclude,
  35. }]
  36. },
  37. }
  38. }
  39. /**
  40. * @name 从js中分离的cssLoader配置
  41. * @param reg 匹配文件的后缀名test
  42. * @param include 所要打包的文件夹
  43. * @param exclude 跳过打包的文件夹
  44. * @param uses 所要向loadCSS中添加的loader
  45. * */
  46. const MiniCssExtrectPlugin = require("mini-css-extract-plugin");
  47. exports.extractCSS = ({reg = /\.css$/,include,exclude,uses = []} = {}) => {
  48. const plugin = new MiniCssExtrectPlugin({
  49. filename : "styles/[name]-[hash:5].css",
  50. })
  51. return {
  52. module: {
  53. rules: [{
  54. test: reg,
  55. use: [{
  56. loader: MiniCssExtrectPlugin.loader,
  57. options : {
  58. publicPath : "../"
  59. }
  60. }, {
  61. loader: "css-loader"
  62. }].concat(uses),
  63. include,
  64. exclude,
  65. }]
  66. },
  67. plugins : [
  68. plugin,
  69. ]
  70. }
  71. }
  72. /**
  73. * @name css tree-shaking:将没有用到的css扔掉
  74. * @param paths 监听css tree-shaking 的文件名
  75. */
  76. const PurifyCssPlugin = require("purifycss-webpack");
  77. exports.purifyCSS = ({paths}) => ({
  78. plugins : [
  79. new PurifyCssPlugin({paths})
  80. ]
  81. })
  82. /**
  83. * @name autoprefixer 为css样式添加浏览器前缀
  84. * @author wangchong
  85. */
  86. exports.autoprefix =() =>({
  87. loader : "postcss-loader",
  88. options : {
  89. plugins : () => [require("autoprefixer")]
  90. }
  91. })
  92. /**
  93. * @name loadImage :打包图片资源
  94. * @param include 所要打包的文件夹
  95. * @param exclude 跳过打包的文件夹
  96. * @param options loader的options配置
  97. */
  98. exports.loadImage = ({include,exclude,options} = {}) => ({
  99. module : {
  100. rules : [
  101. {
  102. test : /\.(png|jpg)$/,
  103. include,
  104. exclude,
  105. use : {
  106. loader : "url-loader",
  107. options,
  108. }
  109. }
  110. ]
  111. }
  112. })

文章总结自:Surviejs-webpack。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

人气教程排行