4-12 环境变量的使用

1. 简介

其实我么之前已经将webpack.config.js 按环境进行去了区分配置,那么在公共配置文件中我们能否知道当前所处的环境,并据此做逻辑区分呢?

2. env

对于 webpack.config.js 来讲,除了导出一个对象以外,其实还可以导出一个函数。

// webpack.common.js
const path = require('path');
const devConfig = require('./webpack.dev');
const prodConfig = require('./webpack.prod');
const merge = require('webpack-merge');

const commonConfig = {
    entry: {
        index: "./src/index.js"
    },
    output: {
        path: path.resolve(__dirname, '../dist'),
        filename: "[name].bundle.js",
    },
    module: {
        rules: [
            {
                test: /\.(jpg|jpeg|png|gif)$/,
                use: {
                    loader: 'url-loader',
                    options: {
                        name: '[name].[ext]',
                        limit: 2048
                    }
                }
            },
            {
                test: /\.css$/,
                use: [ 'style-loader', 'css-loader' ]
            },
            {
                test: /\.scss$/,
                use: [
                    'style-loader',
                    'css-loader',
                    'postcss-loader',
                    'sass-loader',
                ]
            },
            {
                test: /\.(eot|svg|ttf|woff)$/,
                use: 'file-loader'
            }
        ]
    },
    optimization: {
        splitChunks: {
            chunks: 'all'
        }
    }
};

module.exports = (env, argv) => {
    console.log('===', env, argv);
    if (env && env.production) {
        return merge(commonConfig, prodConfig);
    }
    return merge(commonConfig, devConfig);
};
// webpack.dev.js
var path = require('path');

var devConfig = {
    mode: 'development',
    devtool: "cheap-module-eval-source-map",
    devServer: {
        contentBase: path.resolve(__dirname, 'dist'),
        open: true,
        port: 3000,
    },
};
module.exports = devConfig;
// webpack.prod.js

var prodConfig = {
    mode: 'production',
    devtool: "cheap-module-source-map"
};

module.exports = prodConfig;
"dev": "webpack --config ./build/webpack.common.js --watch",

运行 npm run dev,会发现:


image.png

现在 env 是空的,argv 是我们的一些运行参数。我们现在手动传入 env:

"dev": "webpack --env.development --config ./build/webpack.common.js --watch",
image.png

发现此时 env 是我们在脚本指定的值,并且同时该属性也保存到了 argv。这样我们就可以根据环境做区分打包了:

"dev": "webpack --env.development --config ./build/webpack.common.js --watch",
"build": "webpack --env.production --config ./build/webpack.common.js"

3. process.env.NODE_ENV

对于配置文件,我们可以使用 env,那么在源码当中,我们是否可以利用环境变量呢?可以看 mode

image.png

mode 本身会通过 DefinePlugin 提供一个全局变量。我们来看下:

// index.js

console.log('-----', process.env.NODE_ENV);

打包如下:


image.png

我们就可以在源码中根据这个变量来进行环境的区分。这里涉及到 DefinePlugin 插件,这个插件可以定义一些全局的变量,我们可以在模块当中直接使用这些变量,无需作任何声明。

4. 小结

合理利用环境变量,能帮助我们简化逻辑。但要防止滥用,能通过配置文件单独区分配置的还是尽量写在配置文件,方便维护。

参考

webpack4系列教程(九):开发环境和生产环境
https://webpack.js.org/configuration/mode/#mode-development
NODE_ENV和webpack
理解webpack之process.env.NODE_ENV详解(十八)
Webpack DefinePlugin And ProvidePlugin

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1、优化loader配置1.1 缩小文件匹配范围(include/exclude) 通过排除node_module...
    田成力阅读 454评论 0 0
  • 写在开头 先说说为什么要写这篇文章, 最初的原因是组里的小朋友们看了webpack文档后, 表情都是这样的: (摘...
    Lefter阅读 5,319评论 4 31
  • 讲述了一位心理医生,治疗两位病人的经历。一位病人持续的与不同的男性发生暧昧关系,知道这样不好,却一直不愿意面对自己...
    蒋大来阅读 280评论 0 0
  • 五 晚上准备去图书馆,人多,不仅学生,连那些想自学成才的“大爷”们也一顺溜占了几十个座位。楚凌力返身直奔文化馆,那...
    唐求爱收藏阅读 199评论 0 1
  • 接近春节了,马路上都是要放假的氛围,M7的课却似乎没有放假一说,每天开心的玩,就已经很好了。在等爸爸的时候,带着M...
    杰西木西阅读 146评论 0 0