webpack 知识系列第二篇

92 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第24天,点击查看活动详情

一、打包图片资源

  1. 创建文件

    image.png

  2. 下载安装 loader 包

    npm install --save-dev html-loader url-loader file-loader

  3. 修改配置文件

    const { resolve } = require('path');
    const HtmlWebpackPlugin = require('html-webpack-plugin');
    module.exports = {
        entry: './src/index.js',
        output: {
            filename: 'built.js',
            path: resolve(__dirname, 'build')
        },
        module: {
            rules: [
                {
                    test: /\.less$/,
                    // 要使用多个 loader 处理用 use
                    use: ['style-loader', 'css-loader', 'less-loader']
                },
                {
                    // 问题:默认处理不了 html 中 img 图片
                    // 处理图片资源
                    test: /\.(jpg|png|gif)$/,
                    // 使用一个 loader
                    // 下载 url-loader file-loader
                    loader: 'url-loader',
                    options: {
                        // 图片大小小于 8kb,就会被 base64 处理
                        // 优点: 减少请求数量(减轻服务器压力)
                        // 缺点:图片体积会更大(文件请求速度更慢)
                        limit: 8 * 1024,
                        // 问题:因为 url-loader 默认使用 es6 模块化解析,而 html-loader 引入图片是 commonjs
                        // 解析时会出问题:[object Module]
                        // 解决:关闭 url-loader 的 es6 模块化,使用 commonjs 解析
                        esModule: false,
                        // 给图片进行重命名
                        // [hash:10]取图片的 hash 的前 10 位
                        // [ext]取文件原来扩展名
                        name: '[hash:10].[ext]'
                    }
                },
                {
                    test: /\.html$/,
                    // 处理 html 文件的 img 图片(负责引入 img,从而能被 url-loader 进行处理)
                    loader: 'html-loader'
                }
            ]
        },
        plugins: [
            new HtmlWebpackPlugin({
                template: './src/index.html'
            })
        ],
        mode: 'development'
    };
    
  4. 运行指令: webpack

二、打包其他资源

  1. 创建文件

    image.png

  2. 修改配置文件

        const { resolve } = require('path');
        const HtmlWebpackPlugin = require('html-webpack-plugin');
        module.exports = {
            entry: './src/index.js',
            output: {
                filename: 'built.js',
                path: resolve(__dirname, 'build')
            },
            module: {
                rules: [
                    {
                        test: /\.css$/,
                        use: ['style-loader', 'css-loader']
                    },
                    // 打包其他资源(除了 html/js/css 资源以外的资源)
                    {
                        // 排除 css/js/html 资源
                        exclude: /\.(css|js|html|less)$/,
                        loader: 'file-loader',
                        options: {
                            name: '[hash:10].[ext]'
                        }
                    }
                ]
            },
            plugins: [
                new HtmlWebpackPlugin({
                    template: './src/index.html'
                })
            ],
            mode: 'development'
        };
    
  3. 运行指令: webpack

三、devserver

  1. 创建文件

    image.png

  2. 修改配置文件

    const { resolve } = require('path');
    const HtmlWebpackPlugin = require('html-webpack-plugin');
    module.exports = {
        entry: './src/index.js',
        output: {
            filename: 'built.js',
            path: resolve(__dirname, 'build')
        },
        module: {
            rules: [
                {
                    test: /\.css$/,
                    use: ['style-loader', 'css-loader']
                },
                // 打包其他资源(除了 html/js/css 资源以外的资源)
                {
                    // 排除 css/js/html 资源
                    exclude: /\.(css|js|html|less)$/,
                    loader: 'file-loader',
                    options: {
                        name: '[hash:10].[ext]'
                    }
                }
            ]
        },
        plugins: [
            new HtmlWebpackPlugin({
                template: './src/index.html'
            })
        ],
        mode: 'development',
        devServer: {
            // 项目构建后路径
            contentBase: resolve(__dirname, 'build'),
            // 启动 gzip 压缩
            compress: true,
            // 端口号
            port: 3000,
            // 自动打开浏览器
            open: true
        }
    };
    
  3. 运行指令: npx webpack-dev-server

四、开发环境配置

1.创建文件

image.png

  1. 修改配置文件

    const { resolve } = require('path');
    const HtmlWebpackPlugin = require('html-webpack-plugin');
    module.exports = {
        entry: './src/js/index.js',
        output: {
            filename: 'js/built.js',
            path: resolve(__dirname, 'build')
        },
        module: {
            rules: [
                // loader 的配置
                {
                    // 处理 less 资源
                    test: /\.less$/,
                    use: ['style-loader', 'css-loader', 'less-loader']
                },
                {
                    // 处理 css 资源
                    test: /\.css$/,
                    use: ['style-loader', 'css-loader']
                },
                {
                    // 处理图片资源
                    test: /\.(jpg|png|gif)$/,
                    loader: 'url-loader',
                    options: {
                        limit: 8 * 1024,
                        name: '[hash:10].[ext]',
                        // 关闭 es6 模块化
                        esModule: false,
                        outputPath: 'imgs'
                    }
                },
                {
                    // 处理 html 中 img 资源
                    test: /\.html$/,
                    loader: 'html-loader'
                },
                {
                    // 处理其他资源
                    exclude: /\.(html|js|css|less|jpg|png|gif)/,
                    loader: 'file-loader',
                    options: {
                        name: '[hash:10].[ext]',
                        outputPath: 'media'
                    }
                }
            ]
        },
        plugins: [
            // plugins 的配置
            new HtmlWebpackPlugin({
                template: './src/index.html'
            })
        ],
        mode: 'development',
        devServer: {
            contentBase: resolve(__dirname, 'build'),
            compress: true,
            port: 3000,
            open: true
        }
    };
    
  2. 运行指令: npx webpack-dev-server

五、webpack 生产环境的基本配置

提取 css 成单独文件

  1. 下载安装包

    image.png

  2. 下载插件

    npm install --save-dev mini-css-extract-plugin

  3. 修改配置文件

    const { resolve } = require('path');
    const HtmlWebpackPlugin = require('html-webpack-plugin');
    const MiniCssExtractPlugin = require('mini-css-extract-plugin');
    module.exports = {
        entry: './src/js/index.js',
        output: {
            filename: 'js/built.js',
            path: resolve(__dirname, 'build')
        },
        module: {
            rules: [
                {
                    test: /\.css$/,
                    use: [
                    // 创建 style 标签,将样式放入
                    // 'style-loader',
                    // 这个 loader 取代 style-loader。作用:提取 js 中的 css 成单独文件
                    MiniCssExtractPlugin.loader,
                    // 将 css 文件整合到 js 文件中
                    'css-loader'
                    ]
                }
            ]
        },
        plugins: [
            new HtmlWebpackPlugin({
                template: './src/index.html'
            }),
            new MiniCssExtractPlugin({
                // 对输出的 css 文件进行重命名
                filename: 'css/built.css'
            })
        ],
        mode: 'development'
    };
    

六、总结

本篇主要介绍了webpack开发环境中的打包图片资源、打包其他资源、devserver等,以及webpack生产环境的基本配置中的提取css成单独文件,下一篇主要webpack生产环境下的其他配置项。