使用 react-native-quick-crypto 的项目遇到 “global.base64ToArrayBuffer is not a function” 问题

我们有个项目里面用 react-native-quick-crypto 代替 crypto-js 来进行 AES 加解密以及 pbkdf2 运算。最开始是仅仅做 pbkdf2 运算,用于将客户密码生成一个 encryption key,以此来加密读写数据库。运行良好没有报错,效率提升显著,原来的 crypto-js 需要二三十秒的时间,现在一两秒就完成了。

后来又添加了进行 AES 加解密的功能,结果涉及 base64转码就报错了。报错信息如下:

TypeError: global.base64ToArrayBuffer is not a function (it is undefined)

当时在用 AI 编程,gemini 帮我在 index.js 中引入各种 polyfill 均没有解决。后来自己研究了一下,想明白了,这个 base64ToArrayBuffer 函数在我们代码中并没有直接使用,是 react-native-quick-crypto 间接使用的,而其依赖的该函数应该是在 react-native-quick-base64 包中。

查找 package-lock.json,却发现 react-native-quick-base64 已经安装了。正在无计可施之际,进一步在网上搜索答案,找到了这个 issue,里面有人提到他通过安装 react-native-quick-base64 解决。于是抱着试试看的态度,运行:

npm install react-native-quick-base64

问题果然得到解决。由于不是很了解背后机制,又质问了一下 gemini,这回这货好像反应过来了,给了我如下的解释:

这是一个非常好的问题,也是 React Native 和 Node.js 生态系统中一个常见的、令人困惑的现象。

  您观察得非常准确:react-native-quick-base64 确实是 react-native-quick-crypto 的一个传递性依赖 (transitive dependency),这意味着当您安装 react-native-quick-crypto 时,npm 或 yarn 也会自动安装 react-native-quick-base64 到 node_modules 文件夹中,并且 package-lock.json 会记录下来。

  为什么直接安装它就解决了问题?

  这通常是由于以下一个或多个原因造成的:

   1. 模块解析顺序和全局 Polyfill 的时机:
       * react-native-quick-base64 库很可能在被导入时,会执行一些全局的 polyfill 操作(例如,它可能提供了 global.atob 或 global.base64ToArrayBuffer)。
       * 当它只是一个传递性依赖时,打包工具(如 Metro)在解析模块时,可能不会保证 react-native-quick-base64 的初始化代码在 react-native-quick-crypto 尝试使用它之前运行。
       * 当您将其作为直接依赖安装时,它在 node_modules 中的位置(通常是顶层)以及打包工具的处理方式可能会发生变化,从而确保它的 polyfill 代码在更早、更可靠的时机被执行,使得 global.base64ToArrayBuffer 在 react-native-quick-crypto 需要它时已经可用。

   2. 原生模块的链接问题 (如果它有原生部分):
       * 虽然 react-native-quick-base64 听起来像是一个纯 JavaScript 库,但如果它内部包含任何原生代码(即使是很小的部分),那么当它只是一个传递性依赖时,原生构建系统(如 iOS 的 CocoaPods 或 Android 的 Gradle)可能不会正确地发现并链接它。
       * 当您将其添加到 package.json 作为直接依赖时,它会被明确地包含在原生构建过程中,确保所有必要的原生组件都被正确链接。

   3. 打包工具的优化行为:
       * 打包工具(如 Metro)会进行各种优化,例如“hoisting”(提升)依赖项。有时,这些优化可能会导致某些模块的初始化顺序或作用域出现意想不到的问题。直接声明为依赖可以避免这些不确定性。

  总结

  这并不是 react-native-quick-crypto 官方文档的疏漏,而更像是JavaScript 模块系统、打包工具和原生模块链接之间复杂交互的一个副作用。

  最佳实践:
  既然您已经发现直接安装 react-native-quick-base64 解决了问题,那么请务必将其保留在 `package.json` 中作为直接依赖。这能确保您的项目在未来构建时,这个关键的 polyfill 能够稳定可靠地被加载。

补充版本信息:

react-native 0.79.6
react-native-quick-crypto 0.7.17

MacOS 下 Gemini Cli 无法通过浏览器授权的解决办法

最近在用 Claude Code 的同时,也在用 Gemini Cli 做一些事。今天换回刚返修回来的 MacBook Pro,在机器里面安装了 Gemini Cli 之后,发现使用 Chrome 浏览器登录会卡在点击完同意授权按钮之后,页面没有刷新,而命令行过一会儿后则报错,报错如下:

Failed to login. Message: request to https://oauth2.googleapis.com/token failed, reason: connect ETIMEDOUT xx.xxx.xxx.xx:443

一开始以为是缓存等问题,清理删除了 ~/.gemini目录,重新安装了 Gemini Cli,但还是不行。后来想到也许是网络问题,因为最近是在国内,所以是在必要的时候用了科学上网的,也许配置不到位。后来一番查找资料,果然通过网络设置解决了。

我是用 Clash,配了一个自己搭的 https 转发服务。平时只是用系统代理,没有带开 TUN 模式。当打开 TUN 模式之后,授权就可以了。

应邀出席校长怀旧联谊会感怀

架桥中学校庆发起人刘双林聚集当时小学校长(各村校的负责人)叙谈旧情诚邀余参加(当时余为车堰小学校长)

难忘别梦三十秋,

如烟往事萦心头。

吾辈历尽教书苦,

新秀哪知育人忧。

教育业绩均在目,

同仁洪福早退休。

今日刘郎邀盛会,

汝曹欢乐余独羞。

备注:1,师愧于生;2,业绩平平

苦读

孙敬头悬梁,苏秦锥刺股,

匡胤囊萤学,孙康映雪读。

四人虽家贫,有志自勤苦,

终亦成大业,美名传千古。

关于日本评选 2022 年度汉字和中日关系

闲着和微信群里的朋友聊天,讲到二战的历史,聊起二战时期的日本和现在的日本,有一些感想。

起因其实是日本评出了2022年的年度汉字为“战”。根据 Yahoo 新闻报道,评选理由是乌克兰战争和北朝鲜发射导弹等等因素。

日本 2022 年度汉字为“战”
继续阅读“关于日本评选 2022 年度汉字和中日关系”

在日本生活是怎样的体验

这是个很大的话题,在日本过什么样的生活每个人差异挺大的。

如果不想融入当地,你基本可以完全过中式生活都没有问题。如果想融入当地,则学日语还是很有必要,日本人英语并不真很差,但口语不太行,很多人读书时候都学过英语,但开口比较困难。

房价方面,比国内低。生活方面成本比北京上海略高一丢丢,但因为品质总体不错,个人认为性价比挺高的。城乡差异不大,基础建设的水准还不错,虽然很多都是几十年了,但维护保养还不错。所以哪怕生活在比较偏远的小地方,生活质量和大城市也差异不大。

继续阅读“在日本生活是怎样的体验”

移民移居的项目选择指南

假设我们基于种种的理由,已经想清楚了希望去一个外国居住地生活,或者希望有一个外国居住地作为人生备用方案 Plan B。那么移民移居的项目如何选择就是本文要讨论的重点。

什么是外国身份

先普及一下几个概念:临时/短期逗留权、短期居留权、长期居留权、国籍。

临时/短期逗留权一般指以游客或者商务会议等身份短期访问,短则十来天,长一点的几个月,这种其实不是移民。而且这种签证签发的时候,一般不允许我们有移民倾向,换句话说你确实是短期去一趟,没打算赖着不走。

下面的三种都是移民相关的,我们可以统称为在外国的“身份”。

  1. 短期居留权一般是指获得某个国家签发的工作或者投资或者其他签证(姑且理解为带时效的居住证),可以合法居留,但签证只包含一定时间譬如一年或者两年、三年,到期后要申请续签的,除非后续申请到了长期居留权。
  2. 长期居留权通常为十年以上,甚至为永久居留权,简称永居(日本称永驻)或者绿卡(但不一定是绿颜色哦)。这种福利待遇一般就跟公民无异,唯一缺少的就是没有投票的政治权利。当然永居在少数情况下也存在被剥夺的可能,而国籍多数情况下没这种顾虑。永居并不是成为这个国家公民,所以从国籍上来说你还是原来的国籍。
  3. 国籍则是指成为一个国家的公民,享受作为该国公民的权利,也要承担相应的义务。有的国家允许多重国籍如加拿大、澳大利亚等多数英联邦国家,有的国家默认多重国籍如美国,有的国家不承认多重国籍如日本、新加坡、德国、中国,这些国家往往在你入籍的时候需要提供放弃原有国籍的证明并剪掉你的原有护照。在实践中,也有人虽然为某个不承认多重国籍的国家的公民,但事实上后取得并拥有其他国家国籍的情况,这方面是有一些护照使用方面的小技巧的。
继续阅读“移民移居的项目选择指南”

润前心理建设 – 知道你很忙

如果您觉得移民移居和自己完全没关系,而且虽然听到种种说法,但自己完全没有想法。如果您觉得待在自己所在的国家一切都很好,实在没什么必要考虑移民移居到其他地方…

那么,请关闭这篇文章,下文和您毫无关系。

对于觉得移民移居似乎有必要,但是自己下不了决心,不确定自己是不是要行动的朋友,来,咱们捋一捋思路!

继续阅读“润前心理建设 – 知道你很忙”