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) 时收到编译器警告。

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

...