【问题标题】:How to use node.js libraries and APIs with clojure ring?如何在 clojure ring 中使用 node.js 库和 API?
【发布时间】:2020-02-06 13:13:37
【问题描述】:

假设有一个我想使用的 API,它在 Node.js 中可用,但不适用于 clojure ring。有没有办法可以在 clojure ring 中使用它?

【问题讨论】:

  • 嗨,您找到解决方案了吗?

标签: node.js clojure clojure-ring


【解决方案1】:

如果你想直接使用npm 模块,最好的办法是使用ClojureScript。 ClojureScript 是一个将 Clojure 代码编译为 JavaScript 的 Clojure 库。 它提供与 Node.js 的无缝集成。 不用说,您需要同时安装 Node.js 和 NPM 才能安装依赖项。

根据您是使用deps.cljs 文件来配置您的ClojureScript 项目,还是使用build.clj 文件,您需要通过以下方式之一添加npm 依赖项:

  1. 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!"))
  1. 如果使用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 generalEnhanced Node.js Modules Support、一篇关于 integrating Node modules 的文章以及一篇类似于 excerpt from previous posts 的简明文章。

【讨论】:

    【解决方案2】:

    使用与您的程序在技术上或管理上不兼容的库的一种通用技术是让它作为单独的程序运行(在您的 Clojure 应用程序之外)并以某种方式调用它。

    如果它与您的程序流程的耦合不太紧密,您可以使用Runtime.exec 代替函数调用。还有clojure.java.sh/sh

    通过更多努力,您可以将库打包为 Web 服务,以避免每次调用的启动成本(并获得将其放在单独的机器上的灵活性)。

    【讨论】:

      猜你喜欢
      • 2014-04-17
      • 1970-01-01
      • 2012-12-24
      • 1970-01-01
      • 1970-01-01
      • 2017-03-01
      • 2013-04-29
      • 1970-01-01
      • 2018-04-02
      相关资源
      最近更新 更多