Могу ли я использовать произвольные модули узлов из 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)
Рекомендации: