来由

  纯粹的无聊,一直在搜索JavaScriptCore和SpiderMonkey的一些信息,却无意中学习了如何在ios的UIWebView中判断其js解析引擎的方法:

if (window.devicePixelRatio) { //If WebKit browser
var st = escape(navigator.javaEnabled.toString());
if (st === 'function%20javaEnabled%28%29%20%7B%20%5Bnative%20code%5D%20%7D') {
document.write('V8 detected');
} else {
document.write('JSC detected');
}
} else {
document.write("Not a WebKit browser");
}

  只需上述一串代码,在ios中自然是JavaScriptCore的内核,在安卓下是v8引擎。

  在之前的文章objC与js通信实现--WebViewJavascriptBridge中,讲述了cordova的桥接机制-通过UIWebView的stringbyEvaluateJavascriptString方法通信,但是通过这个借口,虽然我们可以采用内置的jsc引擎执行js代码,但是无法进行更细粒度,深入到javascript运行时来执行代码,最直接的表现就是“无法在oc端对执行的js进行错误控制,如异常处理机制”。通过额外引入或链接javascriptCore,可以在c层次与iOS进行通信,效率提高很大。

对比

  1,在iOS中通过UIWebView组件的stringByEvaluateJavascriptString:(NSString *)方法来调用。但是这种方式有几个弊端:

    1)oc调用js有返回值,属于同步调用;而js调用oc是通过创建iframe并设置src,oc端的UIWebVIew拦截请求,然后再通过stringByEvaluateJavascriptString执行js端的方法,获取js的参数(序列化的json字符串),在oc端进行反序列化,最后调用oc的函数;

    2)oc端的stringByEvaluateJavascriptString在执行js代码时会阻塞js端代码的执行;

    3)通过1)的流程可看出,通过UIWebView实现的bridge机制性能堪忧,交互蛋疼;

    4)通过UIWebView执行js代码段,有几点限制:由于ios并未给予我们通过UIWebView访问javascript运行时的权限,因此即使通过stringByEvaluateJavascriptString执行错误的js代码,我们在oc端仍无法获取错误消息,更无从谈起回调函数;不过,这种方式的好处就是没有涉及到内存管理。

   2,目前有三种方案实现oc与js通信,第一种继续使用cordova的通信机制,也就是目前比较流行的UIWebView;第二种采用React Native的通信机制,使用iOS7内置的javascriptCore引擎并在js,oc两层搭建桥接层,并且每层持有2份相同的配置表,每个表中都记录js,oc透出的API,并结合iOS的事件机制完成oc和js的互调;第三种则仍是采用iOS7内置的javascriptCore框架,不同于React Native的是使用jsc提供的通信机制,这套机制类似于android下WebView编码方式,oc端只需实现JSExpose协议,就将实现该协议的对象透到当前的上下文中,如在UIWebView控件中就为改webview对应的上下文,即使h5页面切换,上下文仍是不变,可以理解为一个单例。

  3, 综上三种方案,第一种代价最低,而且流程比较完善,而且已经系统化,但是性能是硬伤;第二种则是非常好的借鉴,RN的方式不仅仅适用于javascriptCore,而且也适用于其他引擎如SpiderMonkey,但是如果要采用RN的方案可能需要更多时间来搞清楚具体的实现细节和技巧,难度略大;第三种则是比较而言比较无害而且实现难度并不算大的方案,目前尚妆iOS下只适配iOS7以上的设备,因此我们不需要针对iOS6及以下设备做兼容(引入第三方的javascriptCore),而且通过使用内置的js引擎和oc进行通信,在c/c++层面的效率将会大大提高(相比较UIWebview而言),缺点则是可能目前采用的bridge通信方式需要重新来过,架构重新设计。

判断js引擎是javascriptCore或者v8的更多相关文章

  1. 深入浏览器工作原理和JS引擎(V8引擎为例)

    浏览器工作原理和JS引擎 1.浏览器工作原理 在浏览器中输入查找内容,浏览器是怎样将页面加载出来的?以及JavaScript代码在浏览器中是如何被执行的? 大概流程可观察以下图: 首先,用户在浏览器搜 ...

  2. 用NAN简化Google V8 JS引擎的扩展

    通过C++扩展Google V8 JS引擎的文章很多,Google V8 JS带的例子也容易明白.但是大部分文章都是Hello World型的,真正使用时发现处处是坑.扩展V8最经典的例子就是node ...

  3. 在Android上使用Google V8 JS 引擎

    在cantk-runtime中直接使用的webview,通过JAVA扩展接口把Canvas的2d Context的API定向到JNI,通过OpenGL来图形加速,渲染速度大大提高.后来测试发现在大部分 ...

  4. 浏览器内核、排版引擎、js引擎

    [定义] 浏览器最重要或者说核心的部分是“Rendering Engine”,可大概译为“渲染引擎”,不过我们一般习惯将之称为“浏览器内核”.负责对网页语法的解释(如标准通用标记语 言下的一个应用HT ...

  5. atitit..主流 浏览器 js 引擎 内核 市场份额 attialx总结vOa9

    atitit..主流 浏览器 js 引擎  内核 市场份额 attialx总结vOa9 1. 浏览器内核 1 2. 浏览器的主要组件包括: 2 2.1. 主要组件体系结构 2 2.2. WebCore ...

  6. 主流浏览器js 引擎内核市场份额attialx总结vOa9

    原文: http://blog.csdn.net/attilax/article/details/40016... 时间: 2014-10-12 atitit.. 主流浏览器 js 引擎 内核 市场份 ...

  7. JS引擎是如何工作的?从调用堆栈到Promise

    摘要: 理解 JS 引擎运行原理. 作者:前端小智 原文:JS引擎:它们是如何工作的?从调用堆栈到Promise,需要知道的所有内容 Fundebug经授权转载,版权归原作者所有. 为了保证可读性,本 ...

  8. JS 引擎

    最早的 JS 引擎是纯解释器,现代 JS 引擎已经使用 JIT(Just-in-time compilation:结合预编译(ahead-of-time compilation AOT)和解释器的优点 ...

  9. 🤔 移动端 JS 引擎哪家强?美国硅谷找......

    如果你喜欢我写的文章,可以把我的公众号设为星标 ,这样每次有更新就可以及时推送给你啦 在一般的移动端开发场景中,每次更新应用功能都是通过 Native 语言开发并通过应用市场版本分发来实现的.但是市场 ...

随机推荐

  1. 前端极易被误导的css选择器权重计算及css内联样式的妙用技巧

    记得大学时候,专业课的网页设计书籍里面讲过css选择器权重的计算:id是100,class是10,html标签是5等等,然后全部加起来的和进行比较... 我只想说:真是误人子弟,害人不浅! 最近,在前 ...

  2. 【探索】无形验证码 —— PoW 算力验证

    先来思考一个问题:如何写一个能消耗对方时间的程序? 消耗时间还不简单,休眠一下就可以了: Sleep(1000) 这确实消耗了时间,但并没有消耗 CPU.如果对方开了变速齿轮,这瞬间就能完成. 不过要 ...

  3. JavaScript的继承实现方式

    1.使用call或apply方法,将父对象的构造函数绑定在子对象上 function A(){ this.name = 'json'; } function B(){ A.call(this); } ...

  4. 从备考PMP到与项目经理同呼吸

    前言 PMP是什么梗? 项目管理专业人士资格认证.它是由美国项目管理协会(Project Management Institute(PMI)发起的,严格评估项目管理人员知识技能是否具有高品质的资格认证 ...

  5. CRL快速开发框架系列教程三(更新数据)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  6. 终端mysql Operation not permitted错误解决方案

    前言 前段时间装mysql,就遇到了ln: /usr/bin/mysql: Operation not permitted的错误,网上好多方法都过时了,下边是我的解决方法 原因 这是因为苹果在OS X ...

  7. c#比较两个数组的差异

    将DataTable中某一列数据直接转换成数组进行比较,使用的Linq,要引用命名空间using System.Linq; string[] arrRate = dtRate.AsEnumerable ...

  8. ntp

    一: 在一台可以连接外网的服务器A上配置ntp: 配置  /etc/ntp.conf  文件: server 202.120.2.101            # local clock (LCL) ...

  9. java中的移位运算符:<<,>>,>>>总结

    java中有三种移位运算符 <<      :     左移运算符,num << 1,相当于num乘以2 >>      :     右移运算符,num >& ...

  10. 【repost】JS中的异常处理方法分享

    我们在编写js过程中,难免会遇到一些代码错误问题,需要找出来,有些时候怕因为js问题导致用户体验差,这里给出一些解决方法 js容错语句,就是js出错也不提示错误(防止浏览器右下角有个黄色的三角符号,要 ...