webpack(11)区分开发配置和生成配置

本文详细介绍了如何在Webpack项目中为开发和生产环境分别配置文件,包括修改entry和output路径,调整loader处理规则,以及使用ESLint和HTMLWebpackPlugin。还演示了如何通过package.json简化命令行编译过程。
摘要由CSDN通过智能技术生成

前言

项目总要上线,开发时候的配置不一定符合生产时候的配置,这时就要两套配置。

1、根目录下面创建config文件夹,存放两套配置
在这里插入图片描述
2、webpack.dev.js的配置,相对路径相对的是根目录,所以即使有上一层,也不会改变,但是绝对路径要加上上一层config,开发模式不需要输出dist文件夹,可以去掉path和clean的配置。

const path = require('path');//node.js核心模块之一,路径模块

const ESLintPlugin = require('eslint-webpack-plugin');//引入eslint插件
const HtmlWebpackPlugin = require('html-webpack-plugin');//引入HTML插件

module.exports = {
    // 1、入口文件路径,相对路径
    entry: './src/js/sum.js',

    // 2、输出文件路径,绝对路径,path.resolve()获取绝对路径,
    // __dirname当前文件所在目录
    output: {
        //入口文件的输出目录
        filename: 'js/sum.js',
        // 所有文件的打包输出目录
        // path: path.resolve(__dirname,'dist'),
        // 再次打包时自动清空上次打包的上面path输出的整个目录,
        // 即为清空上次打包的整个dist目录
        // clean: true,
    },

    // 加载器
    module: {
        rules: [
            // loader的配置,每个资源处理配置项是一个对象
            {
                test: /\.css$/,//匹配.css后缀名字的文件
                use: ['style-loader', 'css-loader'],//使用的loader,使用顺序从右往左
            },
            {
                test: /\.less$/,
                use: ['style-loader', 'css-loader', 'less-loader'],
            },
            {
                test: /\.s[ca]ss$/,
                use: ['style-loader', 'css-loader', 'sass-loader'],
            },
            // 不设置图片的处理规则时,都会默认使用file-loader进行处理图片
            {
                test: /\.(png|jpe?g|gif|svg)$/,
                type: "asset",//表示使用内置的url-loader处理
                parser: {
                    dataUrlCondition: {
                        maxSize: 10 * 1024,//小于10kb的使用url-loader进行处理
                    }
                },
                // 自定义文件名称
                generator: {
                    // 输出图片名称,hash代表生成的哈希值,
                    // 是唯一的,保证名称的唯一性,冒号后面的数字表示取哈希值的多少位,
                    // 不设置表示默认20位数
                    // ext表示图片的后缀名,
                    // query表S"static/images/[hash:10][ext][query]"
                    filename: "static/images/[hash:10][ext][query]"
                }
            },
            {
                test: /\.(ttf|woff?2|mp3|mp4|avi)$/,//匹配字体图标文件、或者其他不需要处理的静态资源
                //asset/resource表示使用file-loader来处理文件,会原样输出,
                // 不对文件进行额外处理
                type: "asset/resource",
                generator: {
                    // 自定义字体图标文件打包后存放的位置
                    filename: 'static/media/[hash][ext]'
                }
            },
            {
                test: /\.js$/,//匹配js文件
                //排除node_modules文件,这里的内容是处理已经好的,无需重复处理,加大工作量
                exclude: /node_modules/,
                use: {
                    loader: "babel-loader",
                    // 这里可以在options中配置预设,
                    // 也可以单独用babel.config.js文件配置,效果一样
                    // options: {
                    //     presets: ["@babel/preset-env"]
                    // }
                }
            }
        ]
    },

    // 插件,复数且是个数组 
    plugins: [
        // plugins配置,插件一般是构造函数,需要使用new来创建实例
        // 传参是一个选项,里面可以设置一些需要的配置
        new ESLintPlugin({
            // context就是需要检查的文件目录,使用绝对路径,其他配置可以看官网
            context: path.resolve(__dirname, '../src'),
        }),
        new HtmlWebpackPlugin({
            // template指定引入输出文件的模板,这样就可以在打包的HTML中自动加上
            // 输出的JS文件,不加template参数就会新生成一个HTML文件,并加上打包的
            // JS文件,这样打包后的HTML没有我们写的代码
            template: path.resolve(__dirname,'../src/index.html')
        })
    ],
    // 搭建开发服务器
    devServer: {
        host: "localhost",//启动服务域名
        port: "8080",//启动端口号
        open: true,//打开浏览器
    },
    // 模式 development 
    mode: "development",//开发模式或者生产模式
}

3、webpack.pro.js配置,相对路径不变,绝对路径加上一级config
,mode改成production,生产模式会将代码压缩输出。

const path = require('path');//node.js核心模块之一,路径模块

const ESLintPlugin = require('eslint-webpack-plugin');//引入eslint插件
const HtmlWebpackPlugin = require('html-webpack-plugin');//引入HTML插件

module.exports = {
    // 1、入口文件路径,相对路径
    entry: './src/js/sum.js',

    // 2、输出文件路径,绝对路径,path.resolve()获取绝对路径,
    // __dirname当前文件所在目录
    output: {
        //入口文件的输出目录
        filename: 'js/sum.js',
        // 所有文件的打包输出目录
        path: path.resolve(__dirname,'../dist'),
        // 再次打包时自动清空上次打包的上面path输出的整个目录,
        // 即为清空上次打包的整个dist目录
        clean: true,
    },

    // 加载器
    module: {
        rules: [
            // loader的配置,每个资源处理配置项是一个对象
            {
                test: /\.css$/,//匹配.css后缀名字的文件
                use: ['style-loader', 'css-loader'],//使用的loader,使用顺序从右往左
            },
            {
                test: /\.less$/,
                use: ['style-loader', 'css-loader', 'less-loader'],
            },
            {
                test: /\.s[ca]ss$/,
                use: ['style-loader', 'css-loader', 'sass-loader'],
            },
            // 不设置图片的处理规则时,都会默认使用file-loader进行处理图片
            {
                test: /\.(png|jpe?g|gif|svg)$/,
                type: "asset",//表示使用内置的url-loader处理
                parser: {
                    dataUrlCondition: {
                        maxSize: 10 * 1024,//小于10kb的使用url-loader进行处理
                    }
                },
                // 自定义文件名称
                generator: {
                    // 输出图片名称,hash代表生成的哈希值,
                    // 是唯一的,保证名称的唯一性,冒号后面的数字表示取哈希值的多少位,
                    // 不设置表示默认20位数
                    // ext表示图片的后缀名,
                    // query表S"static/images/[hash:10][ext][query]"
                    filename: "static/images/[hash:10][ext][query]"
                }
            },
            {
                test: /\.(ttf|woff?2|mp3|mp4|avi)$/,//匹配字体图标文件、或者其他不需要处理的静态资源
                //asset/resource表示使用file-loader来处理文件,会原样输出,
                // 不对文件进行额外处理
                type: "asset/resource",
                generator: {
                    // 自定义字体图标文件打包后存放的位置
                    filename: 'static/media/[hash][ext]'
                }
            },
            {
                test: /\.js$/,//匹配js文件
                //排除node_modules文件,这里的内容是处理已经好的,无需重复处理,加大工作量
                exclude: /node_modules/,
                use: {
                    loader: "babel-loader",
                    // 这里可以在options中配置预设,
                    // 也可以单独用babel.config.js文件配置,效果一样
                    // options: {
                    //     presets: ["@babel/preset-env"]
                    // }
                }
            }
        ]
    },

    // 插件,复数且是个数组 
    plugins: [
        // plugins配置,插件一般是构造函数,需要使用new来创建实例
        // 传参是一个选项,里面可以设置一些需要的配置
        new ESLintPlugin({
            // context就是需要检查的文件目录,使用绝对路径,其他配置可以看官网
            context: path.resolve(__dirname, '../src'),
        }),
        new HtmlWebpackPlugin({
            // template指定引入输出文件的模板,这样就可以在打包的HTML中自动加上
            // 输出的JS文件,不加template参数就会新生成一个HTML文件,并加上打包的
            // JS文件,这样打包后的HTML没有我们写的代码
            template: path.resolve(__dirname,'../src/index.html')
        })
    ],
    // // 搭建开发服务器
    // devServer: {
    //     host: "localhost",//启动服务域名
    //     port: "8080",//启动端口号
    //     open: true,//打开浏览器
    // },
    // 模式 production 
    mode: "production",//或生产模式
}

4、直接运行开发配置并开启开发服务器:

npx webpack --config ./config/webpack.dev.js

在这里插入图片描述
5、直接终端运行开发配置并开启开发服务器:

npx webpack serve --config ./config/webpack.dev.js

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

6、直接终端运行生产配置

npx webpack --config ./config/webpack.pro.js


直接运行打包后的HTML文件就可以正常显示了。

7、如果多次终端输出命令行,每次这么长会比较麻烦,可以在package.json文件中配置指令来编译打包,在scripts对象中设置指令:

"scripts": {
    "dev": "webpack serve --config ./config/webpack.dev.js",
    "build": "webpack --config ./config/webpack.pro.js"
  },

然后只需要在终端执行:
1)开发模式

npm run dev

2)生产模式

npm run build
  • 10
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值