作用:让代码上线运行缓存更好使用

缓存:
babel缓存
cacheDirectory:true
—> 让第二次打包构建速度更快
文件资源缓存
hash:每次webpack构件时会生成唯一一个hash值
问题:因为js和css同时使用一个hash值
如果重新打包,会导致所有缓存失效(可能我只改动一个文件)
chunkhash:根据chunk生成的hsash值。如果打包来源于同一个chunk,那么hash值就一样
问题:js和css的hash值还是一样的
因为css是在js中被引入的,所以同属于一个chunk
contenthash:根据文件的内容生成hash值,不同文件的hash值一定不一样
—> 让代码上线运行缓存更好使用

代码以contenthash为例

  1. const { resolve } = require('path')
  2. const MiniCssExtractPlugin = require('mini-css-extract-plugin')
  3. const OptimizeCssAssetsWebpackPlugin = require('optimize-css-assets-webpack-plugin');
  4. const HtmlWebpackPlugin = require('html-webpack-plugin');
  5. /**
  6. * 缓存:
  7. * babel缓存
  8. * cacheDirectory:true
  9. * --> 让第二次打包构建速度更快
  10. * 文件资源缓存
  11. * hash:每次webpack构件时会生成唯一一个hash值
  12. * 问题:因为js和css同时使用一个hash值
  13. * 如果重新打包,会导致所有缓存失效(可能我只改动一个文件)
  14. * chunkhash:根据chunk生成的hsash值。如果打包来源于同一个chunk,那么hash值就一样
  15. * 问题:js和css的hash值还是一样的
  16. * 因为css是在js中被引入的,所以同属于一个chunk
  17. * contenthash:根据文件的内容生成hash值,不同文件的hash值一定不一样
  18. * --> 让代码上线运行缓存更好使用
  19. */
  20. //定义nodejs环境变量:决定使用browserslist的哪个环境
  21. process.env.NODE_ENV = 'production'
  22. //复用loader
  23. const commonCssLoader = [
  24. MiniCssExtractPlugin.loader,
  25. 'css-loader',
  26. {
  27. //还需要在package.json中定义browserslist
  28. loader: 'postcss-loader',
  29. options: {
  30. ident: 'postcss',
  31. plugins: () => [
  32. require('postcss-preset-env')()
  33. ],
  34. }
  35. }
  36. ]
  37. module.exports = {
  38. entry: './src/js/index.js',
  39. output: {
  40. filename: 'js/built.[contenthash:10].js',
  41. path: resolve(__dirname, 'build'),
  42. // publicPath: 'build'
  43. },
  44. module: {
  45. rules: [
  46. {
  47. //在package.json中eslintConfig --> airbnb
  48. test: /\.js$/,
  49. exclude: /node_modules/,
  50. //优先执行
  51. enforce: 'pre',
  52. loader: 'eslint-loader',
  53. options: {
  54. fix: true
  55. }
  56. },
  57. {
  58. //以下loader只会匹配一个
  59. //注意:不能有两个配置 处理同一个文件
  60. oneOf: [
  61. {
  62. test: /\.css$/,
  63. use: [...commonCssLoader],
  64. },
  65. {
  66. test: /\.less$/,
  67. use: [...commonCssLoader, 'less-loader']
  68. },
  69. /**
  70. * 正常来讲,一个文件只能被一个loader处理
  71. * 当一个文件要被多个loader处理,那么一定要指定loader执行的先后顺序:
  72. * 先执行eslint 再执行babel
  73. */
  74. {
  75. test: /\.js$/,
  76. exclude: /node_modules/,
  77. loader: 'babel-loader',
  78. options: {
  79. presets: [
  80. [
  81. '@babel/preset-env',
  82. {
  83. //按需加载
  84. useBuiltIns: 'usage',
  85. //指定core-js版本
  86. corejs: {
  87. version: 3
  88. },
  89. targets: {
  90. chrome: '60',
  91. firefox: '60',
  92. ie: '9',
  93. safari: '10',
  94. edge: '17'
  95. }
  96. }
  97. ],
  98. ],
  99. //开启babel缓存
  100. //第二次构建时,会读取之前的缓存
  101. cacheDirectory:true
  102. }
  103. },
  104. {
  105. test: /\.(jpg|png|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. {
  115. test: /\.html$/,
  116. loader: 'html-loader'
  117. },
  118. {
  119. exclude: /\.(js|css|less|html|jpg|png|gif)/,
  120. loader: 'file-loader',
  121. options: {
  122. outputPath: 'media',
  123. }
  124. }
  125. ]
  126. }
  127. ]
  128. },
  129. plugins: [
  130. new MiniCssExtractPlugin({
  131. filename: 'css/built.[contenthash:10].css'
  132. }),
  133. new OptimizeCssAssetsWebpackPlugin(),
  134. new HtmlWebpackPlugin({
  135. template: './src/index.html',
  136. minify: {
  137. collapseWhitespace: true,
  138. removeComments: true
  139. }
  140. })
  141. ],
  142. mode: 'production',
  143. devtool:'source-map'
  144. }