我有一个不打算成为单页应用程序的项目,我试图找出在不同脚本输出之间共享代码以实现常用功能的最佳方法。
例如,我可能有一个stores.js目标,以及分别从cljs / stores和cljs / items构建的items.js目标,但两者都有一些重叠的功能(比如带有可编辑单元格的表)。
到目前为止,我提出的解决方案要么将公共文件符号链接到实现该功能的两个目录中,我发现这在美学上令人不悦,但实际上应该可以正常工作,或者提取常用功能进入一个单独的包,使项目依赖它。然而,这要么要求开发人员设置两个存储库并在本地安装依赖关系,要么设置maven服务器。
2012年的This答案似乎表明我应该简单地取消多个目标,而是在正确的页面上初始化我想要的功能,但在我看来,整个网站的功能都在一个文件会使得生成的javascript比它需要的大得多,增加页面加载时间,特别是考虑到我将有超过2页。
有更好的方法吗?
答案 0 :(得分:0)
好的,事实证明解决方案非常简单,实际上应该从cljsbuild文档中清楚,但我没有看到它。尝试回复@phtrivier,让我真正看到我错过了什么。
解决方案是在project.clj文件中使用多个源路径。所以一个简单的例子就是这样:
{:builds [{:source-paths ["src/cljs/items"
"src/cljs/shared"]
:compiler {:output-to "resources/public/js/items.js"
:optimizations :simple
:pretty-print true}
:jar true}
{:source-paths ["src/cljs/stores"
"src/cljs/shared"]
:compiler {:output-to "resources/public/js/stores.js"
:optimizations :simple
:pretty-print true}}]}
从那里它很简单:
src/cljs/shared/shared.cljs
(ns shared)
(defn common []
"Hello World")
src/cljs/items/items.cljs
(ns items
(:require [shared :refer [common]]))
(.log js/console (common))
src/cljs/stores/stores.cljs
(ns stores
(:require [shared :refer [common]]))
(js/alert (common))
items.js
和stores.js
将是他们自己的单独文件,包含共享代码。