【发布时间】:2014-06-06 23:36:18
【问题描述】:
是否可以在 clojurescript 项目中使用任意 node.js 模块?如果是,我该如何包括它们?如果不是,为什么不呢?
【问题讨论】:
标签: clojurescript
是否可以在 clojurescript 项目中使用任意 node.js 模块?如果是,我该如何包括它们?如果不是,为什么不呢?
【问题讨论】:
标签: clojurescript
是的,你可以,没有什么特别的:
(def fs (js/require "fs"))
(println (.readdirSync fs js/__dirname))
如果您不使用优化,请小心使用外部变量。
编辑:leiningen 是否使用各种 js 包管理器?:
没有。由于该语言没有包,它无法知道。您还必须进行 js 依赖管理和 lein deps。有一个 lein-npm 和一个 lein-bower 来帮助集成这两个包管理器。
【讨论】:
(readdirSync js/__dirname)?
从 ClojureScript 1.9.854 开始,更好地支持将 npm 模块声明为依赖项并从命名空间中要求它们。
为了将其声明为依赖项,您需要使用:npm-deps 编译器选项(与:install-deps 一起,如果您希望lein/boot 自动安装它)。
:npm-deps 是从关键字到字符串的映射,其中关键字是使用npm 安装它的依赖项的名称,字符串是依赖项的版本。
您可以添加到project.clj 的示例(如果您使用lein-cljsbuild),以便使用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)
参考资料:
【讨论】:
是的,从 2017 年底开始。现在有了 shadow-cljs 或 Lumo,在 ClojureScript 代码中导入 npm 模块不再是问题。
(ns app.main
(:require ["dayjs" :as dayjs]
["shortid" :as shortid]
["lodash" :as lodash]
["lodash" :refer [isString]]))
阅读本主题了解详情:Guide on how to use/import npm modules/packages in ClojureScript?
【讨论】: