美文网首页
为React单页应用提供Runtime运行时环境变量

为React单页应用提供Runtime运行时环境变量

作者: wlchn | 来源:发表于2019-03-27 16:59 被阅读0次

使用create-react-app创建的单页应用(SPA)是在build时注入环境变量的。一旦build成静态文件便不能动态提供环境变量了。
比如build一个单页应用的docker image,可以在build时提供环境变量。但是已经build完成,使用docker run运行的时候不能再传递环境变量。
本文主要解决在运行时提供环境变量的问题。
原理:通过一段shell脚本将指定将env转换为config.js文件,该文件和build好的static文件serve在同一目录下,在应用中引用config.js文件,通过window._env获取环境变量。shell脚本通过docker image的entrypoint执行。服务使用go构建的一个简单服务器,比nginx轻量很多。

  1. 将如下env.sh文件拷问到项目目录下,在entrypoint(docker run)时执行,作用是将环境变量转出config.js
#!/bin/sh
if [ $CONFIG_VARS ]; then
  # clear
  echo -n > ${CONFIG_FILE_PATH}/config.js

  SPLIT=$(echo $CONFIG_VARS | tr "," "\n")
  echo "window._env = {" >> ${CONFIG_FILE_PATH}/config.js

  for VAR in ${SPLIT}; do
      VALUE=$(printenv ${VAR})
      echo "  ${VAR}: \"${VALUE}\"," >> ${CONFIG_FILE_PATH}/config.js
  done

  echo "}" >> ${CONFIG_FILE_PATH}/config.js
fi

# disable broswer cache
sed -i "s/config.js?v=[0-9]*/config.js?v=$(date +'%s')/g" /srv/http/index.html
# for macOS
# sed -i "" "s/config.js?v=[0-9]*/config.js?v=$(date +'%s')/g" /srv/http/index.html

# exec CMD
exec "$@"

例如

# 传入
CONFIG_VARS=ABC,XYZ
ABC=helloabc
XYZ=HELLOXYZ

# 转换为
window._env = {
  ABC: "helloabc",
  XYZ: "HELLOXYZ",
}
  1. 编写Dockerfile,使用goStatic当做静态文件服务器(比nginx轻量)。build完成只有几MB.
FROM node:11 AS builder
COPY . /app
WORKDIR /app
RUN yarn install
RUN yarn run build

FROM wlchn/gostatic:latest
ENV CONFIG_FILE_PATH /srv/http
COPY --from=builder /app/build /srv/http
COPY ./env.sh /env.sh
# Ensure convert envs to window._env
ENTRYPOINT ["sh", "/env.sh"]
# start server. listen on 8043(in container) by default.
CMD ["/goStatic"]
  1. 在项目中引用config.js
<script type="text/javascript" src="/config.js?v="></script>
  1. 使用环境变量,通过window._env获取
let _env = process.env;
// check if there is env exits in local, otherwise using window._env
if (_env.ENV_ABC) {
  _env = window._env;
}
// so you can use env like _env.ENV_ABC
  1. 转换示例
# pass envs like:
CONFIG_VARS=ABC,XYZ
ABC=helloabc
XYZ=HELLOXYZ

# you coud get config.js
window._env = {
  ABC: "helloabc",
  XYZ: "HELLOXYZ",
}

# in your app, you can use like
console.log(_env.ABC)
console.log(_env.XYZ)

GitHub

reference

相关文章

  • 为React单页应用提供Runtime运行时环境变量

    使用create-react-app创建的单页应用(SPA)是在build时注入环境变量的。一旦build成静态文...

  • 进程数据获取,动态编译,RandomAccessFile

    RunTime Runtime用于表示Jvm运行时的状态,封装了Jvm进程,单例模式。 RunTime提供exec...

  • React脚手架扩展less样式

    create-react-app是由React官方提供,并推荐构建React单页应用程序的最佳方法,但是默认不支持...

  • 如何让create-react-app锦上添花,满足实际需求?

    create-react-app 是 React 官方为我们提供的一个单页应用脚手架,基于 webpack 配置了...

  • react路由

    一、React路由: 实现单页应用的核心技术(单页应用 简称SPA) 路由原理参考资料: 二、React路由实现...

  • 第一章 React 介绍

    本章内容 多页应用开发模式的缺点 单页应用开发模式的优点 单页应用开发模式的主要问题 React 如何解决单页应用...

  • react路由

    一、React路由: 实现单页应用的核心技术(单页应用 简称SPA) 路由原理参考资料: 二、React路由实现有...

  • React路由

    一、React路由: 实现单页应用的核心技术(单页应用 简称SPA) 路由原理参考资料: 二、React路由实现有...

  • react路由

    一、React路由: 实现单页应用的核心技术(单页应用 简称SPA) 路由原理参考资料: 二、React路由实现有...

  • react路由

    一、React路由: 实现单页应用的核心技术(单页应用 简称SPA) 路由原理参考资料: 二、React路由实现有...

网友评论

      本文标题:为React单页应用提供Runtime运行时环境变量

      本文链接:https://www.haomeiwen.com/subject/ygnzvqtx.html