Light Table не может загрузить goog и другие библиотеки javascript

Light Table 0.7.2, работающий в «живом» браузере, отвечает на clojurescript.

Я просто документирую решение проблемы, которая мешала мне использовать 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 - goog.require не смог найти

и здесь https://groups.google.com/forum/#!searchin/light-table-discussion/goog $ 20 / light-table-обсуждение / D4xjfDnA2Co / 7iaqewIPzGUJ

Однако в первом случае решение не сработало. Во втором случае я не смог понять, что имел в виду пользователь, говоря «просто не использовать пространства имен clojurescript в LightTable и полагаться на поведение браузера / DOM для обратной связи» в качестве временного решения.

Причина, по которой я не использую основной файл проекта, заключается в том, что я хочу сделать несколько быстрых разовых работ в отдельном ответе. Это то, что я могу делать в emacs. Обычно под emacs у меня будет основной файл cljs, а затем ncider repl. Я помещу их в одно и то же пространство имен, чтобы можно было обновить общий контекст из любого буфера.


person vt5491    schedule 17.02.2015    source источник


Ответы (1)


Предположения: я полагаю, вы уже знаете, как вызвать два сервера, необходимые для Light Table: clojure repl и браузер.

По сути, это ссылка: http://grokbase.com/t/gg/clojure/142rsp4rc8/om-trouble-with-goog-reference.

подсказал мне решение.

Похоже, что любой файл, который не находится в каталоге проекта src, полностью зависит от браузера "repl" при поиске необходимых ему библиотек. Итак, решение состоит в том, чтобы добавить теги в ваш index.html для любых js-библиотек, которые вы хотите включить в ns:

<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) Убедитесь, что у вас есть какие-либо библиотеки js (кроме goog) в зависимостях вашего project.clj:

 :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) Обновите URL-адрес вашего браузера, например

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. В основном вы можете увидеть здесь, как любой рабочий буфер полностью зависит от того, о чем знает ответ браузера. Основной ответ clojure автоматически знает о любых зависимостях, но мне снова кажется, что нужно добавить его в 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

Вам нужно будет создать файл dommy / core.js в каталоге out. Вам нужно будет извлечь файлы .cljs из dommy jar (в репозитории maven ".m2"), а затем добавить их в каталог src. Затем выполните команду cljsbuild once, чтобы сгенерировать dommy / core.js, затем добавьте ссылку на index.html, как мы это сделали для goog и cljs. Я сделал это, и это сработало. Однако теперь я понимаю, что лучше всего, чтобы ваш царапинный ответ вытащил в "основные" cljs, а затем просто сослаться на артефакты из вашего рабочего файла (или просто сделать все в основном cljs, как я думаю, предыдущий человек был о том, когда он сказал «избегая« живого уничтожения »):

(ns foo-3
(:require [mies2.core]))

mies2.core/abc 7

7) К сожалению, вы не можете поместить рабочий файл в тот же адрес, что и основной.

cljs:

(ns  mies2.core)

#<Error: Namespace "mies2.core" already declared.>
Error: Namespace "mies2.core" already declared.

В любом случае, разобравшись со всем этим, я смог запустить демонстрацию куба three.js. Может быть, все это покажется очевидным, когда я ближе познакомлюсь с «реплингом» в реальном времени, но вначале это определенно вызовет у меня большое замешательство.

Удачного кодирования.

person vt5491    schedule 17.02.2015