【发布时间】:2020-02-06 13:13:37
【问题描述】:
假设有一个我想使用的 API,它在 Node.js 中可用,但不适用于 clojure ring。有没有办法可以在 clojure ring 中使用它?
【问题讨论】:
-
嗨,您找到解决方案了吗?
标签: node.js clojure clojure-ring
假设有一个我想使用的 API,它在 Node.js 中可用,但不适用于 clojure ring。有没有办法可以在 clojure ring 中使用它?
【问题讨论】:
标签: node.js clojure clojure-ring
如果你想直接使用npm 模块,最好的办法是使用ClojureScript。
ClojureScript 是一个将 Clojure 代码编译为 JavaScript 的 Clojure 库。
它提供与 Node.js 的无缝集成。
不用说,您需要同时安装 Node.js 和 NPM 才能安装依赖项。
根据您是使用deps.cljs 文件来配置您的ClojureScript 项目,还是使用build.clj 文件,您需要通过以下方式之一添加npm 依赖项:
deps.cljs
您需要在依赖映射中添加另一个键:
{
;;..
:npm-deps {"react" "15.4.2"
"object-assign" "4.1.1"}
;; ...
}
那么你应该可以使用例如像这样的依赖react:
(ns example.core
(:require [react :refer [createElement]]))
(js/console.log (createElement "div" nil "Hello World!"))
如果使用build.clj 文件,那么您的文件将如下所示:
(需要'[cljs.build.api :as b])
(b/build "src" {:输出目录“out” :输出到“out/main.js” :优化:无 :main 'example.core :install-deps true :npm-deps {:react "15.6.1" :react-dom "15.6.1"}})
而你使用依赖的方式也是一样的:
(ns example.core
(:require [react :refer [createElement]]
["react-dom/server" :as ReactDOMServer :refer [renderToString]]))
(js/console.log (renderToString (createElement "div" nil "Hello World!")))
如果您需要进一步解释,我鼓励您查看 using JS modules in ClojureScript in general、Enhanced Node.js Modules Support、一篇关于 integrating Node modules 的文章以及一篇类似于 excerpt from previous posts 的简明文章。
【讨论】:
使用与您的程序在技术上或管理上不兼容的库的一种通用技术是让它作为单独的程序运行(在您的 Clojure 应用程序之外)并以某种方式调用它。
如果它与您的程序流程的耦合不太紧密,您可以使用Runtime.exec 代替函数调用。还有clojure.java.sh/sh。
通过更多努力,您可以将库打包为 Web 服务,以避免每次调用的启动成本(并获得将其放在单独的机器上的灵活性)。
【讨论】: