React Native TS项目安装bcrypt后node_modules模块解析报错
问题成因
该报错本质是依赖选型与运行环境不匹配,和安装操作是否正确没有关系:
bcrypt是面向Node.js服务端环境设计的原生加密模块,安装时会拉取依赖@mapbox/node-pre-gyp完成原生二进制文件的预编译,这个依赖包内自带了nw-pre-gyp相关的.html静态资源文件。- React Native的打包工具默认没有配置处理.html后缀文件的loader,会尝试将所有引入的文件按JS/TS脚本解析,碰到文件开头的
<!doctype html>标签就会直接抛出模块解析失败的错误,这也和你观察到的「移除bcrypt后重装依赖项目恢复正常、重装bcrypt必现错误」的现象完全吻合。 - 就算手动给打包配置加了html-loader跳过这个解析错误,bcrypt依赖的Node.js原生绑定能力也无法在React Native的JS运行环境(Hermes/JavaScriptCore)中运行,后续依然会抛出原生模块找不到的运行时错误,完全无法正常使用。
解决方案
不要尝试通过修改打包配置适配服务端原生bcrypt包,直接替换为跨环境兼容的纯JS实现即可:
- 第一步:彻底卸载不兼容的bcrypt依赖,执行命令:
npm uninstall bcrypt - 第二步:安装兼容React Native环境的纯JS版bcrypt实现
bcryptjs,TS项目同步安装对应的类型定义包:npm install bcryptjs npm install -D @types/bcryptjs - 第三步:全局替换代码中的导入路径,将原有
import bcrypt from 'bcrypt'修改为import bcrypt from 'bcryptjs'即可,bcrypt.hash、bcrypt.compare等核心API和原生bcrypt完全对齐,不需要修改原有业务逻辑。
内容的提问来源于stack exchange,提问作者Gabriel Donada
相关产品推荐
相关产品推荐

