Light Table无法加载' goog'和其他JavaScript库

时间:2015-02-17 09:26:52

标签: clojure google-closure-compiler clojurescript lighttable

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。我将两者都放在同一个命名空间中,这样我就可以从任一缓冲区更新共享上下文。

1 个答案:

答案 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立方体演示。也许一旦我对实时浏览器“重复”更加熟悉,这一切都会显而易见,但它确实在一开始就引起了很多困惑。

快乐的编码。