【小程序】能让 JS 执行的 JavascriptCore ,到底是什么

Qwen2.5-VL模型微调实战:从零到部署的完整流程(附避坑指南) 本文详细介绍了Qwen2.5-VL视觉语言模型从零开始的完整微调与部署流程。内容涵盖使用LLaMA-Factory进行LoRA微调的关键参数配置与避坑指南,以及如何将训练好的模型权重合并,并最终利用vLLM高性能推理引擎进行部署,为开发者提供了一套可落地的实战方案。 阅读详情

⭐️ 本文首发自 前端修罗场,一个专注 Web 技术、答疑解惑、面试辅导、职业发展的社区。

在这篇文章中我们知道,ISO 版微信小程序逻辑层中的 JavaScript 代码运行在 JavaScriptCore 中,那么 JavascriptCore 到底有什么神奇的地方,能让 JS 在 IOS 中执行呢?

Swift 自 2014 年推出以来,人气飙升,但是 JavaScript 是一种与 Swift 完全相反的语言,比如 Swift 在编译时做了很多保障安全性的措施,而 JavaScript 则是一门弱类型语言,它只在执行时运行。可能它们两个也没想到有一天能够一起协作,制作一个流畅的 iOS 应用程序!
但是,你知道为什么 JS 能在 IOS 中运行吗?本篇文章,我们就来说说能让 JS 在 IOS 运行的 JavascriptCore 框架到底是什么。你将了解到以下知识点:

  • JavaScriptCore 框架的组成。
  • 如何从 iOS/Swift 代码中调用 JavaScript 。
  • 如何从 JavaScript 访问 IOS/Swift 代码。

开始

JavaScriptCore 框架提供对 WebKit 的 JavaScript 引擎的访问。 最初,该框架有一个仅限 Mac 的 C API,但 iOS 7 和 OS X 10.9 附带了一个更好的 Objective-C 包装器。 该框架能够使你的 Swift/Objective-C 和 JavaScript 代码之间具有强大的操作性。

**在底层,JavaScriptCore 由几个关键组件组成:JSVirtualMachine、JSContext 和 JSValue。**那它们是如何组合在一起的呢?往下看。

JSVirtualMachine:JS 虚拟机

JavaScript 代码在由 JSVirtualMachine 类表示的虚拟机中执行。 你通常不必直接与此类交互,但它有一个主要作用:能够支持 JavaScript 并发执行。 由于在单个 JSVirtualMachine 中,不可能同时执行多个线程。 因此,为了支持并行性,必须使用多个虚拟机。
JSVirtualMachine 的每个实例都有自己的堆和垃圾收集器,这意味着你不能在虚拟机之间传递对象。 因为,如果你那样做的话,虚拟机的垃圾收集器会不知道如何处理来自不同堆的值。

JSContext

JSContext 对象代表 JavaScript 代码的执行环境。 它对应于单个全局对象,它如同 Web 开发中的 window 对象。 与虚拟机不同,你可以在上下文之间自由传递对象(假设它们位于同一虚拟机中)。

JSValue

JSValue 是你必须使用的主要数据类型:它可以表示任何可能的 JavaScript 值。JSValue 的实例与它所在的 JSContext 对象相关联,来自上下文对象的任何值都将是 JSValue 类型。
下图显示了上述每个部分之间是如何协同工作的:

image.png

现在你对 JavaScriptCore 框架中已经有了初步的了解。接下来,我们来看看 IOS 代码与 JS 代码之间是如何调用的。

在 IOS 中调用 JS 代码

在 IOS 中要调用 JS,首先要在 swift 文件顶部引入 JavaScriptCore 包:

import JavaScriptCore

接着,你可以在 Swift 代码中创建一个 JSContext 对象,使用这个对象的 evaluateScript 方法,可以执行一段 JS 代码:

let context = JSContext()
JSValue *value = context.evaluateScript(params); // 参数以字符串形式传入

通过 evaluateScript 执行的 JS 代码将会得到一个 JSValue 类型的值。

在 JS 中调用 ISO 代码

这部分应该是前端工程师比较关注的。

默认情况下,Swift/Oc 类的任何方法或属性都不会暴露给 JavaScript。 相反,必须选择要导出的方法和属性。 对于类遵循的每个协议,如果该协议包含 JSExport 协议,JavaScriptCore 会将该协议解释为要导出到 JavaScript 的方法和属性的列表。
那 JSExport 协议是什么呢?

JSExport是JavaScriptCore框架里的一个协议。如果一个协议遵守了JSExport,那么该协议的方法会对JS开放,允许JS直接调用)。JS Export 协议可以将你的 Swift 类及其实例方法、类方法和属性导出到 JavaScript 代码。

实际的原理是,当你在 Swift/Oc 代码中导出需要的属性时,JavascriptCore 框架会在原型上创建一个 Javascript 可访问属性。如果你导出的是一个类的方法时,JavascriptCore 框架则会在构造函数上创建一个 Javascript 函数。

如下代码所示,显示了 JS 调用 OC/Swift 代码的过程:

@protocol MyPointExports <JSExport>
@property double x; // @property 声明的属性决定了 JavaScript 中相应的属性的可读、枚举情况
@property double y;
(MyPoint *)makePointWithX:(double)x y:(double)y;
@end
 
@interface MyPoint : NSObject <MyPointExports>

@end
 
@implementation MyPoint
// ...
@end

在 JS 中可以这样调用上面的 OC/Swift 代码:


// 使用构造函数语法调用 OC 初始化程序
var p = MyPoint(1, 2);
// OC 类方法成为构造函数对象上的函数
var q = MyPoint.makePointWithXY(0, 0);

在实际开发中,JS 与 IOS 工程师需要确定好调用的方法名称(假设为 jsToOc);其次,ISO 工程师需要在 JSContext 中注册 OCJSBridge 对象为 [OCJSBridge new]。此时,OCJSBridge.jsToOc 便是在 JS 需要调用到的。一旦在 JS 调用了,IOS 中的 jsToOc 方法就会响应 JS 的调用请求,并解析随方法携带过来的参数。

**现在关注【前端修罗场】,后台回复【666】,即可获取【免费的优质学习资料】~**

[ROS] rviz 可视化工具 [ROS] rviz 可视化工具 摄像头没讲 文章目录[ROS] rviz 可视化工具1. todo2. todo*. 参考*. 问题解决*. rough 1. todo 2. todo *. 参考 *. 问题解决 *. rough roscore + rviz 阅读详情

相关推荐

冒泡排序的并行计算

本人也是并行计算的小白,在这里记录下自己的学习笔记。 今天做了一下冒泡排序的并行计算比较: 串行冒泡排序如下: #include <stdio.h> #include <stdlib.h> #include <windows.h> void BubbleSort(int * pData, int nSize) { if (!pData) { ...

gaoyi的专栏 4489

[WebKit] JavaScriptCore解析--基础篇(四) 页面解析与JavaScript元素的执行

很多地方都已经介绍了JavaScript在浏览器是如何被执行的,这里介绍一下WebKit是如何实现的。主要涉及JS的async,defer及普通脚本的解析与执行过程的代码实现。 1. 概要说明 先概要说明一下浏览器如何执行JavaScript的。 首先浏览器的页面解析器(Document Parser)遇到就会发起下载(脚本内容在页面内的就不用下载了)。然后针对不同情况执行的方式有所不

求索 1万+

【黑马点评】项目知识点及面经整理

【黑马点评】项目知识点及面经整理

m0_52031708的博客 6602

JavaScriptCore基本概念和基本使用(Swift)

JavaScriptCore简介      iOS 7中加入了JavaScriptCore框架,该框架让Objective-C和JavaScript代码直接交互变得更加简单方便。JavaScriptCore是Cocoa API,用于建立JavaScript与 Swift or Objective- C的桥梁。该框架允许我们在基于Swift or Objective- C的

欢迎来到Jack的程序世界 6337

自学PCB思路 | PCB设计零基础入门-小白适用(附详细入门经验分享)

本人大一在实践课上就听说PCB,被虎的一楞一楞的,不过现在回看,发现其实并没有相信的那么难!想着把自己这一路摸索的学习路线分享一下,当时我是一边摸索一边上手,一把鼻涕一把泪的过来的。如果你想搞硬件或者需要搞硬件,下面是我的入门学习过程,希望可以帮到你。目录前言选择一款设计软件好的入门课程掌握抄板元件采购焊板子烙铁头热风枪自己半设计明确设计需求全设计最后我并非什么大佬,也没法自己去教大家如何画板。

自动化小秋葵的博客 1万+

第3.4章 机器人第三方库实战总结(四):G2O优化库从入门到实战(附SLAM实例代码)

自定义边同样是满足复杂应用需求的重要手段。自定义边时,需要明确边所连接的顶点类型以及边所表示的误差项的计算方式。假设我们要定义一条边,用于约束两个上述自定义顶点之间的相对位姿和传感器偏移量关系。我们可以这样定义边类:public:// 计算误差// 计算雅可比矩阵// 读盘和存盘函数,这里暂不实现。

行知SLAM 357

WebKit(四)JavaScriptCore

JavaScriptCore是WebKit项目中的JavaScript引擎,采用多级JIT编译器(Baseline/DFG/FTL)和标记-清除垃圾回收机制。其架构包含解析器、字节码生成器、解释器等组件,支持嵌入式场景开发,提供C/C++ API用于原生代码交互。相比V8和SpiderMonkey,JavaScriptCore在iOS/macOS平台集成更便利,但社区生态相对较小。该引擎通过LLVM后端实现高性能优化,适合数值计算等场景,同时支持增量式GC减少停顿。

onlymscn的博客 1262

2. 第一个 SAP CDS View 源代码的详细解析:CDS View 和底层自动生成 SQL View 的关系讲解

笔者前一篇教程文章,带着大家在 ABAP 系统创建了一个最简单的基于sflight数据库表的 CDS View:本文对这简单的 14 行源代码背后的知识点进行详细讲解。CDS 全称是 Core Data Services,它是一种数据建模技术,帮助开发者以更直观和高层的方式去描述数据库中所需的数据结构。在一个典型的 SAP ABAP 开发场景里,CDS 经常被用来编写各种用于报表、接口或业务逻辑的数据视图。通常,这些视图包含一系列注解。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1021

​《WebKit 技术内幕》学习之九(3): JavaScript引擎

当然JavaScriptCore在不停地演进的过程中,目前的实现跟之前的实现差别非常大,所以这里介绍的是基于目前的结构的,在未来,可能还会有很多其他的变化,让我们拭目以待。第三,JavaScriptCore引擎在获悉热点函数后,需要对它们进行优化,就会使用到简单(Baseline)JIT编译器,该编译器根据信息收集器1中的信息,将对应函数的字节码翻译成本地代码,不仅因为时间问题,而且并不是所有代码都合适做深层次的优化,所以这里没有做特别多的优化,而是直接做转换。第五,要是你认为这样就足够了,那就更错了。

jyl_sh的专栏 1585

SAP MM ME21N保存前检查增强

想在ME21N保存前做一些数据检查, 可以做一个增强功能,  运行 CMOD 新增,   增强接口 输入 MM06E005  (  EXIT_SAPMM06E_012 ) ,在 NCLUDE ZXM06U43 .  里写代码功能。  例子如下: *&---------------------------------------------------------------------*

heng0757的专栏 1万+

YOLOv8改进策略【Neck】| BiFPN:双向特征金字塔网络-跨尺度连接和加权特征融合

可扩展的高效物体检测BiFPN(加权双向特征金字塔网络)

Limiiiing的博客 1080

[WebKit] JavaScriptCore解析--高级篇(一) SSA (static single assignment)

在编译器优化领域,数据结构的选择会直接影响程序优化的有效性。SSA是一种编译器使用的中间语言(intermediate language), 作为编译优化的基础(也是DFG JIT的基础),它和Control Dependence Graph一起被用来表示程序的数据流和控制流。 大家都知道编译器是这样工作的:解析、优化,最后生成代码。中间会使用到一个中间语言的进行过度,好的中间语言一定要

求索 6161

哨兵1号后向散射系数土壤水分反演

打开之前预处理之后的VH和VV极化的后向散射系数转存的tiff文件。

所有专家都曾始于新手 3291

JavaScript引擎,V8引擎的原理

小程序的渲染层和逻辑层分别由2个线程管理:渲染层的界面使用了WebView 进行渲染;一个小程序存在多个界面,所以渲染层存在多个WebView线程,这两个线程的通信会经由微信客户端(下文中也会采用Native来代指微信客户端)做中转,逻辑层发送网络请求也经由Native转发,小程序的通信模型下图所示。小程序的运行环境分成渲染层和逻辑层,其中 WXML 模板和 WXSS 样式工作在渲染层,JS 脚本工作在逻辑层。我们所编写的js无论h是交给浏览器或者node执行,最后都是需要被CPU执行的。

m0_60376759的博客 668

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

小程序的运行环境

在 iOS、iPadOS 和 Mac OS 上,小程序逻辑层的 JavaScript 代码运行在 JavaScriptCore 中,视图层是由 WKWebView 来渲染的,环境有 iOS 14、iPad OS 14、Mac OS 11.4 等;此外,小程序基础库内置了必要的Polyfill,来弥补 API 的差异(详情)。在 Android 上,小程序逻辑层的 JavaScript 代码运行在 V8 中,视图层是由基于 Mobile Chromium 内核的微信自研 XWeb 引擎来渲染的;

天涯海角觅知音 3837

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

什么是微信小程序基础库

由于公司需要开发小程序项目,就查看了小程序的官方文档 很多地方看到 有关基础库的东西在开发工具中的配置项中也看到了 于是就在想 这个基础库 就是微信客户端的版本? 官方文档有一个 小程序的运行环境,基础库就是对这个环境的支持吗? 那小程序是个啥呢 既不是原生App也不是传统浏览器的WEB应用,看起来像是在微信中虚拟出的一个APP。 基础库是什么? 基础库是小程序运行的必要环境,我们的开发主要就是面向基础库开发的。基础库封装了微信和手机的能力并提供给小程序使用,我们使用基础库提供的组件和API开发起来非常的

pengboran的博客 4113

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

小程序的运行时

微信小程序运行在三端:iOS(iPhone/iPad)、Android 和 用于调试的开发者工具。 三端的脚本执行环境以及用于渲染非原生组件的环境是各不相同的: 在 iOS 上,小程序逻辑层的 javascript 代码运行在 JavaScriptCore 中,视图层是由 WKWebView 来渲染的,环境有 iOS8、iOS9、iOS10; 在 Android 上, 旧版本,小程序逻辑层的 ja...

dearMengJJ的博客 1311

小程序底层原理

小程序的 Http Rquest 请求是不是用的浏览器 Fetch API? 不是, http request是由逻辑层发起,通过native去触发的,且不支持promise。 小程序渲染再同一个线程么? 小程序是双线程设计,即视图渲染与业务逻辑分别在运行在不同的线程中。这个设计主要是解决web技术中的一个痛点: web页面开发渲染线程和脚本线程是互斥的,长时间的脚本运行可能会导致页面失去响应或者白屏,体验糟糕。 小程序为了更好体验,将页面的渲染线程和脚本线程分开设计在不同线程中执行,具体实现: ● 视图v

分享前端开发工程师的一些日常生活、前端知识点、职业发展、对一些问题的看法、感悟等等 2520

微信小程序基础库的介绍与更改

1、基础库是小程序运行的必要环境,我们的开发主要就是面向基础库开发的。基础库封装了微信和手机的能力并提供给小程序使用,我们使用基础库提供的组件和API开发起来非常的方便。2、基础库存在于我们的微信客户端中,它和微信一样,也有其自己的版本,每个版本都会有一些新特性。微信官方为了使得基础库的版本和微信的版本同步,采取了一个微信版本对应一个基础库版本的方式。这就使得用户在更新最新版本的微信时也能更新至最新版本的基础库。带来的优点就是用户的基础库都是最新版本的。

UserGuan的博客 6135

JavaScript在百度小程序中的高级应用(99%开发者忽略的底层原理)

掌握JavaScript在百度小程序开发中的底层原理,解决性能瓶颈与内存泄漏问题。详解事件循环、模块化加载与运行时优化策略,提升应用响应速度。适用于复杂交互场景,显著增强用户体验,值得收藏。

InstrFun的博客 448

android小程序内核,小程序的运行环境:iOS(iPhone/iPad)、Android

微信小程序运行在三端:iOS(iPhone/iPad)、Android 和 用于调试的开发者工具。三端的脚本执行环境以及用于渲染非原生组件的环境是各不相同的:在 iOS 上,小程序逻辑层的 javascript 代码运行在 JavaScriptCore 中,视图层是由 WKWebView来渲染的,环境有 iOS8、iOS9、iOS10;在 Android 上,旧版本,小程序逻辑层的 javascr...

weixin_39604092的博客 1178

TensorFlow.js 微信小程序插件开始支持 WebAssembly

我们知道,微信小程序由一个描述整体程序的 app 和多个描述各自页面的 page 组成。小程序主体部分由 app.js、app.json、app.wxss三个文件组成,页面 page 则...

云水木石 3390

微信小程序开发demo

前言 链接: https://pan.baidu.com/s/16j8WCMv2JrRK2OzwvMwZ1w 提取码: 34mp 我们之前对小程序做了基本学习: 1. 微信小程序开发07-列表页面怎么做 2. 微信小程序开发06-一个业务页面的完成 3. 微信小程序开发...

ciconghu4844的博客 1152

学习微信小程序开发框架之了解JavaScript

此贴为学习9 小时搞定微信小程序开发 的笔记 推荐书籍: 《JavaScript高级程序设计》 《JavaScript权威指南》 JavaScript是一种轻量的、解释型的、面向对象的头等函数语言,是一种动态的基于原型和多范式的脚本语言,支持面向对象、命令式和函数式的编程风格。 轻量是在入门Javascript时觉得这门语言没有其他语言那么重;解释型是语言在运行时,机器...

sriting的博客 1万+

微信小程序JavaScript

浏览器中JavaScript DOM:浏览器文档对象模型 BOM:浏览器对象模型 nodejs中的javascript实现 ECMAScript, Native, Npm 组成 Native:原生的模块,来使用一些原生JavaScript不具有的一些能力 npm 包管理工具,世界上最大的开源库生态系统,可以听过npm扩展包来快速的实现一些功能 nodejs:基于谷歌的v8引擎实现的JavaSc...

大脸猫~ 9401

如何给APP开发属于自己的小程序

前言   工欲善其事,必先利其器。   首先,我们需要知道微信小程序是什么?微信小程序内核是什么?微信小程序的开发语言什么?这样才能更好的开发微信小程序,以及解决遇到的问题。 一、微信小程序是什么 微信小程序是一个依托于微信,微信提供一个接口运行浏览器内核上的一个程序。   微信小程序是一个小程序可以有很多页面,每个页面承载不同的功能,页面之间可以互相跳转。小程序分为渲染层和逻辑层,渲染层中包含了多个 WebView,每个 WebView 对应到我们的小程序里就是一个页面 Page,每一个页面都独

sinat_28371057的博客 6714
上一篇: 【Web3 开发系列教程—创建你的第一个智能合约(4)】与智能合约交互
下一篇: 考官:请详细介绍一下 CSS 中的网格布局,学完又能上 80 分了
蟹蟹蟹风流
蟹蟹蟹风流 优质创作者: 编程框架技术领域 优质创作者: 编程框架技术领域 领域专家: 前端开发技术领域 领域专家: 前端开发技术领域
博客等级 码龄11年 3万+粉丝 396原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蟹蟹蟹风流

期望和你分享一杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值