转:https://zhuanlan.zhihu.com/p/29101613?utm_medium=social&utm_source=qq

大家好,我又来了。这篇是21天自制原子弹的姐妹篇。

开个玩笑……从这篇开始, 我们来点干货,如何从blink打造一个可以实用的浏览器组件。

chromium从零几年搞到现在,已经完全变成一个无所不包的庞然大物。

如果你只是想要一个能浏览网页的组件,方便嵌入到自己的程序里,或者想用网页来做界面--例如QQ音乐,网易云音乐那样,

那么chromium的那堆多进程、mojo通信、Chrome Apps 框架、Aura Shell、增量升级系统、Chrome Extensions 、headless模式、P2P 通信库,native_client、pdf、ppapi、沙盒机制等等一堆乱七八糟你听都没听过的东西都不会需要。

然而只要用了chromium的内核(例如cef,elecTron,nwjs之类),这堆东西除了占用系统资源外,你还不得不都打包带上。

这时候你就会有个强烈的想法,我不需要这堆乱七八糟的功能,只要能浏览大部分网页的排版渲染组件可以么。

答案是肯定的。

webkit内核就是为此而生。但这里有个问题,chromium虽然当年是使用webkit内核,但自从和苹果分道扬镳后,把webkit改名成blink不说,代码和结构完全是面目全非,而且最重要的是blink已经不是像webkit那样是一个独立的组件了,而是chromium那堆几百个第三方库里一个小小的组件,所有外部设施都依赖于chromium的其他组件了。

我们来看看blink目前需要依赖哪些组件:

  1. cc层(chromium 合成层,实现网页绘制并贴到屏幕上等操作。这个是最麻烦的,以后专门开一篇来讲如何自制)
  2. base库(chromium基础库,类似字符串操作等一系列c++基础库)
  3. 各种和操作系统打交道的接口,例如菜单、文件读写、窗口操作等。这堆东西可以认为是要实现third_party/WebKit/public/platform/Platform.h里的一系列虚函数(又叫Blink Public或者WebKit Glue)。
  4. 如果你不是打算卖到清真地区,通常icu你也不会想要。这是个占用体积很大的毒瘤,一个数据文件就10几M,作为轻量级内核,你肯定不想带。
  5. 网络层。
  6. v8(js引擎)
  7. skia(底层绘图库)

那我们如何在尽量少的使用chromium代码基础上,实现上诉一堆功能和组件呢?

这是目前我的解决方案:

  1. cc层:我放弃了原版chromium cc层,自己完全重写了一遍。这个工作量相当巨大,如果你不是和我一样这么闲,建议直接使用原版cc。
  2. base库:在chromium四十几版的时候,blink几乎不依赖base。然而高版本把wtf库里的大量实现,直接使用base库。所以如果你是从高版本blink开始撸,可以直接扣取低版本blink里的wtf来实现base相关依赖。此处工作量也甚大。
  3. 各种和操作系统打交道的接口:这块其实没有难度,就是有着巨大的工作量。一个个补齐就好。
  4. icu:直接使用系统相关的接口。例如文字编码转换之类的,windouws就有现成的api。其他高级icu api例如断行断句,如果你只打算运行在中英文地区,那自己实现也很简单。只有阿拉伯文、天成文、藏文这些小众语言那需要那么复杂的规则。
  5. 网络层:直接用webkit里的现成代码吧。
  6. v8:直接使用chromium原始代码即可。毕竟这玩意不依赖其他任何组件。
  7. skia:直接使用chromium原始代码即可。毕竟这玩意不依赖其他任何组件。

说到这里,大家肯定有个疑问:既然这么多都用webkit,那为啥我们直接拿webkit过来不就行了。

其实是可以的。webkit发展到今天,已经完全和chromium分开发展了(当年有一阵子谷歌的人也一直在给webkit提代码,后面苹果把他们都踢走了)。而且webkit就是个完整内核,你用来做轻量级组件正合适。但我有几个原因还是放弃了:

  1. webkit对标准的支持还是有点偏差。例如web组件标准,css gird等等。
  2. webkit的web inspect做的很烂,完全没blink好用。
  3. webkit现在也很大了,我编译出来不算icu,也有26M多。作为一个有追求的程序员,我希望这个大小是10M左右。
  4. 最重要的,webkit的js引擎是javascriptcore。这样实现的组件就无法兼容市面上那堆v8造出来的轮子。例如electron、nwjs、nodejs都是用v8。
  5. 还有个小点就是chromium更新非常快,跟着谷歌大佬走感觉更有保障些,尤其是碰到各种莫名其妙的bug,还可以查chromium的更新记录。

既然放弃了webkit,从chomium开始撸,那必然会遇到吨的伤害。欲知后事如何,且听下回分解

自己动手实现浏览器,21天自制chromium:起手篇的更多相关文章

  1. 「雕爷学编程」Arduino动手做(21)——激光开关模块

    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里 ...

  2. 深入浏览器兼容 细数jQuery Hooks 属性篇

    关于钩子:http://www.cnblogs.com/aaronjs/p/3387906.html 本章的目的很简单,通过钩子函数更细节的了解浏览器差异与处理方案, 版本是2.0.3所以不兼容ie6 ...

  3. robotframework+selenium搭配chrome浏览器,web测试案例(搭建篇)

    这两天发布版本 做的事情有点多,都没有时间努力学习了,先给自己个差评,今天折腾了一天, 把robotframework 和 selenium 还有appnium 都研究了一下 ,大概有个谱,先说说we ...

  4. 使用浏览器抓取QQ音乐接口(歌曲篇)

    前言 前面我们获取了歌曲的排行榜的数据,我们现在需要实现歌曲播放 前面我们写了一段函数来得到了回调的数据,现在我们需要使用这一段数据,来实现播放歌曲 完整代码 <!DOCTYPE html> ...

  5. 使用浏览器抓取QQ音乐接口(排行榜篇)

    前言 最近手头比较空闲,再加上看到其他人的博客都差不多有个类似的播放控件,手就会闲不下来,说干就干,所以我们开始吧! 来到QQ音乐的官网,我们就直奔着目标去,寻找排行榜 我们主要用的是最近比较热的歌, ...

  6. vivo浏览器的快速开发平台实践-总览篇

    一.什么是快速开发平台 快速开发平台,顾名思义就是可以使得开发更为快速的开发平台,是提高团队开发效率的生产力工具.近一两年,国内很多公司越来越注重研发效能的度量和提升,基于软件开发的特点,覆盖管理和优 ...

  7. 【从零开始自制CPU之学习篇00】开篇

    从今天开始决定用面包板制作一个8位的CPU,实现几个简单的指令.我给自己分两大部分计划,第一部分是学习制作CPU的理论知识,第二部分是实践.并打算实施计划的同时用博客的方式记录下来.理论知识的部分重点 ...

  8. 【从零开始自制CPU之学习篇07】最简单的ALU—全加器

    ALU是算术逻辑单元,是CPU中重要的一部分,因为CPU本质上就是不断重复最简单的计算.而我们这一版CPU的ALU部分更为简单,是一个只能做加法的ALU. 理论部分 我们需要一个能帮我们进行数学计算的 ...

  9. 【从零开始自制CPU之学习篇06】寄存器

    上一篇文章学习了总线的相关知识,途中ABC当时假设为一个个的8位寄存器.这一篇要学习怎么构建这个寄存器. 这分为两个三个部分,数据输入,寄存器,数据输出.首先不管输出,来看数据输入和寄存器这两个部分. ...

随机推荐

  1. DNS服务-了解篇

    简介 DNS是用来名字解析的,名字解析成IP地址,IP地址解析成名字,正反操作,有服务器端和客户端即 S/C DNS是应用层协议,基于UDP/53.TCP/53端口,缺一不可 分为正向解析和反向解析/ ...

  2. GIMP做成颜色蒙板

    效果图: 原始的美女图片上盖了一层的颜色,这个是想出来的效果,只是用来实践学到的技能,具体的场景还没有确定. 1/首先打开原始的美女图片: 2/然后在添加一张新的图片,作为新的图层添加进来: 这样的话 ...

  3. verdi知识点

    引用:http://blog.csdn.net/naclkcl9/article/details/5425936 1. verdi 加强了active anotation, active trace和 ...

  4. CDC相关知识点总结

    跨时钟域设计很重要,每一个项目都会有,这个要马上学会总结好.本能力属于重要而且急需的能力.

  5. 在centos7中为php7安装redis扩展

    在此之前一直是用php5.6,安装redis也没遇到啥问题,嗖嗖的就安装上了 更新php版本到php7后,编译的时候报错 include <ext/standard/php_smart_str. ...

  6. xshell连接linux

    一些命令和快捷键: Ctrl + Alt 切换linux和windows的鼠标 Ctrl + c 或 Ctrl + d退出>状态 在xshell终端输入exit,退出与linux服务器的连接 登 ...

  7. MFC中的CListControl控件

    一直想要这种效果,无奈刚开始用了cListbox控件,不知道怎么生成背景的边框,找了好久资料,突然发现好像控件用错了. 用CListControl控件实现图中效果,超级开心~ 实现过程: 添加一个Li ...

  8. 对Thymeleaf的一些笼统介绍和理解

    (随手记录的,,可能没那么易看,sorry le) 先大概介绍一下关于Thymeleaf的概念和理解:首先Thymeleaf模板引擎(换句话说他是现代服务器端的Java模板引擎,) 他所对应的主要作用 ...

  9. 大数据学习——hbase的shell客户端基本使用

    1  基本shell命令 1 在hbase的 bin目录下进入命令行 ./hbase shell 2 查看有哪些表 list 3 创建一个表 create 't_user_info', {NAME = ...

  10. NYOJ-525一道水题思路及详解

    一道水题 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 今天LZQ在玩一种小游戏,但是这游戏数有一点点的大,他一个人玩的累,想多拉一些人进来帮帮他,你能写一个程序帮帮他 ...