写点什么

如何开发一款浏览器

  • 2013-02-13
  • 本文字数:1992 字

    阅读完需:约 7 分钟

作为互联网时代用户日常使用最为频繁的一种产品,浏览器领域一直是各大厂商的“兵家必争之地”,甚至有“得浏览器者得天下”的说法。桌面端 IE、Firefox、Chrome 的争夺一直非常激烈,最近又有腾讯、搜狗、360 等公司的加入,各自都开发出具有自身特点的浏览器。在移动端也一样,UC 浏览器、海豚浏览器、猎豹浏览器、QQ 浏览器等等都加入到这场混战之中。那么,想要开发出一款浏览器,需要有哪些知识储备,又有哪些难点呢?最近在知乎上出现了两场讨论,我们可以从中窥得一斑。

问题之一是“开发一款浏览器内核需要学习哪些方面的知识?”,这是一位准备做毕业设计的学生提出的,他“不准备直接用现成的开源浏览器内核(比如 WebKit 或者 KHTML 这些)来做套壳,而是打算自己用 C/C++ 从零开始,写一个简单的浏览器内核,也就是所谓的排版引擎或者网页渲染引擎。考虑到自己的能力,目标暂定为能够支持 html1.0”。

冬眠给出了比较详细的解答:

网页开发:你要知道 inline 与 block 有什么不同,什么是 box model,ie 是怎么实现的,标准的是怎么样的。

网络方面:浏览器会使用 URL,表单提交,下载,DNS 等一系列知识,深一些的比如说在 chrome 下面输入 chrome://dns,看看什么叫 prefetch DNS,浅一点至少要知道怎么实现表单提交,表单提交分那些格式。在网络那一层要怎么拼。

编译原理:简单的是状态机,具体的是 CSS 的解析,Javascript 的解析。其实光 HTML,CSS 的解析就够做一个毕设的了,举一个简单的例子,浏览器是边下载边解析,边显示的,这个地方就有不少的坑等着你,光拿一个开源的 xml 解析器可不行,html 的解析中还有图文混排等功能,整个地方又是无数的坑。 就不要说 javascript 的引擎了,龙书中写的只是一小部分,里面还牵涉到什么 JIT 等一大堆东西。

图形:硬件加速,你在 chrome 浏览器中地址栏中输入 chrome://gpu,里面出现频率最高的就是 Hardware accelerated。

前 UC 浏览器产品经理张瑞从浏览器的工作周期角度给出了建议:

首先是联网模块:包括域名解析(这个可以忽略)、发起请求,连接线程的管理等(单线程请忽略)。

然后是解析模块:包括了 html 的解析、DOM 树的建立等。尤其是 html 的解析,会涉及到容错方面的考虑,DOM 树要考虑各种场景下的效率(好吧,毕业设计可以不考虑效率)。

接下来是渲染模块:根据你建立的 DOM 树,按照网页所描述的内容展示字体、色块等,这个没什么好说的。

还有其他,比如网页对象的管理、页面事件的响应、插件管理。

另一个问题是“开发一款浏览器的难点有哪些?”,范围并不限于 PC 端还是移动端的浏览器。

余天升认为难点在于浏览器的两个关键部分:布局引擎和 JavaScript 解释器。

布局引擎就是我们常说的浏览器的内核,主要处理 HTML 和 CSS。简单的说,就是它决定了什么东西该在什么地方怎么样显示。对于网页这种视觉工程来说,布局引擎的重要程度不言而喻。

对于布局引擎的难点,大概有这些方面:

  1. 对标准的支持和扩展: 有一些标准的内容可能会难以实现,或者会带来一些安全的问题,所以各大浏览器对于标准都会有一些的裁剪,而另外又有一些拓展。
  2. 布局性能: 布局引擎的性能,包括内存、CPU 等指标,能够直接影响用户的体验。简单来说就是显示快不快,占用内存多不多。
  3. 其他: 类型稳定性、可拓展性这样的一些其他类型软件共有的特点。

JavaScript 解释器本来应该是浏览器内核的一部分,但是现在前端大量对 JavaScript 的应用,和浏览器厂商对这个部分的重视,开始分离出来了。既然拿出来了,JavaScript 解释器的性能,包括时间性能、内存性能这些因素就很重要了,需要各种优化编译过程,优化生成代码,优化指令的工作。

其他的一些难点,就是一些软件上通用的东西,如何挖掘用户需求,如何让用户使用得更满意,比如单窗口向多标签的转变,快速拨号,鼠标手势这些功能。

程序猎人认为问题应该分为技术难点和非技术难点:

如果是非技术难点,最大的就是人才和资金。如果找不到合适的人才,筹不到足够的资金,开发工作是否能开始都是个问题。

如果是作为商业产品开发,就随之而来另一个难点:盈利方式。现在免费浏览器满天飞,你花了钱开发了浏览器,如何与其他产品竞争,如何收回成本甚至盈利。

再看技术难点,余天升说的比较全面。但顺序上,我觉得稳定性和可靠性要更重要一些。对于几乎一切软件,这两点都是最重要的。只不过要求的标准看要定多高了。浏览器肯定不需要银行系统那么高的可靠性和稳定性。

另外,从技术上看,你是要重新开发一个渲染引擎还是利用现有引擎。如果要重新开发引擎,那么难点就会多很多。各种协议、标准的支持,自身的特性,性能都是不得不考虑的问题。

由此看来,想要开发出一款浏览器,并不是一件容易的事情,其中涉及到的各种知识和需要处理的难点都非常多,不过这么多的付出也会得到相应的回报。InfoQ 的读者们,你是否也考虑过开发一款浏览器呢,对于如何开发一款浏览器有什么样的看法呢?欢迎加入讨论。

2013-02-13 18:5427283
用户头像

发布了 340 篇内容, 共 144.3 次阅读, 收获喜欢 13 次。

关注

评论 1 条评论

发布
用户头像
开发一款新的浏览器绝非易事,核心的包括render core,js core两部分,还需要兼容目前很多的extensions,web apps以及很多的标准规范。人力方面,需要大量的优秀浏览器开发者,需要雄厚的资金支持。
2021-09-02 16:15
回复
没有更多了
发现更多内容

Apache负载均衡与Tomcat集群配置学习(Windows环境)

爱好编程进阶

Java 程序员 后端开发

docker的网络管理

爱好编程进阶

程序员 后端开发

GitHub已置顶!Alibaba最终版Java面试小抄+架构师系统进阶指南

Java架构追梦

Java 后端开发 程序员面试

@Autowire和@Resource注解使用的正确姿势

爱好编程进阶

Java 程序员 后端开发

Centos7安装JDK和Tomcat详细步骤

爱好编程进阶

Java 程序员 后端开发

头一次见这么牛的的SpringBoot从入门到实战文档

Java架构追梦

spring java面试 后端开发

成为Java顶尖程序员之前,先过了下面问题才行

Java架构追梦

Java 后端开发 数据结构与算法

9 个 Java 性能调优技巧,YYDS!

爱好编程进阶

Java 程序员 后端开发

9000字通俗易懂的讲解下Java注解,你还看不明白?

爱好编程进阶

Java 程序员 后端开发

阿里架构师花两个月时间整理出来的Java独家面试题(Java岗)

Java架构追梦

Java 程序员 后端开发

Dockerfile 搭建tomcat基础镜像与项目镜像

爱好编程进阶

Java 程序员 后端开发

Elasticsearch Query DSL之Compound queries(复合查询)

爱好编程进阶

Java 程序员 后端开发

五分钟搞懂分布式流控算法

俞凡

架构 算法

不要再焦虑了,进大厂真的没你想象的那么困难

Java架构追梦

Day232&233

爱好编程进阶

Java 程序员 后端开发

ElasticSearch中DSL高级检索(Query)

爱好编程进阶

Java 程序员 后端开发

Nacos在企业生产中如何使用集群环境?

牧小农

nacos SpringCloud Alibaba

Elasticsearch中的Term查询和全文查询

爱好编程进阶

Java 程序员 后端开发

千万级学生管理系统的考试试卷存储方案

凯博无线

自己动手写 Docker 系列文章总览

Go Docker 4月月更

Day163

爱好编程进阶

Java 程序员 后端开发

面试了200多个程序员,多数上来就要20K,说实话6K我都不想给

Java架构追梦

Java 后端开发 程序员面试

移动办公安全告急?融云 x 海泰方圆,给即时通讯加把「安全锁」

融云 RongCloud

Drools规则引擎实践直白总结

爱好编程进阶

Java 程序员 后端开发

公司8java开发接私活被抓了,我说他最近咋这么飘

Java架构追梦

程序员 JAVA开发 java面试 后端开发

从领导喊你回去改 Bug 来说如何取消 Dio 网络请求?

岛上码农

flutter ios开发 安卓开发 4月月更 跨平台开发

四面字节跳动Java研发岗,最终拿下Offer,只有努力,方能成功,老八股了

Java架构追梦

Java MySQL 程序员 后端开发

Activiti6

爱好编程进阶

Java 程序员 后端开发

dubbo 长连接

爱好编程进阶

Java 程序员 后端开发

elasticsearch各种问题总结

爱好编程进阶

Java 程序员 后端开发

对已有系统如何开展TDD

Bruce Talk

敏捷 敏捷开发 TDD Agile

如何开发一款浏览器_JavaScript_侯伯薇_InfoQ精选文章