实践webpack+es6+react+redux+antd构建项目(四) 区分dev和prod环境

使用webpack主要是想因为其优秀的压缩打包功能,之前的配置中只是设置了关于dev环境的启动和运行。但是打包的时候文件并没有变小,也就是没有使用到压缩的配置。

这次会配置相关的压缩以及区分生产环境和开发环境

开发环境(development)和生产环境(production)的构建目标差异很大。在开发环境中,我们需要具有强大的、具有实时重新加载(live reloading)或热模块替换(hot module replacement)能力的 source map 和 localhost server。而在生产环境中,我们的目标则转向于关注更小的 bundle,更轻量的 source map,以及更优化的资源,以改善加载时间。由于要遵循逻辑分离,我们通常建议为每个环境编写彼此独立的 webpack 配置

使用的是webpack-merge来定义一个通用配置

npm install --save-dev webpack-merge

然后在目录中增加webpack文件夹,里面有这样几个文件

在这里插入图片描述

webpack.common.js 是通用配置,一般来说入口,出口,公共加载器都是在这里配置的。webpack.dev.js是dev环境的配置,是需要有devServer配置的;webpack.prod.js是production环境的配置,主要设置压缩打包等配置。

webpack.common.js

const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
    entry: {
        app: './src/index.js'
    },
    output: {
        // filename: 'bundle.js',
        // 根据入口起点名称动态生成bundle名称
        filename: '[name].bundle.js',
        path: path.resolve(__dirname, '../dist'),
        publicPath: '/'
    },
    plugins: [
        new HtmlWebpackPlugin({template:'./public/index.html'}),
    ],
    module: {
        rules: [
            { 
                test: /\.jsx?$/,  
                exclude: /node_modules/, 
                use: {
                    loader: 'babel-loader'
                } 
            },
            {
                test: /\.(css|less)$/,
                use: [
                    'style-loader',
                    'css-loader',
                    'less-loader'
                ]
            },
            {
                test: /\.(png|svg|jpg|gif)$/,
                use: [
                    'file-loader'
                ]
            },
            {
                test: /\.(woff|woff2|eot|ttf|otf)$/,
                use: [
                    'file-loader'
                ]
            }
        ]
    }
}

webpack.dev.js

const merge = require('webpack-merge');
const common = require('./webpack.common.js');
const webpack = require('webpack');

module.exports = merge(common, {
    devtool: 'inline-source-map',
    devServer: {
        // 默认 localhost
        host: 'localhost',
        port: 9000,
        // 实现实时更新,
        // 告诉dev server 在哪里查找文件
        contentBase: './dist',
        // 启动 HMR 热替换
        // 允许在运行时更新各种模块,而无需进行完全刷新
        hot: true,
        // 处理页面强制刷新时路由页面404问题
        historyApiFallback: true,
        // 配置easymock代理
        proxy: {
            "/api":{
                changeOrigin: true,
                target: "https://www.easy-mock.com/mock/5c24adb39a96a934e48de313"
            }
        }
    },
    plugins: [
        // 热替换
        new webpack.HotModuleReplacementPlugin(),
    ],
    // 启用相应模式(development,production)下的webpack内置的优化
    mode: 'development'
})

webpack.prod.js

const merge = require('webpack-merge');
const UglifyJSPlugin = require('uglifyjs-webpack-plugin');
const common = require('./webpack.common.js');
const webpack = require('webpack');
const CleanWepackPlugin = require('clean-webpack-plugin');

module.exports = merge(common, {
    // 调试源码(debug)和运行基准测试(benchmark tests)
    // 会生成app.bundle.js.map
    // devtool: 'source-map',
    plugins: [
        new CleanWepackPlugin(['dist']),
        new UglifyJSPlugin({
            sourceMap: true
        }),
        new webpack.DefinePlugin({
            'process.env.NODE_ENV': JSON.stringify('production')
        })
    ],
    // 启用相应模式(development,production)下的webpack内置的优化
    mode: 'production'
});

之后在package.json中修改scripts脚本

"scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "build": "webpack --config=webpack/webpack.prod.js",
    "start": "webpack-dev-server --config=webpack/webpack.dev.js"
  }

通过不同的命令来查看运行情况。

主要是没有实现压缩,在想着实现压缩的时候不如直接区分生产和开发环境吧,执行npm run build之后的dist/app.bundle.js文件果然体积变小了很多。

over~

链接:

关注我获取更多前端资源和经验分享
在这里插入图片描述

感谢大佬们阅读,希望大家头发浓密,睡眠良好,情绪稳定,早日实现财富自由~

发布了102 篇原创文章 · 获赞 202 · 访问量 40万+

猜你喜欢

转载自blog.csdn.net/zr15829039341/article/details/85787545