webpack.config.js 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  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. * PWA 渐进式网络开发应用程序
  16. * workbox --> workbox-webpack-plugin
  17. * package.json中eslintConfig需配置如下:
  18. * "env":{
  19. "browser": true //可以使用浏览器全局变量
  20. }
  21. 必须运行在服务器上
  22. */
  23. //复用loader
  24. const commonCssLoader = [
  25. MiniCssExtractPlugin.loader, //提取css
  26. 'css-loader',
  27. {
  28. loader: 'postcss-loader', //兼容性处理
  29. options: {
  30. // 旧版本配置
  31. /* ident: 'postcss',
  32. plugins: () => [
  33. require('postcss-preset-env')() //读取package.json里browserslist配置,默认加载根据node_env加载production
  34. ] */
  35. postcssOptions: {
  36. plugins: [
  37. [
  38. 'postcss-preset-env'
  39. ],
  40. ],
  41. }
  42. }
  43. }
  44. ]
  45. module.exports = {
  46. entry: './src/js/index.js',
  47. output: {
  48. filename: 'js/built.[contenthash:10].js',
  49. path: resolve(__dirname, 'build')
  50. },
  51. module:{
  52. rules:[{
  53. // 以下loader只会匹配一个 提高效率
  54. // 注意:不能有两个配置处理同一种文件
  55. oneOf:[
  56. {
  57. test:/\.css$/,
  58. use: [
  59. ...commonCssLoader
  60. ]
  61. },
  62. {
  63. test:/\.less$/,
  64. use:[
  65. ...commonCssLoader,
  66. 'less-loader'
  67. ]
  68. },
  69. { //兼容性处理
  70. test:/\.js$/,
  71. exclude: /node_modules/,
  72. loader: 'babel-loader',
  73. options:{
  74. // 预设:指示babel做怎样的兼容性处理
  75. presets:[
  76. [
  77. '@babel/preset-env',
  78. {
  79. useBuiltIns: 'usage',
  80. corejs:{
  81. version:3
  82. },
  83. targets:{
  84. chrome: '60',
  85. firefox: '60',
  86. ie:'9',
  87. safari: '10',
  88. edge: '17'
  89. }
  90. }
  91. ]
  92. ],
  93. //开启babel缓存
  94. // 第二次构建时,会读取之前的缓存
  95. cacheDirectory: true
  96. }
  97. },
  98. //处理图片
  99. {
  100. test:/\.(jpg|png|jpeg|gif)/,
  101. loader:'url-loader',
  102. options:{
  103. limit:8*1024,
  104. name:'[hash:10].[ext]',
  105. outputPath:'imgs',
  106. esModule: false,
  107. }
  108. },
  109. //html 处理
  110. {
  111. test:/\.html$/,
  112. loader:'html-loader'
  113. },
  114. //其他资源处理
  115. {
  116. exclude:/\.(js|css|less|html|jpg|jpeg|png|gif)/,
  117. loader:'file-loader',
  118. options:{
  119. outputPath:'media',
  120. esModule: false,
  121. name: '[hash:10].[ext]'
  122. },
  123. type: 'javascript/auto'
  124. }
  125. ]
  126. }]
  127. },
  128. plugins:[
  129. new MiniCssExtractPlugin({
  130. filename: 'css/built.[contenthash:10].css'
  131. }),
  132. new OptimizeCssAssetsWebpackPlugin(),
  133. new EsLintPlugin({
  134. extensions: ['js', 'json', 'coffee'],
  135. //exclude: '/node_modules/',
  136. fix:true
  137. }),
  138. new HtmlWebpackPlugin({
  139. template: './src/index.html',
  140. minify:{
  141. collapseWhitespace:true,
  142. removeComments:true
  143. }
  144. }),
  145. new WorkboxWebpackPlugin.GenerateSW({
  146. /**
  147. * 帮助sericeworker快速启动
  148. * 删除旧的serviceworker
  149. * 生成serviceworker配置文件 示例 ./src/js/index.js
  150. */
  151. clientsClaim: true,
  152. skipWaiting: true
  153. })
  154. ],
  155. mode:'production',
  156. devtool:'source-map'
  157. }