Clojurescript解耦文件&;名称空间?

Clojurescript解耦文件&;名称空间?,clojurescript,reagent,Clojurescript,Reagent,我正在使用试剂构建几个备用根组件,其中只有一个将安装在任何给定页面上;绝对不是。它们在组成上有一定程度的共同性,因此将它们之间的共同点移动到common名称空间是很方便的 理想的情况是,在这些组件的文件中,我可以选择将名称空间切换到common,并将defs特定添加到组件,然后切换回,从而避免循环依赖,也不需要任何继承 我回忆起这在common lisp中是可能的,它是多么美妙,而且看起来也是如此 从Clojurescript文档:ns,以及ns中的 我想知道是否有一种方法可以在clojures

我正在使用试剂构建几个备用根组件,其中只有一个将安装在任何给定页面上;绝对不是。它们在组成上有一定程度的共同性,因此将它们之间的共同点移动到
common
名称空间是很方便的

理想的情况是,在这些组件的文件中,我可以选择将名称空间切换到
common
,并将
defs
特定添加到组件,然后切换回,从而避免循环依赖,也不需要任何继承

我回忆起这在common lisp中是可能的,它是多么美妙,而且看起来也是如此

从Clojurescript文档:
ns
,以及ns中的

我想知道是否有一种方法可以在clojurescript中实现这种事情,但我仍然没有找到

如果没有,我可能需要重新考虑我在多个备用根组件后面的假设;“一次构建中多个构建”的想法,如果这有意义的话

经过进一步的实验和困惑后更新: 另一种选择可能是跨多个文件拆分单个命名空间()。不知道在这里转向哪个方向

事实上,在试剂中,我在全局名称空间中使用原子,如果我在公共名称空间中使用单独的名称空间,那么就需要循环依赖关系。因此,想知道一个全局名称空间,在这种情况下,多个文件可能会有所帮助。或者前进的方向是一个巨大的文件和一个名称空间


更新:我意识到在全局保持所有应用程序状态(在我目前的情况下,是多个原子)和传递应用程序状态之间存在巨大的紧张关系。我目前的模式是全球模式,不要到处传播。将必要的状态作为参数传递给
common
名称空间中的fns可以解决这里的问题(duh!),但接下来的问题是,关于应用程序状态,这里遵循什么原则。如果我只是在需要的时候添加一个参数,但一开始就认为一切都是全局的,那么它就没有真正的原则了……

在ClojureScript中,所有内容都预编译成一个静态JavaScript“可执行文件”,所以没有什么比Clojure中使用的repl更好的了。事实上,在CLJS中,“Var”概念实际上并不在编译器之后,它们只是静态(常量)变量,无法恢复

话虽如此,CLJS确实通过
绑定
表单模拟Clojure动态变量的行为,因此可以帮助您实现目标。与在CLJ中一样,它创建了一个(线程局部)全局变量。这是CLJS中的退化情况,因为只有一个线程。但是,源代码看起来与CLJ案例相同

实现这一点的另一种方法是只使用普通的
atom
作为全局变量,这样就不必传递参数

与往常一样,当使用全局变量时,它会减少函数调用树中的参数数量,但会在代码的不同部分之间创建不可见的依赖关系。有时很方便,但通常是一个糟糕的权衡