6月阅读周·WebKit技术内幕 | 插件和JavaScript扩展
背景
去年下半年,我在微信书架里加入了许多技术书籍,各种类别的都有,断断续续的读了一部分。
没有计划的阅读,收效甚微。
新年伊始,我准备尝试一下其他方式,比如阅读周。每月抽出1~2个非连续周,完整阅读一本书籍。
这个“玩法”虽然常见且板正,但是有效,已经坚持阅读五个月。
已读完书籍:《架构简洁之道》、《深入浅出的Node.js》、《你不知道的JavaScript(上卷)》、《你不知道的JavaScript(中卷)》、《你不知道的JavaScript(下卷)》、《数据结构与算法JavaScript描述》。
当前阅读周书籍:《WebKit技术内幕》。
插件和JavaScript扩展
NPAPI插件
NPAPI(Netscape Plugin Application Programming Interface)的全称是网景插件应用程序编程接口,最早是由网景公司提出的,用于让浏览器执行外部程序,以支持网页中各种格式的文件,典型的例子是视频、音频和PDF文件等(通过内容类型来区分)。对于这些网络资源或者文件,浏览器本身并不支持它们。但是,经过第三方开发者开发的插件程序,浏览器就可以做到支持了。图10-1是Chrome浏览器使用NPAPI插件的列表中一个示例(在地址栏中输入chrome://plugins/就可以查看到所有插件)。当遇到上述格式PDF文件的时候,Chrome浏览器会调用该阅读器插件,通过NPAPI规范定义的接口使浏览器同插件之间得以交互。
Chromium PPAPI插件
插件其实是一种统称,表示一些动态库,这些动态库根据定义的一些标准接口可以跟浏览器进行交互,至于这个标准接口是什么都可以,重要的是大家都遵循它们,NPAPI接口标准只是其中的一种,因为它被广泛使用,所以被提到的次数也最多。本节介绍的PPAPI也是一种浏览器和插件交互的接口标准,该标准是由Google提出,在Chromium项目中获得支持。
PPAPI的提出是因为NPAPI的可移植性和性能存在比较大的问题,特别是针对跨进程的插件,同时还有插件需要2D和3D绘图、声音等问题时候就更为棘手。
PPAPI插件有两种运行模式,受信(Trusted)插件和非受信(Untrusted)插件。对于受信的PPAPI插件,它可以在Renderer进程中运行,也可以在另外的进程中运行。对于新版本的实现,架构设计都是基于IPC来设计的。对于非受信的PPAPI插件,则可以借助于使用NativeClient技术来安全运行。受信插件是与平台相关的,可以调用平台相关的接口。而对于非受信插件而言,它们可以是与平台无关的代码,可以调用NativeClient提供的有限接口,而不能调用其他接口。
JavaScript引擎的扩展机制
混合编程
NPAPI和PPAPI也能够提供混合编程的能力,也就是说,开发者能够将一些本地代码提供的能力提供给Web开发者。
从某种程度来说,使用插件机制来扩展JavaScript接口有个明显的缺陷,就是需要在DOM树中加入一个“embed”节点,而且需要提前完成插件的加载和初始化(这在上面的示例代码中没有很好地体现)。但是从技术上来讲,开发者可以通过插件机制在JavaScript引擎中注入一些JavaScript对象和方法,使得这些JavaScript对象和方法能够调用本地代码才能提供的能力,这的确是一种不错的扩展JavaScript引擎方式。
JavaScript扩展机制
如何使用本地代码来扩充引擎中的对象和函数。V8提供了两种方式,第一种是JavaScript绑定,第二种是V8的Extension机制,而JavaScriptCore提供了JavaScript绑定。
Chromium扩展机制
Chromium的扩展(Extension)机制原先是Chromium推出的一项技术,该机制能够扩展浏览器的能力,例如笔者使用的一个扩展实例名为“switchy proxy”,它可以帮助用户方便的切换Chromium浏览器代理,但是也仅此而已。本质上,它其实就是浏览器能力的简单扩展,而对于一些本地的功能,如书签、USB、蓝牙、电源管理等,该机制并没有这方面的能力。
一个Chromium Extension的实例其实就是一个网页加上JavaScript代码和CSS样式代码。当然,在Extension中,开发者也可以使用NPAPI插件和PPAPI及NaCl机制技术来扩展网页能力,所以它同这些技术没有冲突,相反,Chromium Extension机制可能需要这些技术以实现特定功能。
总结
虽然目前的浏览器能力很强大,但是仍然有能力不足的时候。特别是早期的浏览器能力十分有限,Web前端开发者们希望能够通过一些机制来扩展浏览器的能力。早期的方法就是插件机制,现在流行的则是混合编程(Hybrid Programming)模式。插件一直伴随着浏览器的发展,最著名的莫过于Adobe公司的Flash插件。对于插件的接口定义,差别也是很大,比较著名的是微软公司的ActiveX插件机制和网景公司的NPAPI插件。随后,Chromium项目考虑到性能引入了PPAPI插件机制,同时为了安全方面的考虑,引入了Native Client机制。这些插件机制扩展了浏览器的能力,极大地丰富了网页的应用场景。同时,随着HTML5的发展,很多HTML5功能同样需要扩展JavaScript的编程接口,以便开发者可以使用JavaScript代码来调用,而这样的扩展就需要相应的机制来实现,本篇重点介绍和探索了这些机制。
作者介绍
非职业「传道授业解惑」的开发者叶一一。
《趣学前端》、《CSS畅想》等系列作者。华夏美食、国漫、古风重度爱好者,刑侦、无限流小说初级玩家。
如果看完文章有所收获,欢迎点赞👍 | 收藏⭐️ | 留言📝。
- 点赞
- 收藏
- 关注作者
评论(0)