我能否在ClojureScript中使用任意的Node.js模块?

11

在ClojureScript项目中是否可以使用任意的Node.js模块?如果可以,我该如何包含它们?如果不行,为什么?

3个回答

10
可以,这没有什么特别的要求:

可以,这没有什么特殊的要求:

(def fs (js/require "fs"))
(println (.readdirSync fs js/__dirname))

如果您不使用优化功能,请小心处理外部变量。

编辑:Leiningen是否与各种JavaScript软件包管理器兼容?
不兼容。由于该语言没有软件包,它无法知道。您需要进行js依赖项管理以及lein deps。有一个lein-npm和一个lein-bower可帮助集成这两个软件包管理器。


不行。由于该语言没有包,它无法知道。您需要进行js依赖管理和lein deps。有一个lein-npm和一个lein-bower来帮助集成这两个包管理器。 - Joaquin
是否可以将一个 Node 模块(例如 "fs")引入到 cljs 命名空间中,以便您可以直接访问其方法?在这种情况下,我们希望能够说 (readdirSync js/__dirname) - George

3

是的,自2017年末以来,使用shadow-cljs或Lumo,将npm模块导入到ClojureScript代码中已经不再是问题了。

(ns app.main
  (:require ["dayjs"   :as dayjs]
            ["shortid" :as shortid]
            ["lodash"  :as lodash]
            ["lodash"  :refer [isString]]))

请阅读此主题了解详情:如何在ClojureScript中使用/导入npm模块/包的指南?


1
自从ClojureScript 1.9.854版本以来,更好地支持声明npm模块作为依赖项,并从您的命名空间中引用它们。
要将其声明为依赖项,您需要使用:npm-deps编译器选项(连同:install-deps选项一起使用,如果您想让 lein / boot 自动安装它)。 :npm-deps是从关键字到字符串的映射,其中关键字是您将使用 npm 安装它的依赖项名称,字符串是依赖项的版本。
例如,如果您使用lein-cljsbuild,则可以向project.clj添加以下内容,以使用left-pad:
:cljsbuild {:builds [{:id "prod"
                    :source-paths ["src"]
                    :compiler {:main left-pad-demo.core
                               :output-to "package/index.js"
                               :target :nodejs
                               :output-dir "target"
                               :optimizations :simple
                               :install-deps true
                               :npm-deps {:left-pad "1.2.0"}
                               :pretty-print true}}]})

然后,从你的命名空间中,你可以像这样要求它:

(ns left-pad-demo.core
  (:require left-pad))

或者这样:
(ns left-pad-demo.core
  (:require ["left-pad" :as lp]))

一个完整的工作命名空间可能如下所示:

(ns left-pad-demo.core
  (:require left-pad))

(defn -main [s length]
  (console.log (left-pad s length)))

(set! *main-cli-fn* -main)

参考资料:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接