《基于 Vue 组件库 的 Webpack5 配置》- 总结

前言

Vue2 项目升级到 Webpack5 后,相关的配置也有所变化!此篇以记录和总结,共同学习 Webpack ~

推荐相关文章:

配置

1. 模式 Mode

一定要配置 模式 Mode,这里有个小知识点,环境变量 process.env.NODE_ENV

js 复制代码
module.exports = {
    mode: 'production',// process.env.NODE_ENV 或 development,
}

2. vue-loader

一定要配置 vue-loader

3. module.rules

配置 module.rules ,创建模块时,匹配请求的规则数组;

  • 可参考 webpack5 指南-管理资源;

  • vue 可参考上述配置;

  • js 使用 webpack babel-loader;

  • css 参考 webpack 加载 CSS。注意style-loader 和 vue-style-loader 选一个即可,两者的功能基本一致,只是 vue-style-loader 可用于服务端渲染 SSR;

  • stylus 参考 webpack stylus-loader。可使用 插件 MiniCssExtractPlugin 提取样式到单独的文件,需额外安装 npm i mini-css-extract-plugin -D;

  • png/svg/jpg 参考 webpack 加载图像,注意 type 的配置 资源模块 asset/resource (强烈建议认真阅读此链接);

  • ttf/woff/woff2 参考 webpack 加载字体,注意 type 的配置 资源模块 asset/resource (强烈建议认真阅读此链接);

  • webpack.config.js 的配置如下

    js 复制代码
    // 需安装,可将CSS提取到单独的文件:
    const MiniCssExtractPlugin = require('mini-css-extract-plugin')
    
    module.exports = {
        module: {
            rules: [
                {
                    test: /\.vue$/,
                    loader: 'vue-loader'
                },
                {
                    test: /\.js$/,
                    // 必须加上,否则在编译过程中报错 The code generator has deoptimised the styling
                    exclude: /node_modules/, 
                    loader: 'babel-loader'
                },
                {
                    test: /\.css$/,
                    use: [
                        'style-loader',
                        //与 style-loader 功能类似,只是 vue-style-loader 可用于服务端渲染
                        // "vue-style-loader", 
                        "css-loader"
                    ]
                },
                {
                    test: /\.styl(us)?$/,
                    use: [
                        MiniCssExtractPlugin.loader,
                        'css-loader',
                        'stylus-loader',
                    ]
                },
                {
                    test: /\.(png|svg|jpg|jpeg|gif)$/i,
                    type: 'asset/resource',
                    generator: {
                        // publicPath: 'assets/imgs/', // https://webpack.docschina.org/configuration/module#rulegeneratorfilename
                        filename: 'imgs/[hash][ext]',
                    }
                },
                {
                    test: /\.(woff|woff2|eot|ttf|otf)$/i,
                    type: 'asset/resource',
                    generator: {
                        // publicPath: 'assets/fonts/',
                        filename: 'fonts/[hash][ext]',
                    }
                },
            ]
        },
    }

4. 将 CSS 提取到单独的文件

  • 使用 webpack 插件 mini-css-extract-plugin 需要额外安装 npm i mini-css-extract-plugin@latest -D;

  • 同时打包 js 和 css 文件时,可参考 entry 高级用法;

  • package.json 的配置如下

    js 复制代码
    const { VueLoaderPlugin } = require('vue-loader');
    // 可将CSS提取到单独的文件
    const MiniCssExtractPlugin = require('mini-css-extract-plugin')
    
    module.exports = {
        mode: 'production',
        entry: {
          "my-webcomponents": ['./index.js', './src/assets/stylus/main.styl'],
          "my-webcomponents2": ['./index2.js', './src/assets/stylus/main2.styl'],
        },
        output: {
            path: path.resolve(__dirname, 'dist'),
            filename: '[name].js',
            clean: true, 
        },
        plugins: [
            new VueLoaderPlugin(),        
            new MiniCssExtractPlugin({
                filename: "[name].css",
                // filename: "main.css", // 也可以指定名称,但css只会输出一个
            }),
        ],
    }

5. 压缩 CSS 和 js 文件

js 复制代码
const CssMinimizerPlugin = require("css-minimizer-webpack-plugin");
const TerserPlugin = require("terser-webpack-plugin");

module.exports = {
    optimization: {// 优化
        minimize: true,
        minimizer: [
            new CssMinimizerPlugin(),//压缩css
            new TerserPlugin({// 压缩 js
                terserOptions: {
                    format: {
                        comments: false,
                    },
                },
                extractComments: false,
            }),
        ],
    }
}

6. js代码混淆

  • 使用插件 webpack-obfuscator,需要安装 npm install --save-dev javascript-obfuscator webpack-obfuscator

  • package.json 的配置如下

js 复制代码
const WebpackObfuscator = require('webpack-obfuscator');

module.exports = {
    plugins: [
        new WebpackObfuscator ({
            rotateStringArray: true
        }, [])
    ],
}

7. 静态文件

将字体库和图片等静态资料,编译后打包至指定文件夹

js 复制代码
module.exports = {
    module: {
            {
                test: /\.(png|svg|jpg|jpeg|gif)$/i,
                type: 'asset/resource',
                generator: {
                    // publicPath: 'assets/imgs/', // 
                    filename: 'imgs/[hash][ext]',
                }
            },
            {
                test: /\.(woff|woff2|eot|ttf|otf)$/i,
                type: 'asset/resource',
                generator: {
                    filename: 'fonts/[hash][ext]',
                }
            },
        ]
    },
}

8. 路径别名

resolve.alias

js 复制代码
const path = require('path');

module.exports = {
    resolve: {
        alias: {
            "@": path.resolve(__dirname, "./src/"),
            "@assets": path.resolve(__dirname, "./src/assets/"),
            "@mixins": path.resolve(__dirname, "./src/mixins/"),
            "@components": path.resolve(__dirname, "./src/components/"),
            "@images": path.resolve(__dirname, "./src/assets/images/")
        },
        extensions: [".*", ".js", ".vue", ".json"]
    }
}

9. 性能

performance

js 复制代码
module.exports = {
    performance: {// 性能
        hints: 'warning', // 枚举 false 关闭性能提示
        maxEntrypointSize: 10240000000000, // 最大入口文件大小
        maxAssetSize: 10240000000000, // 最大资源文件大小
    },
}    

10. 在生成打包文件之前清空 output(dist) 目录(两种方式)

方式一:

如果 webpack 是 v5.20.0+,直接使用属性 output.clean,配置如下:

js 复制代码
module.exports = {
  //...
  output: {
    clean: true
  },
};

方式二:

如果使用较低版本,可以使用插件 clean-webpack-plugin:

先安装:npm i clean-webpack-plugin -D;

再配置:

js 复制代码
const {CleanWebpackPlugin} = require('clean-webpack-plugin');

module.exports = {
  //...
  plugins: {
     new CleanWebpackPlugin() 
  },
};

11. module.exports 可为数组类型且注意编译顺序

  • module.exports常见是对象类型,其实也可用数组类型;
  • 注意编译顺序,从后往前 编:
    • 也就是说先编 another.js,再编 index.js;
    • 所以代码第 9 行 不能设置为 true,仅在第一次,也就是代码第19行 设置一次 即可清空整个 output 文件夹;
    • 如果代码第 9 行 设置为 true,则在编 index.js时,会删除another.js 已编译好的文件;
js 复制代码
module.exports = [
    {
        mode: 'production',
        entry: {
            "indexs": './index.js' ,
        },
        output: {
            filename: '[name].js',
            // clean: true, // 在每次构建前清理 /dist 文件夹
        }
    },
    {
        mode: 'production',
        entry: {
            "another": './another.js' ,
        },
        output: {
            filename: '[name].js',
            clean: true, // 在每次构建前清理 /dist 文件夹
        }
    }
];

最后

想了解更多,可参考 Webpack 官网 !

相关推荐
工控丫丫14 分钟前
帆软看板中经常使用的公式函数及经常搭的组合
前端·javascript·数据库
jerrywus35 分钟前
我用 GPT-6.1-sol 做了台会讲解的 3D 售货机:60 罐饮料,一口没喝上
前端·agent·claude
孟陬2 小时前
Foobar 技术周刊#159:当看不懂代码时,如何高效排障调试。脏页陷阱:一条只读查询,写入数 TB 数据。推测解码:大模型加速利器
前端·人工智能·后端
Zhao-Jichao2 小时前
AI Prompting for Everyone 课程笔记 - P17 图像生成 Imaging Generation
前端
Highcharts.js3 小时前
智能数据分析组件Orbit 正式发布与快速上手体验教程
前端·人工智能·信息可视化·数据分析系统·highcharts·orbit·智能可视化
Dream-Y.ocean3 小时前
鸿蒙PC平台星图遥感适配实战:基于 Electron 壳方案的纯 JavaScript 遥感图像处理引擎开发
javascript·electron·harmonyos
螺丝钉tina3 小时前
[Playwright ][16]Playwright + TypeScript API 自动化测试实战:API测试
前端·javascript·typescript
小天源4 小时前
智叟云集系统 · 架构与职责分层
服务器·前端·数据库
Highcharts.js6 小时前
React 中原生支持使用 JSX 组件配置自定义表格 Highcharts Grid
前端·javascript·react.js·前端框架·jsx·highcharts·自定义表格
Java后端的Ai之路6 小时前
【AIAgent开发】-Agent工具封装成CLI(纯干货!!!)
java·javascript·人工智能·agent·cli