webpack 知识系列第四篇

87 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第26天,点击查看活动详情

一、HMR

  1. 创建文件

    image.png

  2. 修改配置文件

    const { resolve } = require('path');
    const HtmlWebpackPlugin = require('html-webpack-plugin');
    module.exports = {
        entry: ['./src/js/index.js', './src/index.html'],
        output: {
            filename: 'js/built.js',
            path: resolve(__dirname, 'build')
        },
        module: {
            rules: [
                // loader 的配置
                {
                    // 处理 less 资源
                    test: /\.less$/,
                    use: ['style-loader', 'css-loader', 'less-loader']
                },
                {
                    // 处理 css 资源
                    test: /\.css$/,
                    use: ['style-loader', 'css-loader']
                },
                {
                    // 处理图片资源
                    test: /\.(jpg|png|gif)$/,
                    loader: 'url-loader',
                    options: {
                        limit: 8 * 1024,
                        name: '[hash:10].[ext]',
                        // 关闭 es6 模块化
                        esModule: false,
                        outputPath: 'imgs'
                    }
                },
                {
                    // 处理 html 中 img 资源
                    test: /\.html$/,
                    loader: 'html-loader'
                },
                {
                    // 处理其他资源
                    exclude: /\.(html|js|css|less|jpg|png|gif)/,
                    loader: 'file-loader',
                    options: {
                        name: '[hash:10].[ext]',
                        outputPath: 'media'
                    }
                }
            ]
        },
        plugins: [
            // plugins 的配置
            new HtmlWebpackPlugin({
                template: './src/index.html'
            })
        ],
        mode: 'development',
        devServer: {
            contentBase: resolve(__dirname, 'build'),
            compress: true,
            port: 3000,
            open: true,
            // 开启 HMR 功能
            // 当修改了 webpack 配置,新配置要想生效,必须重新 webpack 服务
            hot: true
        }
    };
    
  3. 运行指令: webpack

二、source-map

  1. 创建文件

    image.png

  2. 修改配置文件

    const { resolve } = require('path');
    const HtmlWebpackPlugin = require('html-webpack-plugin');
    module.exports = {
        entry: ['./src/js/index.js', './src/index.html'],
        output: {
            filename: 'js/built.js',
            path: resolve(__dirname, 'build')
        },
        module: {
            rules: [
                // loader 的配置
                {
                    // 处理 less 资源
                    test: /\.less$/,
                    use: ['style-loader', 'css-loader', 'less-loader']
                },
                {
                    // 处理 css 资源
                    test: /\.css$/,
                    use: ['style-loader', 'css-loader']
                },
                {
                    // 处理图片资源
                    test: /\.(jpg|png|gif)$/,
                    loader: 'url-loader',
                    options: {
                        limit: 8 * 1024,
                        name: '[hash:10].[ext]',
                        // 关闭 es6 模块化
                        esModule: false,
                        outputPath: 'imgs'
                    }
                },
                {
                    // 处理 html 中 img 资源
                    test: /\.html$/,
                    loader: 'html-loader'
                },
                {
                    // 处理其他资源
                    exclude: /\.(html|js|css|less|jpg|png|gif)/,
                    loader: 'file-loader',
                    options: {
                        name: '[hash:10].[ext]',
                        outputPath: 'media'
                    }
                }
            ]
        },
        plugins: [
            // plugins 的配置
            new HtmlWebpackPlugin({
                template: './src/index.html'
            })
        ],
        mode: 'development',
        devServer: {
            contentBase: resolve(__dirname, 'build'),
            compress: true,
            port: 3000,
            open: true,
            hot: true
        },
        devtool: 'eval-source-map'
    };
    
  3. 运行指令: webpack

三、oneOf

  1. 创建文件

    image.png

  2. 修改配置文件

    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');
    // 定义 nodejs 环境变量:决定使用 browserslist 的哪个环境
    process.env.NODE_ENV = 'production';
    // 复用 loader
    const commonCssLoader = [
        MiniCssExtractPlugin.loader,
        'css-loader',
        {
            // 还需要在 package.json 中定义 browserslist
            loader: 'postcss-loader',
            options: {
                ident: 'postcss',
                plugins: () => [require('postcss-preset-env')()]
            }
        }
    ];
    module.exports = {
        entry: './src/js/index.js',
        output: {
            filename: 'js/built.js',
            path: resolve(__dirname, 'build')
        },
        module: {
            rules: [
                {
                    // 在 package.json 中 eslintConfig --> airbnb
                    test: /\.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',
                                            corejs: {version: 3},
                                            targets: {
                                                chrome: '60',
                                                firefox: '50'
                                            }
                                        }
                                    ]
                                ]
                            }
                        },
                        {
                            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.css'
                }),
                new OptimizeCssAssetsWebpackPlugin(),
                new HtmlWebpackPlugin({
                    template: './src/index.html',
                    minify: {
                        collapseWhitespace: true,
                        removeComments: true
                    }
                })
            ],
            mode: 'production'
        };
        ```
    
    3. 运行指令:webpack
    

四、缓存

  1. 创建文件

    image.png

  2. 修改配置文件

        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');
        // 定义 nodejs 环境变量:决定使用 browserslist 的哪个环境
        process.env.NODE_ENV = 'production';
        // 复用 loader
        const commonCssLoader = [
            MiniCssExtractPlugin.loader,
            'css-loader',
            {
                // 还需要在 package.json 中定义 browserslist
                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: [
                    {
                        // 在 package.json 中 eslintConfig --> airbnb
                        test: /\.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',
                                                corejs: { version: 3 },
                                                targets: {
                                                    chrome: '60',
                                                    firefox: '50'
                                                }
                                            }
                                        ]
                                    ],
                                    // 开启 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'
    };
    
  3. 运行指令: webpack

五、总结

本篇主要介绍了webpack优化配置,包括:HMR、source-map、oneOf、缓存。下一篇将介绍webpack中其他优化配置,快来一起学习吧!