Webpack5配置

322 阅读2分钟

配置

常用配置,其余翻看文档

module.exports = {
    mode: 'development',
    entry: './src/main.js',
    devtool: 'source-map', // 配置SourceMap
    devServer: { // 此属性只作用于开发服务器环境
        compress: true, // 启用gzip
        hot: true, // 开启HMR 热更替
        host: '0.0.0.0', // 指定访问地址,4个0时开启局域网访问
        port: 8080, // 指定端口号
        open: true, // 启动后自动打开项目地址
        static: [// 配置静态文件目录(默认是 'public' 文件夹)。将其设置为 false 以禁用
            {
                directory: path.join(__dirname,'public'), // 静态资源目录
                publicPath: '/my' // 从哪个地址访问该目录
            }
        ],
        proxy: { // 配置跨越代理
            '/api': { // 匹配请求前缀
                target: 'http://localhost:3000', // 实际请求地址
                pathRewrite: { '^/api': '' }, // 替换占位
                secure: false, // https证书无效时
            },
        },
    },
    output: {
        path: path.resolve('./dist'), // 输出目录
        publicPath: './', // 编译后,静态资源地址前缀
        clean: true // 清空输出目录
    },
    resolve: {
        alias: {
            Utilities: path.resolve(__dirname, 'src/utilities/'),
            Templates$: path.resolve(__dirname, 'src/to/file.js'),//加$为精准匹配,只需别名
        },
        extensions: ['.js', '.json', '.wasm'], // 引入文件后缀包含在内,可不写后缀
    },
}

plugin

css压缩合并

const MiniCssExtractPlugin = require("mini-css-extract-plugin");
let styleLoaderMode = MiniCssExtractPlugin.loader //替换"style-loader"
plugins: [
    new MiniCssExtractPlugin({
        filename: "css/[name].css",
    }),
]

清空构建目录

  • webpack5中被output.clean取代
const {CleanWebpackPlugin} = require('clean-webpack-plugin')
plugins: [
    new CleanWebpackPlugin()
]

自定义html模板

const HtmlWebpackPlugin = require('html-webpack-plugin')
plugins: [
    new HtmlWebpackPlugin({
        template: "./public/index.html",
        title: 'asdf' // 配合DefinePlugin使用,对象名称为htmlWebpackPlugin
    }),
]

在html模板中使用自定义变量

const {DefinePlugin} = require('webpack')
plugins: [
    new DefinePlugin({
        ABC: '"DefinePlugin内置插件的自定义变量"', // 默认是变量引用,需要额外加引号
        __VUE_OPTIONS_API__: true,
        __VUE_PROD_DEVTOOLS__: true,
    }),
]

拷贝静态资源

plugins: [
    new copyWebpackPlugin({
        patterns: [{
            from: './public',
            // to: './dist', 默认指向构建根目录
            globOptions: {
                ignore: ['**/index.html']
            }
        }]
    })
]

vue3 单文件编译

const {VueLoaderPlugin} = require('vue-loader/dist/index')
plugins: [
    new VueLoaderPlugin()
]

loader

file,url

{
    test: /.(eot|ttf|woff2?)$/,
    use: {
        loader: "url-loader",
        options: {
            outputPath: "font",
            name: "urlLoader_[name]_[hash:6].[ext]",
            limit: -1, // 小于此值大小的文件将会调用file-loader编译
        }
    },
},

css相关

普通css

rules: [
    {
        test: /.css$/, //正则表达式,
        use: [
            'style-loader',
            {
                loader: 'css-loader',
                options: {
                    esModule: false // 版本过高需要加
                }
            },
        ]
    },
    {
        test: /.less$/, //正则表达式,
        use: [
            // styleLoaderMode,
            // cssLoaderMode,
            "less-loader",
        ]
    },
]

postcss配置

{
    loader: 'postcss-loader',
    options: {
        postcssOptions: { //配置查看webpack文档
            plugins: [
                [
                    // "autoprefixer",
                    'postcss-preset-env',
                    {
                        // 其他选项
                    },
                ],
            ],
        },
    },
},

babel

{
    test: /.js$/,
    use: {
        loader: 'babel-loader',
        options: {
            presets: [
                [
                    '@babel/preset-env',
                    {
                        // 配置查看babel文档
                    }
                ]
            ],
        }
    },
    exclude: /node_modules/
},