在 React Native 0.72.5 中使用 Hermes 引擎时JavaScript 的 Function.prototype.toString() 转成字符串

React Native 0.72.5 中,使用 Hermes 引擎时,JavaScript 的 Function.prototype.toString() 方法的行为可能与其他 JavaScript 引擎(如 V8 或 JavaScriptCore)有所不同。这种差异源于 Hermes 的设计,旨在提升性能和减少内存开销。

问题描述

在 Hermes 引擎中:

  1. 某些函数(尤其是内置函数或通过优化生成的函数)无法以完整的源码字符串形式返回。
  2. toString() 的输出可能是 [native code] 或空字符串。
const func = () => console.log('Hello, World!');
console.log(func.toString());
// Hermes 可能输出不完整的字符串,或 [native code]

原因

  1. Hermes 的字节码优化
    • Hermes 会对 JavaScript 代码进行优化,可能在编译过程中对函数进行裁剪或变换。
    • 为了减少内存占用,Hermes 不会存储原始的函数源码字符串。
  2. ECMAScript 规范的松散要求
    • 根据 ECMAScript 规范,Function.prototype.toString() 的实现只需返回一个表示该函数的字符串表示,但未严格要求返回实际源码。
  3. React Native 的特性限制
    • React Native 使用 Hermès 时,字节码存储的是预编译后的优化版本,源码信息可能已丢失。

解决方法

1. 避免依赖 toString()

尽量不要依赖 Function.prototype.toString() 来获取函数的源码字符串。这在不同的 JavaScript 引擎中都有兼容性问题。

2. 显式存储函数源码

如果确实需要函数的源码,可以手动将其存储为字符串:

const func = () => console.log('Hello, World!');
const funcSource = func.toString();
console.log(funcSource);

3. 使用 Babel 转译

在构建过程中,使用 Babel 插件对代码进行处理,将函数源码显式注入。例如,babel-plugin-wrap-functions 可以为函数添加额外的字符串属性。

4. 切换到非 Hermès 引擎

如果依赖 Function.prototype.toString() 的功能是项目的关键部分,可以考虑切换回其他 JavaScript 引擎(如 JSC)。修改 android/app/build.gradle 文件中的设置:

project.ext.react = [
    enableHermes: false
]

然后重新构建项目:

cd android && ./gradlew clean && cd ..
npx react-native run-android

5. 调试和开发环境特殊处理

在开发环境中,可以禁用 Hermès,仅在生产环境中启用 Hermès。这可以在调试时保留完整的函数信息。

总结

Hermes 的设计目标是提升性能和减少资源消耗,但这可能会导致一些开发者习惯的功能不可用。如果 Function.prototype.toString() 对于你的项目是不可或缺的功能,建议采用显式存储源码或切换到 JSC。对于绝大多数场景,优化代码以减少对 toString() 的依赖是更好的选择。

发布者:myrgd,转载请注明出处:https://www.object-c.cn/5127

Like (0)
Previous 2024年12月7日 下午7:09
Next 2024年12月8日 上午11:29

相关推荐

  • 小程序支持哪种类型的二维码 / 小程序识别GS1码

    二维码(Quick Response Code,快速响应码)是一种能够存储和传递信息的二维条形码,由黑白矩阵构成,能够在短时间内快速扫描并获取编码信息。二维码广泛应用于支付、商品追溯、信息传递等多个领域。下面是关于二维码的几个方面的详细解析,包括如何理解二维码、如何生成二维码、小程序支持的二维码类型、以及小程序如何识别 GS1 码。 1. 理解二维码 二维码…

    2024年11月23日
    00
  • 微信小程序Map地图使用详细教程,获取小程序定位,绑定地图点击事件

    在微信小程序中,地图功能可以通过 Map 组件来实现,结合定位和点击事件,可以实现丰富的地图交互功能。下面将详细讲解如何使用 Map 组件,包括获取小程序定位、绑定地图点击事件等功能。 1. 在小程序中使用 Map 地图 (1) 引入 Map 组件 在小程序页面的 .wxml 文件中,使用 <map> 组件来嵌入地图。该组件支持显示地图、定位、缩…

    2024年11月23日
    00
  • 使用 VS Code 管理 Git 仓库详细使用指南

    使用 VS Code 管理 Git 仓库,可以通过其直观的图形界面和终端功能完成常见的版本控制操作,如克隆、提交、分支管理等。以下是一个详细的使用指南,帮助你高效地使用 VS Code 和 Git。 1. 环境准备安装必要工具安装 Git:从 Git 官网 下载并安装。安装 VS Code:从 VS Code 官网 下载并安装。安装 Git 插件(可选):在…

    2024年11月30日
    00
  • HTTP POST/GET 接口测试工具是开发和测试

    HTTP POST/GET 接口测试工具是开发和测试网络应用时必不可少的工具,用于验证 HTTP 请求的正确性、响应的状态和数据格式。以下是常用的 HTTP 接口测试工具及其功能介绍。 1. 常用的 HTTP 接口测试工具 1.1 Postman Postman 是目前最流行的 API 测试工具,适用于 RESTful 和 GraphQL 接口的测试。 功能…

    2024年11月25日
    00
  • wordpress 蜘蛛记录插件的功能记录网站的所有访问记录

    要在 WordPress 网站上实现类似的功能,通常你需要开发一个 WordPress 插件。以下是一步步创建一个插件的指南,它可以记录访问者的访问记录,区分搜索引擎蜘蛛,并保存访客的 IP 地址。 1. 创建插件目录和文件 2. 插件文件结构 插件的文件结构大概如下: 3. 编写插件代码 在 visitor-tracker.php 文件中,添加以下代码: …

    2024年11月22日
    00
  • uni-app 一个使用 Vue.js 开发所有前端应用的框架跨端开发的优势

    uni-app 是一个使用 Vue.js 开发所有前端应用的框架,开发者编写一套代码,可发布到 iOS、Android、Web(响应式)、以及各种小程序(微信 / 支付宝 / 百度 / 头条 / QQ / 钉钉)等多个平台,其跨端开发具有以下优势: 开发效率高 跨平台兼容性好 性能优化 生态丰富 学习成本低

    2024年12月22日
    00
  • 理解 HTML、HTML5 和 “H5” 区别的重要性

    HTML & HTML5 & H5 的区别在构建现代网页时,理解 HTML、HTML5 和 “H5” 的区别是非常重要的。以下是它们的概念和主要区别: 1. HTML(超文本标记语言)定义HTML 是 HyperText Markup Language 的缩写,即超文本标记语言,用于定义网页内容的结构和含义。特性提供基…

    2024年12月2日
    00
  • 加速你的开发体验给 Android Studio 配置国内镜像源

    在国内使用 Android Studio 开发时,由于网络限制,许多工具和依赖下载速度较慢,例如 SDK、Gradle 和第三方库等。为了加速开发过程,配置 国内镜像源 是一种有效的解决方案。下面是如何配置 Android Studio 使用国内镜像源加速开发体验的详细步骤。 1. 配置国内 Maven 镜像源 国内的 Maven 镜像源可以加速 Andro…

    2024年11月23日
    00
  • 在 Ant Design ProTable 中,如何设置不分页,依然显示分页信息,前端分页不触发

    在 Ant Design ProTable 中,默认情况下,分页是与数据请求(request)相关联的。也就是说,每当分页切换时,request 会被触发,重新请求新的数据。如果你希望在禁用分页的同时,依然显示分页控件,并且不触发 request 请求,可以通过以下方法进行配置。解决方案要在 Ant Design ProTable 中禁用分页的同时保留分页信…

    2024年11月29日
    00
  • 如何用pbootcmsAPI接口开发微信小程序UNIAPP

    使用 PbootCMS 的 API 接口结合 UniApp 开发微信小程序,可以实现高效的内容管理和展示。以下是一个完整的开发流程,包括 API 接口设置、小程序功能设计和开发细节。 1. 准备工作1.1 配置 PbootCMS API 接口PbootCMS 提供 API 功能,需在后台开启并配置:登录 PbootCMS 后台管理。前往 系统管理 -> AP…

    2024年11月28日
    00
  • 使用 HBuilderX 开发 uni-app 项目通过以下步骤实现微信小程序中获取用户头像、昵称、授权登录以及用户手机号

    在使用 HBuilderX 开发 uni-app 项目时,可以通过以下步骤实现微信小程序中获取用户头像、昵称、授权登录以及用户手机号。 1. 配置微信小程序的权限 在微信小程序后台中,确保已经启用了相关的功能模块,如: 同时在 app.json 中配置授权弹窗的提示: 2. 授权获取用户头像、昵称 从微信小程序 2.10.4 版本开始,推荐使用 wx.get…

    2024年12月11日
    00
  • 2024年最新的 Node.js 安装与环境配置教程

    以下是2024年最新的 Node.js 安装与环境配置教程,适用于 Windows、macOS 和 Linux 系统。 一、什么是 Node.js? Node.js 是一个基于 V8 引擎的 JavaScript 运行环境,主要用于开发服务端应用程序。它的特点是异步事件驱动和非阻塞 I/O,适合高性能应用。 二、Node.js 安装 1. 下载 Node.j…

    2024年11月23日
    00
  • 搭建一个基于 Node.js 和 MySQL 的微信小程序

    搭建一个基于 Node.js 和 MySQL 的微信小程序后台可以帮助你管理数据、处理请求、存储用户信息等。下面是如何从头开始搭建一个基本的微信小程序后台系统的详细步骤。 1. 环境准备 确保你已经安装以下开发工具: 2. 创建 Node.js 项目 首先,创建一个新的 Node.js 项目: 2. 安装必要的依赖包: 使用以下命令安装这些依赖: 配置 My…

    2024年11月24日
    00
  • Android Studio 国内镜像,加速下载和构建过程

    在国内使用 Android Studio 时,由于访问 Google 的官方资源(如 Gradle 和 SDK)速度较慢甚至无法访问,可以通过配置国内镜像源来加速下载和构建过程。以下是详细配置步骤: 1. 配置 Gradle 国内镜像 Gradle 是 Android Studio 构建项目的重要工具,其依赖库通常托管在 Google Maven 和 JCe…

    2024年11月25日
    00
  • 使用uni-app微信小程序生成邀请码邀请好友注册

    在 uni-app 中实现微信小程序的邀请功能,可以通过生成邀请码来邀请好友注册。这个过程通常包括生成唯一的邀请码、分享链接生成二维码,以及接收邀请并使用邀请码完成注册等步骤。下面详细介绍如何在 uni-app 中实现这个功能。 1. 设计邀请码生成规则 首先,需要设计邀请码的生成规则。一般来说,邀请码是一个随机生成的字符串或者是与用户ID相关联的字符串。为…

    2024年11月23日
    00

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

在线咨询: QQ交谈

邮件:723923060@qq.com

关注微信