shadow-cljs多环境多base domin配置(closure-defines篇)


用shadow-cljs编译代码时使用环境变量实现多编译环境

简书地址

原方案

前端有个config.cljs文件,定义了一个domain的函数,指定api接口的base-url,本地开发、测试、生产分别修改成不同地址。类似这样吧:

(ns <>.config)

;; 测试环境
#_(def domain "https://test.url.com")

;; 生产环境
#_(def domain "https://prod.url.com")

;;开发环境
(def domain "http://localhost:3000")

很显然,这个不是长久之计,又不智能,部署时还要修改地址,容易忘记,并且还有时会把修改提交上去。尤其是没有持续集成工具帮助做部署工作的时候。~

当前方案

shadow-cljs用户指南我没有通读,但是从目录看也有环境变量章节看,也有方案。

采用closure-defines的方案,指定多个build id,在不同的build中传入环境变量。

(ns <>.config)

;;此处的变量需要修改的请在项目跟目录的shadow-cljs.edn中修改
(goog-define domain "http://localhost:3000")

shadow-cljs.edn配置大概这样

:builds
{:app
  {:target :browser
   :output-dir "target/cljsbuild/public/dev/js"
   :asset-path "/js"
   :modules {:app {:entries [YOUR-APP.app]}}
   :devtools
   {:watch-dir "resources/public"
    :ignore-warnings true
    :preloads [re-frisk.preload]}
   :closure-defines {"re_frame.trace.trace_enabled_QMARK_" true}
   :dev  {:closure-defines {<>.config/domain "http://localhost:3000"}}}

  :test-app
  {:target :browser
   :output-dir "target/cljsbuild/public/test/js"
   :asset-path "/js"
   :modules {:app {:entries [YOUR-APP.app]}}
   :release {:closure-defines {<>.config/domain "https://test.url.com"}}}

  :prod-app
  {:target :browser
   :output-dir "target/cljsbuild/public/prod/js"
   :asset-path "/js"
   :modules {:app {:entries [YOUR-APP.app]}}
   :release {:closure-defines {<>.config/domain "https://prod.url.com"}}}}

好处

  • 可以定义多个变量,比如从多个api地址
  • 可以配置无限多个

不好处

  • 如果有新增地址,需要修改多个builds的配置
  • 地址明文可见,想做部署层的保密的话,不可以。

其他方案

还是在这篇文章里,后面提到了别的方案。当前来说上面的不利之处还不是个问题,用到时再调整其他方案。


评论
  目录