process.env.NODE_ENV
process對象是全局變量,它提供當前node.js的有關信息,以及控制當前node.js的有關進程。因為是全局變量,它對於node應用程序是始終可用的,無需require()。
NODE_ENV不是process.env對象上原有的屬性,它是我們自己添加上去的一個環境變量,用來確定當前所處的開發階段。
// package.json "start": "NODE_ENV=production node build.js" // set NODE_ENV=production node build.js //windows
env
要在開發和生產構建之間,消除 webpack.config.js
的差異,你可能需要環境變量。
webpack 命令行環境配置中,通過設置 --env
可以使你根據需要,傳入盡可能多的環境變量。在 webpack.config.js
文件中可以訪問到這些環境變量。例如,--env.production
或 --env.NODE_ENV=local
(NODE_ENV
通常約定用於定義環境類型,查看這里)。
// package.json "build": "NODE_ENV=dev webpack --env=dev --config ./webpack.config.js"
然而,你必須對 webpack 配置進行一處修改。通常,module.exports
指向配置對象。要使用 env
變量,你必須將 module.exports
轉換成一個函數:
// webpack.config.js module.exports = env => { console.log('NODE_ENV: ', env.NODE_ENV) // 'local' console.log('Production: ', env.production) // true return { entry: './src/index.js', output: { filename: 'bundle.js', path: path.resolve(__dirname, 'dist') } } }
綜合使用
1.安裝cross-env兼容不同系統
npm i cross-env --save-dev
2.在package.json中scripts里定義NODE_ENV留作全局使用,定義env留作webpack配置文件中使用。
// package.json "scripts": { "build:dev": "cross-env NODE_ENV=dev webpack --env=dev --config ./webpack.config.js", "build:test": "cross-env NODE_ENV=test webpack --env=test --config ./webpack.config.js" },
3.在webpack配置文件中使用env,使用內置的DefinePlugin全局化process.env.NODE_ENV,與最外層的package.json保持同步。
// webpack.config.js const path = require('path'); const webpack = require('webpack'); module.exports = env => { // 這里可以使用env了 console.log(env) return { mode: 'production', entry: './index.js', output: { path: path.resolve(__dirname, 'dist'), filename: 'bundle.js' }, plugins:[ new webpack.DefinePlugin({ // 這里要JSON.stringify包裝下 'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV) }) ] }; };
4.在全局代碼中可以使用process.env.NODE_ENV判斷環境了
// index.js console.log(process.env.NODE_ENV) if(process.env.NODE_ENV === 'dev'){ console.log('this dev') }else if (process.env.NODE_ENV === 'test'){ console.log('test') }