webpack学习笔记—dev和prod环境配置基本的区别

我的环境

  • win 10
  • node v10.13.0
  • npm 6.13.4
  • webpack 4.43.0
  • webpack-cli 3.3.12
  • webpack-dev-server 3.11.0
  • webpack-merge 5.0.7

引言

为了把开发环境的配置和生产环境的配置区分开来,我们提取公共配置到到一个配置文件,然后把dev和prod的配置分离。

操作

这里是对每一步的具体操作,主要就是修改配置文件

1.第一步

1.1

修改package.json,加入下面的scripts配置,我们dev环境会用到webpack-dev-server,但prod环境就不需要了

  "scripts": {
    "--": "先到当前目录找webpack",
    "build":"webpack --config ./src/build/webpack.prod.js",
    "dev":"webpack-dev-server --config ./src/build/webpack.dev.js"
  },
1.2

在src目录新建一个build文件夹,然后复制3份webpack.config.js,分别命名为webpack.common.js,webpack.dev.js,webpack.prod.js
webpack学习笔记—dev和prod环境配置基本的区别_第1张图片

2.第二步

2.1

webpack.common.js内容如下,具体视所在环境而定

//打包完创建一个index.html
const HtmlWebpackPlugin = require('html-webpack-plugin');
//打包前清理dist目录
const {CleanWebpackPlugin} = require('clean-webpack-plugin')
const path = require('path');
const webpack = require('webpack');

module.exports = {
    entry:{
        bundle:'./src/index.js',
    },
    module:{
        rules:[{
            test:/\.(jpg|png|gif)$/,
            use:{
                loader:'url-loader',
                options:{
                    //placeholder,占位符
                    name:'[name]_[hash].[ext]',
                    //指定文件输出路径
                    outputPath:"images/",
                    //大于limit则会打包文件返回文件名给js,小于limit会把文件以base64的形式放到js文件中
                    limit:20480
                }
            }
        },{
            test:/\.css$/,
            //webpack中loader执行有先后顺序,按照从下到上,从右到左来执行
            use:["style-loader",
            {
                loader:"css-loader",
                options:{
                    //在scss文件引入其它scss的时候,也会从下往上走2个loader,再到
                    //css-loader,避免遗漏掉import的scss文件
                    importLoaders:2,
                    //让css支持模块化打包,不让一个css作用于js的全局
                    // modules:true,
                }
            },
            "sass-loader",
            "postcss-loader"
        ],
        },
        {
            test:/\.(ttf|eot|svg|wolf|wolf2|woff)$/,
            use:{
                loader:'file-loader',
                options:{
                    outputPath:"font/",
                }
            }
        },
        {
            test: /\.js$/,
            exclude: /(node_modules|bower_components)/,
            use: {
              loader: 'babel-loader',
              options: {
                // presets: [['@babel/preset-env',{useBuiltIns:'usage'}],["@babel/preset-react"]],
                presets: [["@babel/preset-react"]],
                plugins: [['@babel/plugin-transform-runtime']]
              }
            }
          }
    ]
    },
    output:{
        // publicPath:"/",
        filename: '[name].js',
        path: path.resolve("./src",'dist')
    },
    plugins: [
        new HtmlWebpackPlugin({
            template:"src/template/index.html"
        },),
        new CleanWebpackPlugin()
        ]
}
2.2

安装webpack-merge依赖

npm i webpack-merge -D
2.3

把公共配置和每种环境独有配置合并导出
webpack.dev.js如下

const path = require('path');
const webpack = require('webpack');
const {merge} = require('webpack-merge');
const commonConfig = require('./webpack.common');

const devConfig = {
    mode:'development',
    //可以找出报错代码的源代码路径
    //cheap 只报告行号(不加会报告列)  module 会报告loader及第三方依赖的错误位置
    //加了inline就不产生映射文件了
    devtool:'cheap-module-eval-source-map',
    devServer:{
        //会把打包的东西放到内存里面
        contentBase:'./dist',
        open:true,
        hot:true,   //模块热更新,不会直接刷新浏览器,影响已经渲染的js模块
        hotOnly:true,//就算没渲染好,也不直接刷新
    },
    plugins: [
    new webpack.HotModuleReplacementPlugin(),
    ]
}

//合并公共配置文件和开发配置文件
module.exports = merge(commonConfig,devConfig);

webpack.prod.js如下

const {merge} = require('webpack-merge');
const commonConfig = require('./webpack.common');

const prodConfig = {
    mode:'production',
    //可以找出报错代码的源代码路径
    //cheap 只报告行号(不加会报告列)  module 会报告loader及第三方依赖的错误位置
    //加了inline就不产生映射文件了
    //生产环境不需要eval
    devtool:'cheap-module-source-map',
    plugins: [
    ]
}

module.exports = merge(commonConfig,prodConfig);

3.总结

避免不同环境不同配置的复杂情况下出现问题,影响开发效率,把不同环境的配置剥离掉

你可能感兴趣的:(前端,webpack4)