Clojure ^在命名空间中共享

Clojure ^shared in namespace

我正在关注 pedestal tutorial,我注意到代码中的 ^shared 注释,如下所示:

(ns ^:shared tutorial-client.behavior
    (:require [clojure.string :as string]
              [io.pedestal.app.messages :as msg]))

它有什么用?

它表示代码应该编译为 clojure,以便在服务器端使用,也应该编译为 clojurescript,以便在浏览器中使用。

来自pedestal wiki

When compilation occurs, any Clojure namespaces marked :shared will also be compiled to ClojureScript.

(ns ^:shared tutorial-client.behavior
    (:require [clojure.string :as string]
              [io.pedestal.app.messages :as msg]))

For now, these files must contain the common subset of Clojure and ClojureScript. A new feature of Clojure 1.6, feature expressions, will allow us to break free from this restriction.

^shared 注释用于指示 ClojureScript 编译器编译此 .clj 文件,它通常会忽略它。这使您可以在客户端和服务器上编写 运行 的共享代码(只要它不使用特定于平台的代码)。这是在 cljx 和 cljc 文件之前,AFAIK 特定于 Pedestal 构建过程,而不是 vanilla ClojureScript 的一部分。

支持的编写平台特定代码的方法是使用 Reader 条件语句,这是 Clojure 1.7 中的新功能。

附带说明一下,Pedestal App 实际上已弃用,Pedestal Server 仍在维护中。