作用:让代码上线运行缓存更好使用
缓存:
babel缓存
cacheDirectory:true
—> 让第二次打包构建速度更快
文件资源缓存
hash:每次webpack构件时会生成唯一一个hash值
问题:因为js和css同时使用一个hash值
如果重新打包,会导致所有缓存失效(可能我只改动一个文件)
chunkhash:根据chunk生成的hsash值。如果打包来源于同一个chunk,那么hash值就一样
问题:js和css的hash值还是一样的
因为css是在js中被引入的,所以同属于一个chunk
contenthash:根据文件的内容生成hash值,不同文件的hash值一定不一样
—> 让代码上线运行缓存更好使用
代码以contenthash为例
const { resolve } = require('path')const MiniCssExtractPlugin = require('mini-css-extract-plugin')const OptimizeCssAssetsWebpackPlugin = require('optimize-css-assets-webpack-plugin');const HtmlWebpackPlugin = require('html-webpack-plugin');/*** 缓存:* babel缓存* cacheDirectory:true* --> 让第二次打包构建速度更快* 文件资源缓存* hash:每次webpack构件时会生成唯一一个hash值* 问题:因为js和css同时使用一个hash值* 如果重新打包,会导致所有缓存失效(可能我只改动一个文件)* chunkhash:根据chunk生成的hsash值。如果打包来源于同一个chunk,那么hash值就一样* 问题:js和css的hash值还是一样的* 因为css是在js中被引入的,所以同属于一个chunk* contenthash:根据文件的内容生成hash值,不同文件的hash值一定不一样* --> 让代码上线运行缓存更好使用*///定义nodejs环境变量:决定使用browserslist的哪个环境process.env.NODE_ENV = 'production'//复用loaderconst commonCssLoader = [MiniCssExtractPlugin.loader,'css-loader',{//还需要在package.json中定义browserslistloader: 'postcss-loader',options: {ident: 'postcss',plugins: () => [require('postcss-preset-env')()],}}]module.exports = {entry: './src/js/index.js',output: {filename: 'js/built.[contenthash:10].js',path: resolve(__dirname, 'build'),// publicPath: 'build'},module: {rules: [{//在package.json中eslintConfig --> airbnbtest: /\.js$/,exclude: /node_modules/,//优先执行enforce: 'pre',loader: 'eslint-loader',options: {fix: true}},{//以下loader只会匹配一个//注意:不能有两个配置 处理同一个文件oneOf: [{test: /\.css$/,use: [...commonCssLoader],},{test: /\.less$/,use: [...commonCssLoader, 'less-loader']},/*** 正常来讲,一个文件只能被一个loader处理* 当一个文件要被多个loader处理,那么一定要指定loader执行的先后顺序:* 先执行eslint 再执行babel*/{test: /\.js$/,exclude: /node_modules/,loader: 'babel-loader',options: {presets: [['@babel/preset-env',{//按需加载useBuiltIns: 'usage',//指定core-js版本corejs: {version: 3},targets: {chrome: '60',firefox: '60',ie: '9',safari: '10',edge: '17'}}],],//开启babel缓存//第二次构建时,会读取之前的缓存cacheDirectory:true}},{test: /\.(jpg|png|gif)/,loader: 'url-loader',options: {limit: 8 * 1024,name: '[hash:10].[ext]',outputPath: '../imgs',esModule: false,}},{test: /\.html$/,loader: 'html-loader'},{exclude: /\.(js|css|less|html|jpg|png|gif)/,loader: 'file-loader',options: {outputPath: 'media',}}]}]},plugins: [new MiniCssExtractPlugin({filename: 'css/built.[contenthash:10].css'}),new OptimizeCssAssetsWebpackPlugin(),new HtmlWebpackPlugin({template: './src/index.html',minify: {collapseWhitespace: true,removeComments: true}})],mode: 'production',devtool:'source-map'}
