webpack.config.js 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. const { resolve } = require("path");
  2. //提取css
  3. const MiniCssExtractPlugin = require('mini-css-extract-plugin');
  4. //压缩css
  5. const OptimizeCssAssetsWebpackPlugin = require('optimize-css-assets-webpack-plugin')
  6. //js语法检查
  7. const EsLintPlugin = require('eslint-webpack-plugin')
  8. //html资源处理
  9. const HtmlWebpackPlugin = require('html-webpack-plugin')
  10. //设置node环境变量 postcss-loader会根据它读取package.js里的browserslist配置
  11. process.env.NODE_ENV = 'development'
  12. //
  13. const WorkboxWebpackPlugin = require('workbox-webpack-plugin')
  14. /**
  15. *
  16. */
  17. //复用loader
  18. const commonCssLoader = [
  19. MiniCssExtractPlugin.loader, //提取css
  20. 'css-loader',
  21. {
  22. loader: 'postcss-loader', //兼容性处理
  23. options: {
  24. // 旧版本配置
  25. /* ident: 'postcss', s
  26. plugins: () => [
  27. require('postcss-preset-env')() //读取package.json里browserslist配置,默认加载根据node_env加载production
  28. ] */
  29. postcssOptions: {
  30. plugins: [
  31. [
  32. 'postcss-preset-env'
  33. ],
  34. ],
  35. }
  36. }
  37. }
  38. ]
  39. module.exports = {
  40. entry: './src/js/index.js',
  41. output: {
  42. filename: 'js/built.[contenthash:10].js',
  43. path: resolve(__dirname, 'build')
  44. },
  45. module:{
  46. rules:[{
  47. // 以下loader只会匹配一个 提高效率
  48. // 注意:不能有两个配置处理同一种文件
  49. oneOf:[
  50. {
  51. test:/\.css$/,
  52. use: [
  53. ...commonCssLoader
  54. ]
  55. },
  56. {
  57. test:/\.less$/,
  58. use:[
  59. ...commonCssLoader,
  60. 'less-loader'
  61. ]
  62. },
  63. { //兼容性处理
  64. test:/\.js$/,
  65. exclude: /node_modules/,
  66. use:[
  67. //开启多进程打包
  68. /**
  69. * 进程启动大概600ms
  70. * 进程通信也需开销
  71. * 所以适合工作消耗事件比较长,需要多进程打包
  72. */
  73. //'thread-loader',
  74. {
  75. loader: 'babel-loader',
  76. options:{
  77. // 预设:指示babel做怎样的兼容性处理
  78. presets:[
  79. [
  80. '@babel/preset-env',
  81. {
  82. useBuiltIns: 'usage',
  83. corejs:{
  84. version:3
  85. },
  86. targets:{
  87. chrome: '60',
  88. firefox: '60',
  89. ie:'9',
  90. safari: '10',
  91. edge: '17'
  92. }
  93. }
  94. ]
  95. ],
  96. //开启babel缓存
  97. // 第二次构建时,会读取之前的缓存
  98. cacheDirectory: true
  99. }
  100. }
  101. ]
  102. },
  103. //处理图片
  104. {
  105. test:/\.(jpg|png|jpeg|gif)/,
  106. loader:'url-loader',
  107. options:{
  108. limit:8*1024,
  109. name:'[hash:10].[ext]',
  110. outputPath:'imgs',
  111. esModule: false,
  112. }
  113. },
  114. //html 处理
  115. {
  116. test:/\.html$/,
  117. loader:'html-loader'
  118. },
  119. //其他资源处理
  120. {
  121. exclude:/\.(js|css|less|html|jpg|jpeg|png|gif)/,
  122. loader:'file-loader',
  123. options:{
  124. outputPath:'media',
  125. esModule: false,
  126. name: '[hash:10].[ext]'
  127. },
  128. type: 'javascript/auto'
  129. }
  130. ]
  131. }]
  132. },
  133. plugins:[
  134. new MiniCssExtractPlugin({
  135. filename: 'css/built.[contenthash:10].css'
  136. }),
  137. new OptimizeCssAssetsWebpackPlugin(),
  138. new EsLintPlugin({
  139. extensions: ['js', 'json', 'coffee'],
  140. //exclude: '/node_modules/',
  141. fix:true
  142. }),
  143. new HtmlWebpackPlugin({
  144. template: './src/index.html',
  145. minify:{
  146. collapseWhitespace:true,
  147. removeComments:true
  148. }
  149. }),
  150. new WorkboxWebpackPlugin.GenerateSW({
  151. /**
  152. * 帮助sericeworker快速启动
  153. * 删除旧的serviceworker
  154. * 生成serviceworker配置文件 示例 ./src/js/index.js
  155. */
  156. clientsClaim: true,
  157. skipWaiting: true
  158. })
  159. ],
  160. mode:'production',
  161. devtool:'source-map'
  162. }