设置环境变量

命令行

npx webpack --env SDP_ENV=test

package.json

  1. {
  2. "scripts": {
  3. "start": "cross-env SDP_ENV=test gms dev",
  4. "build": "webpack --env SDP_ENV=test"
  5. }
  6. }

获取环境变量

webpack.config.js

必须将 module.exports 转换成一个函数,默认参数为 env

  1. module.exports = (env) => {
  2. console.log('env', env.SDP_ENV) // 'test'
  3. return {
  4. entry: './src/index.js',
  5. }
  6. }

但是此时在js源码中,通过 process.env.SDP_ENV 获取不到该环境变量

DefinePlugin

DefinePlugin 实现了在编译时创建全局变量,从而使得代码中能够获取到环境变量。

webpack.config.js

  1. module.exports = (env) => {
  2. console.log('env', env.SDP_ENV) // 'test'
  3. return {
  4. plugins: [
  5. new webpack.DefinePlugin({
  6. 'process.env.SDP_ENV': `'${env.SDP_ENV}'` // 需要添加引号
  7. })
  8. ]
  9. }
  10. }

DefinePlugin插件会直接替换文本,因此提供的值必须在字符串本身中再包含一个 实际的引号

gem-mine.config.js 中使用了 webpack-chain

  1. module.exports = {
  2. chainWebpack(config) {
  3. config.plugin('define').tap(pluginOption => {
  4. pluginOption[0].process = {
  5. env: {
  6. SDP_ENV: `'${process.env.SDP_ENV}'`
  7. }
  8. }
  9. return pluginOption
  10. })
  11. },
  12. }

index.js

  1. const env = process.env.SDP_ENV // test

打包时动态获取环境变量

错误示例

package.json

  1. {
  2. "scripts": {
  3. "build:test": "cross-env SDP_ENV=test gms build",
  4. "build:pre": "cross-env SDP_ENV=preproduction gms build",
  5. "build:pro": "cross-env SDP_ENV=product gms build",
  6. }
  7. }

该做法需要针对不同环境各自执行build,非常繁琐。

正确做法

对接共享平台打包

pom.xml

  1. <build>
  2. <plugins>
  3. <plugin>
  4. <groupId>org.codehaus.mojo</groupId>
  5. <artifactId>exec-maven-plugin</artifactId>
  6. <version>3.0.0</version>
  7. <executions>
  8. <execution>
  9. <goals>
  10. <goal>exec</goal>
  11. </goals>
  12. </execution>
  13. <configuration>
  14. <executable>npm</executable>
  15. <workingDirectory>src/main/js</workingDirectory>
  16. <arguments>
  17. <argument>config</argument>
  18. <argument>set</argument>
  19. <argument>SDP_ENV</argument>
  20. <argument>${env}</argument>
  21. </arguments>
  22. </configuration>
  23. </executions>
  24. </plugin>
  25. </plugins>
  26. </build>

gem-mine.config.js

  1. module.exports = {
  2. chainWebpack(config) {
  3. // use webpack-chain
  4. config.plugin('define').tap(pluginOption => {
  5. if (process.env.MAVEN_CMD_LINE_ARGS) {
  6. // 为process.env添加环境变量`SDP_ENV`
  7. pluginOption[0].process = {
  8. env: {
  9. SDP_ENV: `'${process.env.MAVEN_CMD_LINE_ARGS.split('-Denv=')[1].split(' ')[0]}'` // 注意引号
  10. }
  11. }
  12. }
  13. return pluginOption
  14. })
  15. },
  16. }

index.js

  1. const env = process.env.SDP_ENV

本地开发时设置环境变量

目前开发过程中,各项目设置本地环境的位置不统一。

package.json

  1. {
  2. "scripts": {
  3. "start": "cross-env SDP_ENV=test gms dev"
  4. }
  5. }

优点:统一设置环境的位置。

缺点:切换环境较麻烦,修改命令后需要重启服务。

源码设置

config.js

  1. export function getEnv() {
  2. const sdpEnv = process?.env?.SDP_ENV
  3. if (sdpEnv && sdpEnv !== 'undefined') {
  4. return sdpEnv
  5. }
  6. // 本地开发环境,自行切换注释
  7. const defaultEnv = 'test'
  8. // const defaultEnv = 'preproduction'
  9. // const defaultEnv = 'product'
  10. return defaultEnv
  11. }

优点:切换环境快,注释代码后无需重启。

缺点:设置环境的位置不便统一。