请在2024年Clojure状态调查!中分享您的想法。

欢迎!有关如何操作的信息,请参阅关于页面。

0
ClojureScript

我在一个项目中设置了从我的Clojure服务器上提供ClojureScript,并想尽可能将所有内容放在一个存储库中。服务器工作正常,返回了包括reagent文件在内的静态资源。但是,当处理 app.js 时,我得到了以下控制台输出

core.cljs?rel=1589815066414:6  undefined
core.cljs?rel=1589815066414:8  Uncaught TypeError: Cannot read property 'call' of undefined
    at core.cljs?rel=1589815066414:8
(anonymous) @ core.cljs?rel=1589815066414:8

在我看来,我的代码看起来就像它应该那样。

这是我的 core.cljs 文件

(ns ws-poc.core
  (:require
   [reagent.core :as reagent]))
(.log js/console reagent) ;; <== reagent is undefined, see first line of log

(reagent/render-component
 [:h1 Works!]
 (. js/document (getElementById "app")))

这是我的 index.html 文件

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!-- <link href="css/style.css" rel="stylesheet" type="text/css"> -->
  </head>
  <body>
    <div id="app">
      <h2>Works!</h2>
    </div>
    <script src="js/compiled/app.js" type="text/javascript"></script>
  </body>
</html>

这是我的项目结构

.
├── project.clj
├── resources
│   └── public
│       ├── css
│       ├── index.html
│       └── js
│           └── compiled
│               ├── app.js
│               └── out
│                   ├── cljs
│                   ├── cljs_deps.js
│                   ├── cljsc_opts.edn
│                   ├── cljsjs
│                   ├── clojure
│                   ├── figwheel
│                   ├── goog
│                   ├── process
│                   ├── reagent
│                   └── ws_poc
├── src
    └── ws_poc
        ├── core.cljs
        └── server
           └── core.clj

最后是我的 project.clj 文件

(defproject ws-poc "0.1.0-SNAPSHOT"
      :description "FIXME: write description"
      :url "http://example.com/FIXME"
      :license {:name "Eclipse Public License"
                :url "http://www.eclipse.org/legal/epl-v10.html"}
      :dependencies [[org.clojure/clojure "1.8.0"]
                     [org.clojure/clojurescript "1.10.764"]
                     [environ "1.2.0"]
                     [reagent "1.0.0-alpha1"]]

      :plugins [[lein-figwheel "0.5.19"]
                [lein-cljsbuild "1.1.8"]
                [lein-environ "1.2.0"]]

      :source-paths ["src"]

      :clean-targets ^{:protect false} ["resources/public/js/compiled" "target"]

      :main ^:skip-aot ws-poc.server.core

      ; :target-path "target/%s"
      :profiles {:dev {:env {:dev? "true"}
                       :cljsbuild {:builds
                                   [{:id "dev"
                                     :source-paths ["src"]
                                     :figwheel {}
                                     :compiler {:main ws-poc.core
                                                :asset-path "js/compiled/out"
                                                :output-to "resources/public/js/compiled/app.js"
                                                :output-dir "resources/public/js/compiled/out"
                                                :source-map-timestamp true}}]}}}

      :figwheel {:css-dirs ["resources/public/css"]})

2 个答案

0
 
最佳答案

我决定不在同一个代码库中使用clj和cljs。我尝试了不同的配置,其中有一个我可以使reagent工作,但是我服务器运行时出现了问题。这工作量太大,与我能从中获得的小价值不相符。

0
(ns ws-poc.core
  (:require
   [reagent.core :as reagent]))

:as 仅创建一个命名空间别名。因此访问 reagent 是无效的。该别名允许您编写“更短”的 reagent/render 而不是完全限定的 reagent.core/render

您应该在调用 (.log js/console reagent) 时收到编译器警告。

这与您的配置无关,只是错误地将命名空间别名用作变量。

...