在我的 ClojureScript 代码中,我需要一个seedrandom
位于node_modules
文件夹中的 JavaScript 模块,如下所示:
(ns something.core
(:require ["seedrandom" :as rnd]))
(js/console.log (.quick (rnd "x")))
根据seedrandom
文档,它适用于 nodejs 和浏览器,我之前已经通过<script>
标签在 ClojureScript 代码中成功包含并使用了它,确认它在浏览器中工作。
在命令行中运行这个 cljs 文件lumo
效果很好,并输出一个确定性的随机数。
当我尝试在我的 Reagent 前端项目中使用相同的 cljs 文件时,我看到以下错误:
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) {}
显然,这段代码是为了在浏览器中运行时忽略内置的 nodejscrypto
模块。据我所知,问题在于 ClojureScript 编译器不知道这一点 - 它看到require('crypto')
并尝试将其拉入编译阶段,但由于它是内置的 nodejs 而找不到它。
有什么方法可以告诉编译器忽略该特定要求吗?或者我可以以某种方式填充“加密”模块吗?解决这个问题的最干净的方法是什么?
注意:我之前在检查fs
节点模块的 JavaScript 模块中遇到过同样的问题。希望我们能找到一个通用的解决方案,以便将来再次使用。谢谢!
相关版本:[org.clojure/clojurescript "1.10.520"]
和[reagent "0.8.1"]
。
这个答案是相关的,从 ClojureScript 使用的 Google Closure 的角度提出了一个类似的问题,但我正在寻找一个可以专门用于 cljs 的答案。