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

Expo中使用tiny-secp256k1模块遇fs.readFileSync未定义错误求助

解决Expo中tiny-secp256k1的fs.readFileSync未定义错误

tiny-secp256k1默认依赖Node.js的fs模块读取预编译二进制文件,而Expo环境不支持Node.js的fs,所以会触发这个错误。以下是两种可行的解决方法:

方法一:改用纯JS实现的secp256k1库(推荐)

@bitcoinerlab/secp256k1是纯JS实现的secp256k1库,完全适配Expo环境,无需处理fs兼容性问题:

  • 安装依赖:
    npm install @bitcoinerlab/secp256k1 bip32 bip39
    
  • 替换代码中的导入和使用逻辑:
    import * as ecc from '@bitcoinerlab/secp256k1';
    import BIP32 from 'bip32';
    import bip39 from 'bip39';
    
    // 给bip32绑定纯JS的ecc实现
    BIP32.setEcc(ecc);
    
    // 从助记词生成钱包
    const mnemonic = '你的助记词短语';
    const seed = bip39.mnemonicToSeedSync(mnemonic);
    const rootWallet = BIP32.fromSeed(seed);
    

方法二:强行适配tiny-secp256k1(不推荐,复杂度高)

如果一定要用tiny-secp256k1,需要配置Metro加载其纯JS版本,并polyfill必要的Node.js模块:

  1. 安装依赖并生成polyfill文件:
    npm install tiny-secp256k1 bip32 bip39 rn-nodeify
    npx rn-nodeify --install fs,path,process,os --hack
    
  2. 修改metro.config.js,让Metro优先加载tiny-secp256k1的纯JS入口:
    const { getDefaultConfig } = require('expo/metro-config');
    const config = getDefaultConfig(__dirname);
    
    config.resolver.extraNodeModules = {
      ...config.resolver.extraNodeModules,
      'tiny-secp256k1': require.resolve('tiny-secp256k1/ecpair.js'),
    };
    
    module.exports = config;
    
  3. 在App.js的最顶部导入polyfill文件:
    import './shim.js';
    import ecc from 'tiny-secp256k1';
    import BIP32 from 'bip32';
    
    BIP32.setEcc(ecc);
    

错误根源说明

tiny-secp256k1的默认入口会尝试用fs.readFileSync读取预编译的二进制文件以提升性能,但Expo是移动端/浏览器环境,没有Node.js的fs模块权限,因此必须切换到纯JS实现或者通过Metro配置绕过二进制加载逻辑。

内容的提问来源于stack exchange,提问作者Diego Andres Castillo Villalon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 08:01:32