为 Single Page App 提供运行时环境变量
最近攻克了一个之前部署 single-page-app 的一个痛点:支持在运行时环境变量。这里讲述一下问题以及目前的解决方案。 SPA 没有运行时环境变量的痛点目前我的绝大部分的项目都是一个前后端分离的方式开发的。其中前端基本都是用 目前
说白了,其实不同时期的环境变量的作用是不一样的。两者不可能做到相互替代,在 全局配置 + Docker 化部署前端没有 首先,我们需要一段 shell 脚本,把环境变量翻译成 #!/bin/bash if [[ $CONFIG_VARS ]]; then SPLIT=$(echo $CONFIG_VARS | tr "," "n") ARGS= for VAR in ${SPLIT}; do ARGS="${ARGS} -v ${VAR} " done JSON=`json_env --json $ARGS` echo " ==> Writing ${CONFIG_FILE_PATH}/config.js with ${JSON}" echo "window.__env = ${JSON}" > ${CONFIG_FILE_PATH}/config.js fi exec "$@" 如果我们提供这样的环境变量 export REACT_APP_API_PREFIX=http://petstore-backend.example.com export CONFIG_VARS=REACT_APP_API_PREFIX 那么所生成的 window.__env = { 'REACT_APP_API_PREFIX': 'http://petstore-backend.example.com' } 然后,我们需要在 原来的 <!doctype html> <html lang="en"> <head> ... </head> <body> <noscript> You need to enable JavaScript to run this app. </noscript> <div id="root"></div> <script type="text/javascript" src="config.js"></script> </body> </html> 这样,我们就拥有了一个 axios.defaults.adapter = httpAdapter; let baseUrl; let env = window.__env || {}; // 1 if (process.env.NODE_ENV === 'test') { baseUrl = 'http://example.com'; } else if (process.env.NODE_ENV === 'development') { baseUrl = env.REACT_APP_API_PREFIX || 'http://localhost:8080'; // 2 } else { baseUrl = env.REACT_APP_API_PREFIX; } const fetcher = axios.create({ baseURL: baseUrl,headers: { 'Content-Type': 'application/json' } });
当然,这种依赖 shell 生成 FROM socialengine/nginx-spa COPY build/ /app 其中 $ yarn run build $ docker build -t spa-app . $ docker run -e CONFIG_VARS=REACT_APP_API_PREFIX -e REACT_APP_API_PREFIX=http://petstore-backend.example.com -p 3000:80 spa-app 当然,我们本地开发环境不用这么麻烦。只需要在 这里 是一个样例项目。 相关资料
更多内容请见 aisensiy.github.io (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |