1

在我的 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 的答案。

4

0 回答 0