03月27, 2017

process.env记录

今天跟同事学了一招,关于env变量的处理。

之前能想到的方案大概是这样的:

export a=1 npm start

但是我们知道,export只能被mac支持,在window下的写法是set

那么为了兼容,必须写两个scripts,未免太蛋疼了。当然我们可以用 cross-env这个npm包来解决兼容的问题

create-react-app文档里面有提到:

Adding Development Environment Variables In .env

这才知道它依赖了一个dotenv的npm包。

使用如下:

在根目录下新建一个.env文件:

a=1
b=2

随后新建一个js文件,内容如下:

let obj = require("dotenv").config();

console.log(obj)

console.log(process.env.b);

我们可以简单查看一下dotenv里面做了什么,这是它的config方法的实现:

function config (options) {
  var path = ".env"
  var encoding = "utf8"

  if (options) {
    if (options.path) {
      path = options.path
    }
    if (options.encoding) {
      encoding = options.encoding
    }
  }

  try {
    // specifying an encoding returns a string instead of a buffer
    var parsedObj = parse(fs.readFileSync(path, { encoding: encoding }))

    Object.keys(parsedObj).forEach(function (key) {
      process.env[key] = process.env[key] || parsedObj[key]
    })

    return { parsed: parsedObj }
  } catch (e) {
    return { error: e }
  }
}

parse方法就是解析.env文件,得到key value的键值对,随后给process.env赋值即可。

function parse (src) {
  var obj = {}

  // convert Buffers before splitting into lines and processing
  src.toString().split("\n").forEach(function (line) {
    // matching "KEY" and "VAL" in "KEY=VAL"
    var keyValueArr = line.match(/^\s*([\w\.\-]+)\s*=\s*(.*)?\s*$/)
    // matched?
    if (keyValueArr != null) {
      var key = keyValueArr[1]

      // default undefined or missing values to empty string
      var value = keyValueArr[2] ? keyValueArr[2] : ""

      // expand newlines in quoted values
      var len = value ? value.length : 0
      if (len > 0 && value.charAt(0) === """ && value.charAt(len - 1) === """) {
        value = value.replace(/\\n/gm, "\n")
      }

      // remove any surrounding quotes and extra spaces
      value = value.replace(/(^[""]|[""]$)/g, "").trim()

      obj[key] = value
    }
  })

  return obj
}

本文链接:www.my-fe.pub/post/process-env-handle.html

-- EOF --

Comments

评论加载中...

注:如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理。