【问题标题】:Can I use arbitrary node modules from clojurescript?我可以使用 clojurescript 中的任意节点模块吗?
【发布时间】:2014-06-06 23:36:18
【问题描述】:

是否可以在 clojurescript 项目中使用任意 node.js 模块?如果是,我该如何包括它们?如果不是,为什么不呢?

【问题讨论】:

    标签: clojurescript


    【解决方案1】:

    是的,你可以,没有什么特别的:

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

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

    编辑:leiningen 是否使用各种 js 包管理器?:
    没有。由于该语言没有包,它无法知道。您还必须进行 js 依赖管理和 lein deps。有一个 lein-npm 和一个 lein-bower 来帮助集成这两个包管理器。

    【讨论】:

    • 不。由于该语言没有包,它无法知道。您还必须进行 js 依赖管理和 lein deps。有一个 lein-npm 和一个 lein-bower 来帮助集成这两个包管理器。
    • 是否有可能需要一个节点模块(即“fs”)进入 cljs 命名空间,以便您可以直接访问它的方法?在这种情况下,我们希望能够说 (readdirSync js/__dirname)?
    【解决方案2】:

    从 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)
    

    参考资料:

    【讨论】:

      【解决方案3】:

      是的,从 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?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-02-12
        • 2015-01-27
        • 2016-11-20
        • 1970-01-01
        • 2014-06-14
        • 2021-05-01
        • 1970-01-01
        • 2021-09-06
        相关资源
        最近更新 更多