You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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:
  1. 安装插件:
npm install rollup-plugin-polyfill-node --save-dev
  1. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 11:15:40