假设有一个我想使用的 API,它在 Node.js 中可用,但不适用于 clojure ring。有没有办法可以在 clojure ring 中使用它?
2 回答
如果你想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" {:output-dir "out" :output-to "out/main.js" :optimizations :none :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!")))
如果您需要进一步解释,我鼓励您看一下在 ClojureScript 中使用 JS 模块的一般情况、增强的 Node.js 模块支持、一篇关于集成 Node 模块的文章,以及一篇从以前的文章中摘录的简明文章.
使用与您的程序在技术上或管理上不兼容的库的一种通用技术是让它作为单独的程序运行(在您的 Clojure 应用程序之外)并以某种方式调用它。
如果它与程序流程的耦合不是太紧密,则可以使用Runtime.exec代替函数调用。还有clojure.java.sh/sh。
通过更多的努力,您可以将库打包为 Web 服务,以避免每次调用的启动成本(并获得将其放在单独的机器上的灵活性)。