使用rollup.js打包Obsidian插件时遇crypto.getRandomValues()不支持错误
解决Rollup打包Obsidian插件导入Inrupt Solid库时的
crypto.getRandomValues()不支持问题 我正在开发一款用Rollup打包的Obsidian插件,需要导入Inrupt Solid库,但导入后触发如下错误:
Error: crypto.getRandomValues() not supported. See uuidjs/uuid相关文档中getrandomvalues-not-supported说明 at rng (/Users/candide/work/sekund/solid-build-issues/main_rollup.js:16740:10) at v4 (/Users/candide/work/sekund/solid-build-issues/main_rollup.js:17186:53) at new Session (/Users/candide/work/sekund/solid-build-issues/main_rollup.js:23526:88) at Repro.<anonymous> (/Users/candide/work/sekund/solid-build-issues/main_rollup.js:23669:17) at step (/Users/candide/work/sekund/solid-build-issues/main_rollup.js:160:15) at Object.next (/Users/candide/work/sekund/solid-build-issues/main_rollup.js:111:11) at /Users/candide/work/sekund/solid-build-issues/main_rollup.js:83:65 at new Promise (<anonymous>) at __awaiter (/Users/candide/work/sekund/solid-build-issues/main_rollup.js:65:9) at Repro.login (/Users/candide/work/sekund/solid-build-issues/main_rollup.js:23664:10)
调试时发现crypto常量未定义,但打包文件开头明明有:
var crypto_1 = require("crypto");
推测问题根源是Rollup错误重定义了全局变量。用tsc编译同一源码可生成正常运行的程序,当前Rollup配置如下:
import commonjs from "@rollup/plugin-commonjs"; import json from "@rollup/plugin-json"; import { nodeResolve } from "@rollup/plugin-node-resolve"; import typescript from "@rollup/plugin-typescript"; const banner = `/* THIS IS A GENERATED/BUNDLED FILE BY ROLLUP if you want to view the source visit the plugins github repository */ `; export default { input: "src/main.ts", inlineDynamicImports: true, output: [ { file: "main.js", sourcemap: "inline", format: "cjs", exports: "default", banner, }, ], external: ["obsidian", "fs", "os", "path"], plugins: [json(), nodeResolve({ preferBuiltins: true }), commonjs(), typescript({ sourceMap: true })], };
解决方案
- 方案一:将
crypto设为外部依赖
修改Rollup配置中的external数组,把crypto加入其中,让插件直接使用环境中的crypto模块,不进行打包:
external: ["obsidian", "fs", "os", "path", "crypto"],
- 方案二:添加Node.js polyfill
如果环境中没有全局crypto支持,可通过rollup-plugin-polyfill-node提供polyfill:
- 安装插件:
npm install rollup-plugin-polyfill-node --save-dev
- 修改Rollup配置,将polyfill插件放在最前面:
import nodePolyfills from "rollup-plugin-polyfill-node"; export default { // ...其他配置 plugins: [nodePolyfills(), json(), nodeResolve({ preferBuiltins: true }), commonjs(), typescript({ sourceMap: true })], };
- 方案三:检查Solid库的导入入口
确认使用的Solid库版本是否适配Node.js/Electron环境,避免它默认调用浏览器端的crypto.getRandomValues()接口。
内容的提问来源于stack exchange,提问作者ckemmler
相关产品推荐
相关产品推荐

