0

我似乎不知道 REPL 的一些重要方面,使用figwheelor lein-autoreload

如果我使用上述插件之一启动 REPL 并对其中一个项目文件进行更改,我通常会收到编译器警告。通常,这意味着我必须重新启动 REPL,这违背了这些插件的全部目的。

让我给你举个例子。我有三个文件core.cljsdemoscene.cljsobjects.cljs. 它们按照我提到它们的顺序相互引用,例如(:require [ns.demoscene :as demoscene])。我的主要功能位于core.cljs.
我开始使用 figwheel REPL lein figwheel,启动我的浏览器,一切正常。
如果我在其中编辑函数objects.cljs并保存更改,则会收到编译器警告:

Compile Warning src/cljs/ns/demoscene.cljs
update already refers to: cljs.core/update being replaced by: ns.demoscene/update

这在不止一个层面上真的很奇怪:

  1. 我没有编辑demoscene.cljs
  2. 为什么要cljs.core/update换成ns.demoscene/update
  3. 如果我重新加载站点(我不重新启动 figwheel 会话),一切都会再次正常。我的更改已应用等。

你能告诉我,后台发生了什么吗?我缺少什么来理解这种情况?我该怎么做才能避免这些警告?

如果您需要更多资源,请告诉我。

4

2 回答 2

4

我没有编辑demoscene.cljs

我认为这可能会被重新加载,因为您编辑的文件需要它:core.cljs.

为什么要cljs.core/update换成ns.demoscene/update

每当您定义与命名空间函数同名的函数时,您都会看到此警告core,因为这些core函数默认情况下始终在您的命名空间中可用。update警告告诉您在该命名空间中的任何调用都不会cljs.core/update;它将是update您在命名空间中定义的函数。您可以在命名空间中明确排除任何core要“遮盖”的功能,例如(:refer-clojure :exclude [update])

于 2017-10-19T14:29:43.467 回答
3

Taylor 是正确的,但我想补充一点,在实践中,我发现隐藏核心功能是个坏主意。当您执行以下操作时,它往往会导致相当多的时间浪费:

  1. 做了这个
  2. 忘记了你这样做(可能是一个小时后,可能是几个月,甚至可能不是你)
  3. 尝试在文件的另一部分使用核心功能
于 2017-10-19T15:11:08.370 回答