webpack优化环境配置 - 21.缓存

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

 

开启缓存:在 webpack.config.js 中配置 cacheDirectory 为 true

 

 

1.文件结构

 

 

 

2.代码

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>webpack</title>
</head>
<body>
    <h5>hello catch</h5>
</body>
</html>

 

index.css

html,body{
    margin: 0;
    padding: 0;
    height: 100%;
    background-color: skyblue;
}

 

index.js

import '../css/index.css';

function sum(...arg) {
  return arg.reduce((p, c) => p + c, 0);
}
// eslint-disable-next-line
console.log(sum(1, 2, 3,4,5,6));

webpack.config.js

const {resolve} = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const MiniCssExtractPlugin = require('mini-css-extract-plugin')

const OptimizeCssAssetsWebpackPlugin = require('optimize-css-assets-webpack-plugin')

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

process.env.NODE_ENV = 'production';

const commonCssLoader = [
    MiniCssExtractPlugin.loader,
    'css-loader',
    {
        loader: "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")
    },
    module: {
        rules: [
            {
                test: /\.js$/,
                exclude: /node_modules/,
                enforce: "pre",
                loader: "eslint-loader",
                options: {
                    fix: true,
                }
            },
            {
                oneOf: [
                    {
                        test: /\.css$/,
                        use: [...commonCssLoader]
                    },
                    {
                        test: /\.less$/,
                        use: [...commonCssLoader, 'less-loader']
                    },
                    {
                        test: /\.js$/,
                        exclude: /node_modules/,
                        loader: "babel-loader",
                        options: {
                            presets: [
                                [
                                    '@babel/preset-env',
                                    {
                                        useBuiltIns: 'usage',
                                        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|png|jpg|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'
}

server.js(服务器代码,用于启动项目)

/*
 服务器代码
 全局安装 nodemon: npm i nodemon -g
 启动服务器指令: nodemon server.js  或  node server.js
 访问服务器地址: http://localhost:8080
*/
const express = require('express')

const app = express()

app.use(express.static('build', {maxAge: 1000 * 3600}))

app.listen(8080)

启动

$ node server.js

 

在文件后追加 hash 值,使文件在变化的时候,不再读取缓存,而是读取最新文件,
contenthash: 根据文件的内容生成hash值。不同文件hash值一定不一样,这样修改其它文件就不会影响其它文件。

 

 

 

 

3.预览

 

end~

 

posted @ 2022-09-08 17:25  Evengod  阅读(250)  评论(0编辑  收藏  举报