• webpack优化环境配置 20.oneOf


    oneOf的作用
    提升构建速度,避免每个文件都被所有loader过一遍,
    因为任何一个文件,构建过程中,在遇到第一个与之对应的loader后,不会再往下进行。
    在webpack.config.js 中配置 oneOf

     1.文件结构

     2.代码

    webpack.config.js

    const {resolve} = require('path')
    const HtmlWebpackPlugin = require('html-webpack-plugin')
    //提取 js 中的 css 成单独文件
    const MiniCssExtractPlugin = require('mini-css-extract-plugin')
    
    //压缩css
    const OptimizeCssAssetsWebpackPlugin = require('optimize-css-assets-webpack-plugin')
    
    // 定义nodejs环境变量:决定使用browserslist的哪个环境
    process.env.NODE_ENV = 'production';
    
    //复用 loader
    const commonCssLoader = [
        // 这个 loader 取代 style-loader。作用:提取js中的css成单独文件
        //MiniCssExtractPlugin.loader 加载不了 less文件中的图片,记录一下坑,使用"style-loader"可以加载。。。
        MiniCssExtractPlugin.loader,
        //如果只使用loader的默认配置,就直接写字符串,会默认加载。
        'css-loader',
    
        // css兼容性处理
        //如果要修改配置,就使用对象的形式
        {
            // 还需要在package.json中定义browserslist
            loader: "postcss-loader",
            options: {
                ident: "postcss",
                plugins: () => [
                    // postcss的插件
                    require('postcss-preset-env')()
                ]
    
            }
        }
    ]
    module.exports = {
        entry: './src/js/index.js',
        output: {
            filename: "js/built.js",
            path: resolve(__dirname, "build")
        },
        module: {
            rules: [
                /*
                    但是,实际开发过程中,同样会有一个文件需要匹配多个loader的场景,
                    比如js文件同时需要eslint-loader和babel-loader,这样的话就不能将两个loader都放到oneOf里面,
                    因为一旦匹配了第一个loader就不会再继续执行第二个loader,解决办法也很简单,只需要放到oneOf外面即可。
                */
                // js语法检查(eslint)
                {
                    // 在package.json中eslintConfig --> airbnb
                    test: /\.js$/,
                    exclude: /node_modules/,
                    //当一个文件要被多个loader处理,添加 enforce: "pre",会被优先执行
                    enforce: "pre",
                    loader: "eslint-loader",
                    options: {
                        //自动修复eslint的错误
                        fix: true,
                    }
                },
                {
                    /*
                        在webpack对文件打包或者构建的时候,都会将rules里所有的规则都过一遍,这样会影响构建性能,
                        因为单个文件只会匹配rules里的单条规则,匹配上了就没必要继续匹配,所以这里就用到了oneOf来处理这个问题。
    
                        oneOf的作用
                            提升构建速度,避免每个文件都被所有loader过一遍,
                            因为任何一个文件,构建过程中,在遇到第一个与之对应的loader后,不会再往下进行。
                    */
                    oneOf: [
                        {
                            test: /\.css$/,
                            use: [...commonCssLoader]
                        },
                        {
                            test: /\.less$/,
                            use: [...commonCssLoader, 'less-loader']
                        },
                        /*
                            正常来讲,一个文件只能被一个loader处理。
                            当一个文件要被多个loader处理,那么一定要指定loader执行的先后顺序:
                              先执行eslint 再执行babel
                          */
                        //js兼容性处理
                        {
                            test: /\.js$/,
                            exclude: /node_modules/,
                            loader: "babel-loader",
                            options: {
                                presets: [
                                    [
                                        //@babel/preset-env: 基本js兼容性处理
                                        '@babel/preset-env',
                                        {
                                            //按需处理
                                            //按需加载
                                            useBuiltIns: 'usage',
                                            //指定 core-js 版本
                                            corejs: {
                                                version: 3
                                            },
                                            //指定兼容性做到哪个版本
                                            targets: {
                                                chrome: '60',
                                                firefox: '60',
                                                ie: '9',
                                                safari: '10',
                                                edge: '17'
                                            }
                                        }
                                    ]
                                ]
                            }
                        },
                        // 打包图片资源
                        {
                            test: /\.(jpg|png|gif)$/,
                            loader: 'url-loader',
                            options: {
                                limit: 8 * 1024,
                                name: '[hash:10].[ext]',
                                outputPath: 'imgs',
                                esModule: false
                            }
                        },
                        // 打包html资源
                        {
                            test: /\.html$/,
                            loader: 'html-loader'
                        },
                        // 打包其它资源
                        {
                            exclude: /\.(js|css|less|html|png|jpg|gif)$/,
                            loader: "file-loader",
                            options: {
                                outputPath: "media"
                            }
                        }
                    ]
                }
            ]
        },
        plugins: [
            //提取 js 中的 css 成单独文件
            new MiniCssExtractPlugin({
                //对输出文件名进行重命名
                filename: 'css/built.css'
            }),
            //压缩 css
            new OptimizeCssAssetsWebpackPlugin(),
            new HtmlWebpackPlugin({
                template: "./src/index.html",
                //压缩 html 代码
                minify: {
                    // 移除空格
                    collapseWhitespace: true,
                    // 移除注释
                    removeComments: true
                }
            })
        ],
        mode: 'production'
    }

    end~

     
  • 相关阅读:
    第十周学习进度条
    第九周学习进度条
    Runner站立会议08
    Runner站立会议07
    构建之法阅读笔记02
    Runner站立会议04
    学习进度条
    Runner站立会议01
    进度条
    返回一个一维整数数组中最大子数组的和
  • 原文地址:https://www.cnblogs.com/sener/p/16669996.html
Copyright © 2020-2023  润新知