我的common.cljc文件如下所示:
(ns example.common
#?(:cljs
(:require [goog.dom :as gdom])
)
)
#?(:cljs (enable-console-print!))
(defn mobile? []
#?(:cljs (def hvpsize (.. (gdom/getViewportSize) -height)))
#?(:cljs (def wvpsize (.. (gdom/getViewportSize) -width)))
#?(:cljs (if (<= (/ wvpsize hvpsize) 1) true false))
)
(def mobile-value (mobile?))
(println "mobile-value inside .cljc")
(println mobile-value)
我的routes.clj文件如下所示:
(ns example.routes
(:gen-class)
(:use compojure.core
example.views
example.common
[hiccup.middleware :only (wrap-base-url)])
)
(use '[ring.util.response :only [response]])
(use '[ring.adapter.jetty :only [run-jetty]])
(require '[compojure.route :as route])
(defn -main
"I don't do a whole lot ... yet."
[& args]
(println "Hello, World!"))
(defn d-or-m-version []
(.println System/out "Inside d-or-m-version")
(.println System/out mobile-value)
(if mobile-value (root-page-mobile) (root-page-desktop))
)
(defroutes main-routes
(GET "/" [] (d-or-m-version))
(route/not-found "404"))
(defonce server (run-jetty #'main-routes {:port 8080 :join? false}))
mobile-value
在重新加载.cljc文件中的页面时,甚至在我单独的.cljs文件中正确评估。
问题是在routes.clj中评估mobile-value
时它只返回null。因此d-or-v-version
中的if语句不会从单独的views.clj文件中调用正确的hiccup html。
我假设mobile-value
返回null,因为routes.clj在common.cljc之前运行,而mobile-value
没有值。但是,我不知道如何解决这个问题,任何帮助将不胜感激。
答案 0 :(得分:4)
从Clojure调用时,它评估为nil
,因为它在Clojure中是一个空函数。 #?(:cljs
reader条件告诉Clojure编译器忽略这个表单,因为它应该仅由Clojurescript编译器进行评估。
由于Clojure编译器中不存在该函数中的所有表单,因此该函数为空,并且它将始终求值为nil
。