美文网首页
webpack中development和production模式

webpack中development和production模式

作者: 喜剧之王爱创作 | 来源:发表于2020-08-19 23:50 被阅读0次
0.jpg

写在前面

通过前面的学习,我们已经知道,在webpack打包的过程中,分developmentproduction两种模式,并且在不同的模式下,打包的配置项也是不同,但我们目前只有webpack.config.js这一个配置文件,要想每次在不同模式下打包,不修改对应的配置文件,那我们就需要将Development和Production模式下做区分配置

开始配置

我们想要将配置区分开来,就要将原本的webpack.config.js分成俩文件,分别为webpack.dev.jswebpack.prod.js,文件内容,其中webpack.dev.js和原先webapck.config.js一直,因为我们之前的配置都是依照开发环境来配置的。对于webpack.prod.js,我们需要在开发模式的配置中修改一些配置即可。

  • 我们将mode改为production
  • source-map配置改为cheap-module-source-map
  • devServer配置去掉
  • 去掉HMR配置
  • 去掉本地配置的tree shakingusedExports: true,因为在webpack4.0中,production模式下是默认开启tree shaking配置的

这样我们就得到了一个生产环境下的打包配置文件,下面我们对package.json做修改,来优化我们的打包

  "scripts": {
    "dev": "webpack-dev-server --config webpack.dev.js",
    "build": "webpack --config webpack.prod.js"
  }

这样,我们就可以通过执行不同的命令,来区分不同环境下的配置文件了。
但是我们会发现,这种解决方案,在两个配置文件中,会存在很多相同的代码。于是我们想着把相同的代码分离出来。我们在根目录下新建webpack.common.js,我们把两份文件公用的代码拆分到这个文件夹中,于是webpack.common.js就变成了下面这样

const HtmlWebpackPlugin = require('html-webpack-plugin');
const {CleanWebpackPlugin} = require('clean-webpack-plugin')
const path = require('path')
module.exports = {
    entry: {
        main: './src/index.js',
    },
    module: {
        rules: [{
            test: /\.(jpg|png|gif)$/,
            use: {
                loader: 'url-loader',
                options: {
                    name: '[name]_[hash].[ext]',
                    outputPath: 'images/',
                    limit: 2048
                }
            }
        },{
            test: /\.(eot|ttf|svg|woff)$/,
            use: {
                loader: 'file-loader'
            }
        },{
            test: /\.scss$/,
            use: [
                'style-loader',
                {
                    loader: 'css-loader',
                    options: {
                        importLoaders: 2,
                    }
                },
                'sass-loader',
                'postcss-loader'
            ],
        },{
            test: /\.css$/,
            use: [
                'style-loader',
                'css-loader',
                'postcss-loader'
            ],
        },
        { 
            test: /\.js$/,
            exclude: /node_modules/,
            loader: 'babel-loader',
        }]
    },
    plugins: [
        new HtmlWebpackPlugin({
        template: 'src/index.html'
        }),
        new CleanWebpackPlugin()
    ],
    output: {
        filename: '[name].js',
        path: path.resolve(__dirname, 'dist')
    },
}

拆分是拆分了,但毕竟将来我们执行的是dev.jsprod.js,不能让里面就剩那么一点内容,所以,我们还需要让拆分出来的东西和这两个文件做一个合并再输出。这时候我们需要用到webpack-merge

npm install webpack-merge -D

然后我们对dev.js做下面的修改

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

const devConfig = {
    mode: 'development',
    devtool: 'cheap-module-eval-source-map',
    devServer: {
        contentBase: './dist',
        open: true,
        hot: true
    },
    plugins: [
        new webpack.HotModuleReplacementPlugin()
    ],
    optimization: {
        usedExports: true
    }
}
module.exports = merge(commonConfig, devConfig)

prod.js同理,这里,我们使用的webapck-merge插件,将两个配置做了一个合并,这样,我们就可以把两个环境下公有的配置拆分出来了~
做了上面的配置后,我们试试不同环境下的打包吧~~这样是不是方便了很多呢。其实在一些框架中,会把我们现在的三个webapck配置文件放到一个根目录下的build文件夹中,然后修改对应的packagejson中的指令路径,这样会整洁一些,这里我就不演示了,同学们可以线下自己配一下。。

写在后面

这篇的内容比较简单,但是其中的思想会对比在webpack搭建项目中有很多的帮助。

相关文章

网友评论

      本文标题:webpack中development和production模式

      本文链接:https://www.haomeiwen.com/subject/iywdjktx.html