【问题标题】:Clojurescript decoupled file & namespace?Clojurescript 解耦文件和命名空间?
【发布时间】:2020-09-19 18:07:10
【问题描述】:

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

理想的情况是,如果在每个组件的文件中,我可以选择将命名空间切换到common,并将defs 特别添加到组件,然后切换回来,从而避免循环依赖,也不需要任何一种继承。

我记得这在 common lisp 中是可能的,那是多么美妙,而且似乎也是 possible in clojure。

来自 Clojurescript 文档:ns must be the first form and can only be used once 和 in-ns is only usable from the repl。

我想知道是否有办法在 clojurescript 中实现这种事情,但我仍然无法理解。

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

经过进一步的实验和混淆后更新: 另一种选择可能是将单个命名空间拆分为多个文件 (is this possible?)。不知道在这里转什么方向。

如果我使用单独的公共命名空间,我在试剂中使用全局命名空间中的原子这一事实会产生循环依赖的需求。因此,想知道一个全局命名空间,在这种情况下,多个文件可能会有所帮助。还是一个巨大的文件和一个命名空间的前进方向??

更新:我意识到在全局保持所有应用程序状态(在我目前的情况下是多个原子)和传递应用程序状态之间存在很大的矛盾。我目前的模式是全球性的,不要传递任何东西。 将必要的状态作为参数传递到 common 命名空间中的 fns 将解决这里的问题(呃!),但接下来的问题是,这里遵循了哪些关于应用程序状态的原则。如果我只是在需要时添加一个参数,但一开始就认为一切都是全局的,那么它就没有真正的原则......

【问题讨论】:

    标签: clojurescript reagent


    【解决方案1】:

    在 ClojureScript 中,所有内容都被预编译为单个静态 JavaScript“可执行文件”,因此与您在 Clojure 中习惯的 repl 完全不同。事实上,在 CLJS 中,“Var”的概念并不真正在编译器之后,它们只是静态(常量)变量,不能反弹。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多