webpack 配置

127 阅读2分钟
  • webpack.config.js 文件
// nodejs 核心模块配置路径
const { resolve } = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')

module.exports = {
    // 1.核心配置:配置文件打包入口文件路径
    entry: './src/index.js',
    // 2.核心配置:文件打包完成后出口配置
    output: {
        // 文件名称
        filename: '[name].js',
        // 文件出口路径
        path: resolve(__dirname, 'build')
    },
    // 3.核心配置:配置资源编译规则 loader
    module: {
        rules: [
            // css样式资源 
            {
                test: /\.css$/,
                use: [
                    'style-loader',
                    'css-loader',
                ]
            },
            // sass样式资源 
            {
                test: /\.scss$/,
                use: [
                    'style-loader',
                    'css-loader',
                    'sass-loader'
                ]
            },
            // 图片资源 样式文件中引入的图片资源
            // 需要下载 url-loader file-loader
            {
                test: /\.(png|jpg)$/,
                // 下载 url-loader file-loader
                // 如果需要使用多个loader就是use:[],如果是单个loader则就是如下写法就可以了
                loader: 'url-loader',
                options: {
                    // 图片大小小于10kb,就会base64处理
                    // 优点:减少请求数量,减轻服务器压力
                    // 缺点:图片体积会更大,请求文件速度变慢
                    limit: 10 * 1024,
                    // 问题:因为url-loader默认使用es6模块化解析,而html-loader引入图片是commonjs
                    // 解析时会出问题,需要关闭url-loader的ex6模块化,使用commonjs解析
                    esModule: false,
                    // 图片重命名
                    // [hash:10]区哈希值前10位作为图片的名字
                    // [ext]使用文件原来的扩展名
                    name: '[hash:10].[ext]'
                },
                // css-loader 6.0.0以上版本。对引入背景图片的url解析方式不一样,导致生成了两个图片(一个正常由file-loader解析生成,一个仅由css-loader解析引入)页面会出错,所以设置下面属性即可;
                type: 'javascript/auto',
            },
            // 配合图片资源
            {
                test: /\.html$/,
                // 处理html文件的img图片(负责引入img,从而能被url-loader进行处理)
                loader: 'html-loader'
            },
            // 打包其他资源 如icon图标 这里有点问题
            {
                // 排除css/html/scss/js等资源,其他的资源都使用file-loader
                exclude: /\.(css|html|js|scss)$/,
                loader: 'file-loader',
                options: {
                    name: '[hash:10].[ext]'
                }
            }

        ]
    },
    // 4.核心配置:插件配置
    plugins: [
        new HtmlWebpackPlugin({
            template: './src/index.html'
        })
    ],
    // 5.核心配置:环境配置 development/produdtion
    mode: 'development',
    // 其他配置
    resolve: {
        // 配置别名
        alias: {
            '@': resolve(__dirname, 'src'),
        },
        // 指定 extensions 之后,使用require 和 import 的时候就不需要加文件扩展名了,查找的时候会依次匹配,但同一个目录有不同类型的同名文件时,也只会匹配第一个。
        extensions: ['.vue', '.js', '.json', '.scss', '.css'],
    },
    // 开发服务器devServer:用来自动打包(自动编译,自动打开浏览器,自动刷新浏览器等)
    // 特点:只会在内存中编译打包,不会有任何输出
    // 启动devServer指令为:npx webpack-dev-server 需要下载 npm install  webpack-dev-server -D
    devServer: {
        // 项目构建后路径,告诉服务器从哪里提供内容
        // 旧版本使用这个配置 contentBase: resolve(__dirname, 'build'),新版本使用static属性配置路径
        // webpack4配置devServer中用的是contentBase:“”;
        // webpack5需要替换成 static:“”
        static:  resolve(__dirname, 'build'),
        // 启动gzip压缩
        compress: true,
        // 启动服务端口号
        port: 3000,
        // 自动打开浏览器
        open: true
    }
}