webpack.config.js 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  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. * 缓存:
  14. * babel缓存
  15. * cacheDirectory: true
  16. * 第二次打包速度更快
  17. * 文件资源缓存 -- 上线代码性能优化
  18. * hash值: 全部文件名修改,而且每次打包都会改变。
  19. * chunkhash:根据chunk生成hash值,当打包来源于同一个chunk,hash值会一样。所以js中引入css是一个chunk,都会变化。
  20. * contenthash:内容不变时,hash不变,所以不同文件,hash值不一样。
  21. */
  22. //复用loader
  23. const commonCssLoader = [
  24. MiniCssExtractPlugin.loader, //提取css
  25. 'css-loader',
  26. {
  27. loader: 'postcss-loader', //兼容性处理
  28. options: {
  29. // 旧版本配置
  30. /* ident: 'postcss',
  31. plugins: () => [
  32. require('postcss-preset-env')() //读取package.json里browserslist配置,默认加载根据node_env加载production
  33. ] */
  34. postcssOptions: {
  35. plugins: [
  36. [
  37. 'postcss-preset-env'
  38. ],
  39. ],
  40. }
  41. }
  42. }
  43. ]
  44. module.exports = {
  45. entry: './src/js/index.js',
  46. output: {
  47. filename: 'js/built.[contenthash:10].js',
  48. path: resolve(__dirname, 'build')
  49. },
  50. module:{
  51. rules:[{
  52. // 以下loader只会匹配一个 提高效率
  53. // 注意:不能有两个配置处理同一种文件
  54. oneOf:[
  55. {
  56. test:/\.css$/,
  57. use: [
  58. ...commonCssLoader
  59. ]
  60. },
  61. {
  62. test:/\.less$/,
  63. use:[
  64. ...commonCssLoader,
  65. 'less-loader'
  66. ]
  67. },
  68. { //兼容性处理
  69. test:/\.js$/,
  70. exclude: /node_modules/,
  71. loader: 'babel-loader',
  72. options:{
  73. // 预设:指示babel做怎样的兼容性处理
  74. presets:[
  75. [
  76. '@babel/preset-env',
  77. {
  78. useBuiltIns: 'usage',
  79. corejs:{
  80. version:3
  81. },
  82. targets:{
  83. chrome: '60',
  84. firefox: '60',
  85. ie:'9',
  86. safari: '10',
  87. edge: '17'
  88. }
  89. }
  90. ]
  91. ],
  92. //开启babel缓存
  93. // 第二次构建时,会读取之前的缓存
  94. cacheDirectory: true
  95. }
  96. },
  97. //处理图片
  98. {
  99. test:/\.(jpg|png|jpeg|gif)/,
  100. loader:'url-loader',
  101. options:{
  102. limit:8*1024,
  103. name:'[hash:10].[ext]',
  104. outputPath:'imgs',
  105. esModule: false,
  106. }
  107. },
  108. //html 处理
  109. {
  110. test:/\.html$/,
  111. loader:'html-loader'
  112. },
  113. //其他资源处理
  114. {
  115. exclude:/\.(js|css|less|html|jpg|jpeg|png|gif)/,
  116. loader:'file-loader',
  117. options:{
  118. outputPath:'media',
  119. esModule: false,
  120. name: '[hash:10].[ext]'
  121. },
  122. type: 'javascript/auto'
  123. }
  124. ]
  125. }]
  126. },
  127. plugins:[
  128. new MiniCssExtractPlugin({
  129. filename: 'css/built.[contenthash:10].css'
  130. }),
  131. new OptimizeCssAssetsWebpackPlugin(),
  132. new EsLintPlugin({
  133. extensions: ['js', 'json', 'coffee'],
  134. //exclude: '/node_modules/',
  135. fix:true
  136. }),
  137. new HtmlWebpackPlugin({
  138. template: './src/index.html',
  139. minify:{
  140. collapseWhitespace:true,
  141. removeComments:true
  142. }
  143. })
  144. ],
  145. mode:'production',
  146. devtool:'source-map'
  147. }