Light Table 0.7.2运行" live"用clojurescript浏览器repl。
我只是记录了阻止我使用Light Table的问题的解决方案。我无法找到合适的答案,而且我需要一段时间才能找到解决方法。希望这可以帮助其他遇到类似问题的人。
当编辑不是项目的核心cljs源文件的临时文件时(在project.clj:cljsbuild:builds:source-paths中指定),我在定义命名空间时得到以下内容:
(ns foo)
ReferenceError: goog is not defined
在尝试使用像dommy这样的东西时,我会得到:
(ns foo.bar-2
(:require
[dommy.core :as dc]
[domina.xpath :as dx]))
Error: goog.require could not find: dommy.core
我在此处发现了类似的问题[Clojurescript libraries - goog.require could not find
和https://groups.google.com/forum/#!searchin/light-table-discussion/goog $ 20 / light-table-discussion / D4xjfDnA2Co / 7iaqewIPzGUJ
然而,在第一种情况下,解决方案不起作用。在第二种情况下,我无法理解用户的意思"只是没有在LightTable中实时评估clojurescript命名空间并依赖浏览器/ DOM行为来获得反馈"作为一种解决方法。
我不使用项目主文件的原因是我想在单独的repl中快速完成一次性操作。这是我在emacs下可以做的事情。通常,在emacs下,我将拥有主要的cljs文件,然后是ncider repl。我将两者都放在同一个命名空间中,这样我就可以从任一缓冲区更新共享上下文。
答案 0 :(得分:1)
假设: 我假设您已经知道如何调出Light Table所需的两个服务器:clojure repl和浏览器。
基本上,这个链接: http://grokbase.com/t/gg/clojure/142rsp4rc8/om-trouble-with-goog-reference
给了我解决方案。
看来任何不在项目src目录下的文件完全依赖于浏览器“repl”来查找它需要的任何库。因此,解决方案是在index.html中为要包含在ns中的任何js库添加标记:
<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”将重建它。如果你想要一个干净的开始,请这样做。
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)
- &GT;这似乎是一个不一致的问题。我能够在不向index.html添加cljs / core.js的情况下使另一个项目工作。您基本上可以在这里看到任何暂存缓冲区如何完全依赖于浏览器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)如果你想在你的ns中添加dommy:
(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”repos中),然后将它们添加到你的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立方体演示。也许一旦我对实时浏览器“重复”更加熟悉,这一切都会显而易见,但它确实在一开始就引起了很多困惑。
快乐的编码。