Как я могу остановить компилятор ClojureScript от разрешения определенных `require`? - PullRequest
0 голосов
/ 25 сентября 2019

В моем коде ClojureScript мне требуется модуль JavaScript с именем seedrandom, который находится в папке node_modules, например:

(ns something.core
  (:require ["seedrandom" :as rnd]))
(js/console.log (.quick (rnd "x")))

Согласно документации seedrandom он предназначен для обоихnodejs и браузер, и я ранее включил и успешно использовал его в коде ClojureScript через тег <script>, подтверждая, что он работает в браузере.

Запуск этого файла cljs в lumo в командной строкеработает хорошо и выдает детерминированное случайное число.

Когда я пытаюсь использовать этот же файл cljs в моем проекте внешнего интерфейса Reagent, я вижу следующую ошибку:

Compiling build :app to "public/js/app.js" from ["src" "env/dev/cljs"]...
events.js:183
      throw er; // Unhandled 'error' event
      ^

Error: module not found: "crypto" from file /home/chrism/dev/something/node_modules/seedrandom/seedrandom.js
    at onresolve (/home/chrism/dev/something/node_modules/@cljs-oss/module-deps/index.js:181:30)
...

Внутри seedrandom.js мы видимследующее:

  // When in node.js, try using crypto package for autoseeding.
  try {
    nodecrypto = require('crypto');
  } catch (ex) {}

Очевидно, этот код предназначен для игнорирования встроенного модуля nodejs crypto при работе в браузере.Проблема, насколько я могу судить, заключается в том, что компилятор ClojureScript этого не знает - он видит это require('crypto') и пытается перевести его в фазу компиляции, но не может найти его, потому что он встроен в nodejs.

Есть ли какой-нибудь способ, которым я могу сказать компилятору игнорировать это конкретное требование?Или я могу как-то подкрутить крипто модуль?Какой самый простой способ решить эту проблему?

Примечание. Ранее я сталкивался с такой же проблемой с модулями JavaScript, которые проверяют наличие модуля узла fs.Надеюсь, что мы сможем найти общее решение для использования снова в будущем.Спасибо!

Соответствующие версии: [org.clojure/clojurescript "1.10.520"] и [reagent "0.8.1"].

Этот ответ связан с аналогичным вопросом с точки зрения Google Closure, который использует ClojureScript, но я ищу ответ, который я могу использовать специально с cljs.

...