Могу ли я использовать произвольные модули узлов из clojurescript?

Можно ли использовать произвольные модули node.js в проекте clojurescript? Если да, то как мне их включить? Если нет, то почему нет?

3 ответа

Решение

Да, можете, в этом нет ничего особенного

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

Будьте осторожны с экстерьерами, если вы не используете оптимизацию.

Редактировать: Играет ли leiningen с различными менеджерами пакетов JS?:
Нету. Поскольку у языка нет пакетов, он не может знать. Вы должны сделать JS управления зависимостями и lein deps тоже. Существует lein-npm и lein-bower, чтобы помочь с интеграцией этих двух менеджеров пакетов.

Да, с конца 2017 года. С shadow-cljs или Lumo теперь нет проблем с импортом модулей npm в код ClojureScript.

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

Подробнее читайте в этом разделе: Руководство по использованию / импорту модулей / пакетов npm в ClojureScript?

Начиная с ClojureScript 1.9.854, появилась лучшая поддержка для объявления модулей npm в качестве зависимостей и их требования из ваших пространств имен.

Чтобы объявить его зависимым, вам необходимо использовать :npm-deps опция компилятора (вместе с :install-deps один, если вы хотите lein/bootчтобы автоматически установить его).

:npm-deps карта от ключевого слова к строке, где ключевое слово - это имя зависимости, которую вы использовали бы для установки, используя npm и строка является версией зависимости.

Пример того, что вы могли бы добавить в свой project.clj (если вы используете lein-cljsbuild), для использования левой панели:

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

Рекомендации:

Другие вопросы по тегам