假设:我假设您已经知道如何启动 Light Table 所需的两个服务器:clojure repl 和浏览器。
基本上,这个链接:
http: //grokbase.com/t/gg/clojure/142rsp4rc8/om-trouble-with-goog-reference
提示我解决方案。
似乎任何不在项目 src 目录下的文件都完全依赖于浏览器“repl”来查找它需要的任何库。所以解决方案是为你想要包含在 ns 中的任何 js 库添加标签到你的 index.html:
<html>
<head>
<script type='text/javascript' id='lt_ws' src='http://localhost:54792/socket.io/lighttable/ws.js'></script>
<script src="out/goog/base.js" type="text/javascript"></script> <!-- add this -->
</head>
<body>
hello from mies-test
<script src="out/mies_test.js" type="text/javascript"></script>
</body>
</html>
然后,您必须执行以下操作:
1)确保您的 project.clj 依赖项下有任何 js 库(“goog”除外):
:dependencies [[org.clojure/clojure "1.6.0"]
[org.clojure/clojurescript "0.0-2755"]
[domina "1.0.3"]
[prismatic/dommy "1.0.0"]
[enfocus "2.1.1"]
2) 运行“lein cljsbuild 一次”。您需要确保您的输出目录下有 goog/base.js 和 cljs/core.js:
@HP_LAPTOP_ENVY /c/vtstuff/clojure_stuff/projects/mies2/out
$ ls *
cljs_deps.js mies_test.js
cljs:
core.cljs core.cljs.cache.edn core.js core.js.map
clojure:
browser
goog:
array base.js disposable functions iter log mochikit promise structs uri
asserts debug dom html json math net reflect testing useragent
async deps.js events i18n labs messaging object string timer
mies2:
core.cljs core.cljs.cache.edn core.js core.js.map
如果您执行“lein clean”,它将删除“out”目录。然后执行“lein cljsbuild once”将重建它。如果您想要一个干净的开始,请执行此操作。
3)刷新您的浏览器网址,例如
file:///C:/vtstuff/clojure_stuff/projects/mies2/index.html
4)现在当我跑(ns foo)时,我得到了:
Error: goog.require could not find: cljs.core
at Error (<anonymous>)
at Object.goog.require (file:///C:/vtstuff/clojure_stuff/projects/mies2/out/goog/base.js:470:13)
-> 这似乎是一个不一致的问题。我能够在不将 cljs/core.js 添加到 index.html 的情况下让另一个项目工作。您基本上可以在这里看到任何暂存缓冲区如何完全取决于浏览器 repl 所知道的内容。主 clojure repl 会自动识别任何依赖项,但在这里我似乎需要将其添加到 index.html:
<head>
<script type='text/javascript' id='lt_ws' src='http://localhost:61756/socket.io/lighttable/ws.js'></script>
<script src="out/goog/base.js" type="text/javascript"></script>
<script src="out/cljs/core.js" type="text/javascript"></script> <!-- add this -->
</head>
5) 再次刷新浏览器,现在在 scratch.cljs 中的评估工作:
(+ 1 1 ) 2
(ns foo) nil
(namespace ::x) "foo"
6)如果您想将dommy添加到您的ns:
(ns foo-2
(:require [dommy.core :as dommy]))
#<Error: goog.require could not find: dommy.core>
Error: goog.require could not find: dommy.core
您将在“out”目录下创建 dommy/core.js。您必须从 dommy jar 中提取 .cljs 文件(在您的 maven“.m2”存储库中),然后将它们添加到您的 src 目录中。然后执行“cljsbuild once”以生成 dommy/core.js,然后添加对 index.html 的引用,就像我们为 'goog' 和 'cljs' 所做的那样。我这样做了,它奏效了。但是,我现在意识到最好让您的暂存 repl 拉入“主”cljs,然后从暂存文件中引用工件(或者只是在主 cljs 中执行所有操作,我认为之前的人是谈论当他说“避免'实时评估'”时):
(ns foo-3
(:require [mies2.core]))
mies2.core/abc 7
7)不幸的是,您不能将临时文件放入与主文件相同的ns中
cljs:
(ns mies2.core)
#<Error: Namespace "mies2.core" already declared.>
Error: Namespace "mies2.core" already declared.
无论如何,在弄清楚这一切之后,我能够运行一个 three.js 立方体演示。也许一旦我对实时浏览器“repling”有了更多的熟悉,这一切都会变得很明显,但它在一开始肯定会给我带来很多困惑。
快乐编码。