webpack 之环境

42 阅读2分钟

6.1 环境

6.1.1模式(mode)

  • 日常的前端开发工作中,一般都会有两套构建环境
  • 一套开发时使用,构建结果用于本地开发调试,不进行代码压缩,打印 debug 信息,包含 sourcemap 文件
  • 一套构建后的结果是直接应用于线上的,即代码都是压缩后,运行时不打印 debug信息,静态文件不包括 sourcemap
  • webpack 4.x 版本引入了 mog的概念
  • 当你指定使用 production mode 时,默认会启用各种性能优化的功能,包括构建结果优化以及 webpack运行性能优化
  • 而如果是 development mode 的话,则会开启 debug 工具,运行时打印详细的错误信息,以及更加快速的增量编译构建选项

6.1.2 环境差异

  • 开发环境

  • 需要生成 sourcemap 文件

  • 需要打印 debug 信息

  • 需要 live reload 或者 hot reload 的功能

  • 生产环境

  • 可能需要分离 cSS 成单独的文件,以便多个页面共享同一个 css 文件

  • 需要压缩 HTML/CSS/JS 代码

  • 需要压缩图片

  • 其默认值为 production

6.1.3 区分环境

  • -mode 用来设置模块内的 process.env.NODE_ENV

  • -env 用来设置webpack配置文件的函数参数

  • croSS-env用来设置node环境的 process.env.NODE_ENV

  • dotenv可以按需加载不同的环境变量文件

  • define-plugin用来配置在 编译时候 用的 全局常量

6.1.3.1 安装

cnpm i cross-env dotenv terser-webpack-plugin optimize-css-assets-webpack-plugin -D

6.1.3.2 mode默认值

  • webpack的mode默认为 production

  • webpack serve 的默认为 development

  • 可以在模块内通过 process.env.NODE_ENV 获取当前的环境变量,无法在 webpack配置文件 中获取此变量

    "scripts": {
    "build":"webpack"
    "start": "webpack serve" }

index.js

console. log(process.env.NODE_ENV);// development | production

webpack.config.js

console.log('NODE_ENV',process.env.NODE_ENV); // undefined

6.1.3.3 命令行传mode

  • 同配置1

    "scripts": { "build":"webpack --mode=production", "start":"webpack --mode=development serve" }

6.1.3.4 命令行配置env

  • 无法在模块内通过 process.env.NODE_ENV访问

  • 可以通过 webpack 配置文件中通过函数获取当前环境变量

    "scripts": { "dev": "webpack serve --env=development", "build": "webpack --env=production" }

index.js

console.log(process.env.NODE_ENV); //undefined

webpack.config.js

console.log("NODE_ENVI",process.env.NODE_ENV); //undefined

const TerserWebpackPlugin = require('terser-webpack-plugin');
const OptimizeCssAssetsWebpackPlugin = require('optimize-css-assets-webpack-plugin');
module.exports = (env) => {
    console log('env', env);// (development: true) | (production: true}
    return{
        optimization: {
            minimize: env&&env.production,
            minimizer: (env&&env.production)?[new TerserWebpackPlugin({
                parallel:true//开启多进程并行压缩
            }),new OptimizeCssAssetswebpackPlugin({})]:[]
        }
    }
}

6.1.3.5 mode配置

  • 和命令行配置2一样

    module. exports = { mode:'development' }

6.1.3.6 DefinePlugin

  • 设置全局变量(不是 window ),所有模块都能读取到该变量的值
  • 可以在任意模块内通过 process.env.NODE_ENV获取当前的环境变量
  • 但无法在 node环境(webpack 配置文件中)下获取当前的环境变量

6.1.3.6.1 webpack.config.js

console.log('process.env.NODE_ENV',process.env.NODE_ENV);// undefined 
console.log('NODE_ENV',NODE_ENV); // error
module.exports = {
    plugins: [
        //在编译时使用的全局变量,在浏览器的运行阶段就变成了值了
        new webpack.DefinePlugin({
            "process.env.NODE_ENV":JSON.stringify('development'),//注意用双引号引起来 
            "NODE_ENV':JSON.stringify('production'),
        })
    ]
}

6.1.3.6.2 src/index.js

console.log(NODE_ENV) ;// production