当前位置: 首页 > article >正文

webpack 配置

在这里插入图片描述
在这里插入图片描述

webpack.base.js

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

modules.export = function (isDev) {
    return {
        //入口文件配置
        entry: path.resolve(__dirname, '../src/index.tsx'),
        output: {
            //打包输出的结果路径
            path: (__dirname, '../dist'),
            //输出的 JS 的名字
            // hash, chunkhash, contenthash
            // 输出文件名,[name] 会根据 entry 中的键名替换
            filename: 'static/js/[name].[hash:8].js',
            //webpack4: clean-webpack-plugin
            //webpack5: 内置了,构建前删除一下 dist
            clean: true,
            //打包后的公共路径
            publicPath: '/'
        },

        //resolve 部分
        resolve: {
            extensions: ['.tsx', '.ts', '.jsx', 'js'], //文件引用是可以不用带文件后缀
        },

        //loader部分
        module: {
            rules: [
                {
                    test: /\.(tsx|ts|jsx|js)$/, // 匹配规则,使用正则表达式匹配以 .tsx|.ts|.jsx|.js 结尾的文件
                    exclude: /node_modules/, // 排除 node_modules 目录
                    use: {
                        loader: 'babel-loader', // 使用 babel-loader 处理匹配到的文件
                        options: {
                            presets: ['@babel/preset-env'] // 使用 @babel/preset-env 进行转译
                        }
                    }
                },
                {
                    oneOf: [
                        {
                            test: /\.less$/,
                            use: [
                                isDev ? 'style-loader' : MiniCssExtractPlugin.loader,
                                'css-loader',
                                'less-loader', // 使用 style-loader、css-loader 和 lesscss-loader 处理匹配到的文件
                            ]
                        },
                        {
                            test: /\.css$/,
                            use: [
                                isDev ? 'style-loader' : MiniCssExtractPlugin.loader,
                                'css-loader',
                            ]
                        },
                        {
                            test: /\.module\.{less|css}$/,
                            include: [path.resolve(__dirname, '../src')],
                            use: [
                                isDev ? 'style-loader' : MiniCssExtractPlugin.loader,
                                {
                                    options: {
                                        modules: {
                                            localIdentName: '[path][name]_[local]--[hash:base64:5]'
                                        }
                                    }
                                },
                                'postcss-locader',
                                'less-loader'
                            ]
                        },
                    ]
                },
                {
                    //webpack 5 之前要用到 url / file-loader
                    test: /\.(png|jpg|jpeg)$/,
                    generator: {
                        filename: 'statis/images/[name].[contenthash:8].[ext]'
                    }
                },
                {
                    //webpack 5 之前要用到 url / file-loader
                    test: /\.(mp4|mp3|rvmb)$/,
                    generator: {
                        filename: 'statis/media/[name].[contenthash:8].[ext]'
                    }
                },
                {
                    //webpack 5 之前要用到 url / file-loader
                    test: /\.(eot|ttf|otf)$/,
                    generator: {
                        filename: 'statis/fonts/[name].[contenthash:8].[ext]'
                    }
                },
            ]
        },
        // 插件配置
        plugins: [
            new HtmlWebpackPlugin({
                //我要把生成的 js 和 css ,注入到一个 html 模版中
                template: path.resolve(__dirname, '../public/index.html')
            }),
            new MiniCssExtractPlugin({
                filename: isDev ? 'static/css/[name].css' :
                    'static/css/[name].[contenthash:8].css'
            })
        ],
        // 优化配置
        optimization: {
            runtimeChunk: 'single', // 提取 webpack 运行时代码到单独的文件
            splitChunks: {
                cacheGroups: {
                    vendor: {
                        test: /[\\/]node_modules[\\/]/, // 匹配规则,匹配 node_modules 目录下的文件
                        name: 'vendors', // 输出 chunk 的名称
                        chunks: 'all' // 在所有的 chunk 中使用这个缓存组
                    }
                }
            }
        }
    }
}

webpack.dev.js

	const { merge } = require("webpack-merge");
const getBaseConfig = require('./webpack.base');
const path = require('path');

module.exports = merge(getBaseConfig(true), {
    mode: "development",
    devtool: "eval-cheap-module-source-map", // 使用 source map 提供源代码到构建后的代码的映射
    devServer: {
        port: 3000,
        compress: false, //不压缩,热更新快一些
        hot: true, // 开启模块热替换
        historyApiFallback: true, //history路由下的 404 问题
        static: {
            //托管的静态文件夹
            dircectory: path.join(__dirname, '../public')
        }

    }
})

webpack.prod.js

	const { merge } = require("webpack-merge");
const getBaseConfig = require('./webpack.base');
const path = require('path');
// //css压缩 webpack5 弃用改成css-minimizer-webpack-plugin
const CssMinimizerWebpackPlugin = require("css-minimizer-webpack-plugin");
const TerserPlugin = require('terser-webpack-plugin')

module.exports = merge(getBaseConfig(false), {
    mode: "production",

    optimization: {
        minimize: true, // 开启代码压缩
        minimizer: [
            new CssMinimizerPlugin(),
            new TerserPlugin({
                parallel: true
            }),
            new CssMinimizerWebpackPlugin({ // 添加 CssMinimizerWebpackPlugin 实例到 minimizer 数组中   
                parallel: true, // 启用并行压缩 
                minimizerOptions: {
                    preset: ['default', { discardComments: { removeAll: true } }] // 使用默认配置,并移除所有注释 
                }
            })
        ],
        splitChunks: {
            chunks: 'all', // 对所有类型的 chunk 生效
            minSize: 20000, // 模块的最小大小(字节)
            maxAsyncRequests: 30, // 按需加载时并行请求的最大数量
            maxInitialRequests: 30, // 入口点并行请求的最大数量
            automaticNameDelimiter: '~', // 文件名的连接符
            cacheGroup: {
                vendors: {
                    name: 'vendors',
                    test: /node_modules/,
                },
                common: {
                    name: 'common'
                }
            }
        }
    },
    plugins: []
})

基本配置已完成,有需要的loaderplugins或者其他配置项补充即可


http://www.kler.cn/a/304625.html

相关文章:

  • 2023年MathorCup数学建模B题城市轨道交通列车时刻表优化问题解题全过程文档加程序
  • PyTorch深度学习与企业级项目实战-预训练语言模型GPT
  • 虚幻引擎 CEO 谈元宇宙:发展、策略与布局
  • 豆瓣均分9:不容错过的9本大模型入门宝藏书籍,非常详细收藏我这一篇就够了
  • 结构体(c语言)
  • 使用elementUI实现表格行拖拽改变顺序,无需引入外部库
  • Docker 网络基本概念
  • 判断2个excel文件差异的条数
  • MySQL聚合统计
  • vue等比例缩放页面用于网站,官网
  • CAN数据记录仪与乘用车或者工程车辆OBD口连接注意事项
  • 演示:基于WPF的自绘的中国地铁轨道控件
  • [docker]入门
  • 【H2O2|全栈】关于CSS(4)CSS基础(四)
  • Java 算法:随机抽题
  • 最小堆 + 数学思维(重点) + 快速幂
  • java 自定义简单的线程池
  • Mysql 视图存储过程触发器
  • GD - GD32350R_EVAL - PWM实验和验证3 - EmbeddedBuilder - 无源蜂鸣器 - 用PMOS来控制
  • Android CustomDialog圆角背景不生效的问题
  • 使用 PyCharm 新建 Python 项目详解
  • turbo译码算法MAX, MAX_SCALE and MAX_STAR的比较
  • C 语言中表示对象大小的标准数据类型size_t
  • 备份服务器数据防护策略方法
  • 基于SpringBoot的在线汽车租赁信息管理系统
  • 【Java面试】第十一天