大多数现代网络浏览器都是庞然大物,而且设计可能相当糟糕,因为它们(以及网络本身)以相当随意的方式发展。
首先,您需要将项目的目标(以及您希望实现的目标)非常明确。这是您只是为了好玩而做的事情,还是您希望其他人使用您的浏览器?如果你期望别人使用它,他们的动机是什么?期望你从头开始开发一个新的浏览器,每个人都可以用来替代 Chrome、Safari、Firefox、IE、Opera 等是不现实的。所有这些项目都有 10-15 年的领先优势你,当你赶上他们时,他们将比你领先 10-15 年。再加上他们背后有更多的人力,所以如果你想让你的项目成功,你会在某个时候需要这种人力。
这就是苹果和谷歌这两家拥有大量资源的大公司没有从头开始的原因。甚至微软都不是从头开始的。最初的 IE 基于 Mosaic。今天仍然存在的唯一重要的浏览器是 Opera、Konqueror 和 Lynx,不幸的是,它们的市场份额都很小。让我们暂时忘记 Lynx,因为它是一个纯文本浏览器,大概它仍然存在的唯一原因是因为它服务于特定的利基市场。 Opera 可以说是有史以来最好的浏览器之一,但它的市场份额从来没有很大,所以请记住,成功和创新不是一回事。 KHTML 是 Konqueror 背后的引擎,它本身从未变得非常成功,但却是 Apple 和 Google 都使用的 WebKit 的基础。我想肯定有人会争辩说,如果从来没有制作过 KHTML,那么 Safari 或 Chrome 都不存在。有趣的是,KHTML 和 Opera 大部分都是由在奥斯陆同一栋大楼工作的挪威程序员制作的。
您需要像构建操作系统一样构建 Web 浏览器,因为浏览器本质上就是这样——它是运行 Web 应用程序的操作系统。和操作系统一样,网络浏览器是一个非常复杂的软件,包含许多组件。当然,人们已经成功地从头开始创建新的操作系统。 Linus Torvalds 浮现在脑海中。他使 Linux 成为有史以来最成功的操作系统之一。
当然,您还面临一个额外的挑战,这使得构建一个新的成功浏览器比构建一个新的成功操作系统更难。浏览器有望完美地运行所有漂浮在网络上的遗留代码。现在假设 Linus Torvalds 被告知他的新操作系统将无关紧要,除非它与 UNIX 或某些现有操作系统完全向后兼容。我怀疑他会打扰,而 Linux 今天可能不会存在。当然,实际上,Linux 流行的唯一原因是它设计得很好,而且 GNU 项目能够制作工具来将大量现有代码移植到 Linux 上。如果没有 GNU 对 Linux 的意识形态支持,它永远不会有机会。
因此,假设您真的有足够的野心(或鲁莽)来尝试制作一款成功的新浏览器,那么您应该关注的是架构和设计。除非您确定可以以某种方式改进现有浏览器的设计,否则没有实际理由从头开始构建新浏览器。这意味着您需要对 WebKit 和 Gecko 的代码足够熟悉,以了解他们所做的设计决策,但您不应该尝试复制他们的设计,因为否则你还不如直接使用他们的代码。
我个人的想法(没有做足够的研究)是今天的浏览器不够模块化。如果我要制作一个新的浏览器,我会找到一种方法来轻松地交换东西(比如用另一个 JavaScript 引擎替换一个 JavaScript 引擎),并为用户提供比现有浏览器更多的控制权.现代浏览器和网页设计师几乎已经从用户手中夺走了所有的控制权。为什么我,用户不能告诉网络浏览器我希望它如何呈现在我的机器上显示的内容?最初的 HTML 只给出了如何构建内容的指导方针,随着时间的推移,新的标准变得越来越教条,以至于用户现在完全受制于网页设计师。 Linux 的吸引力在于它把控制权交还给了用户,这就是为什么这么多极客支持它并使它成为一个成功的操作系统的原因。
如果我是你,我会花时间研究的另一件事是操作系统设计原则。设计一个好的浏览器,至少在理论上应该需要与设计一个好的操作系统相同的原则——尤其是在并发进程、安全模型等方面。
最后,在做了大量的研究之后,我认为这是你应该开始编码的地方:
重新设计马赛克,但使用您自己的设计理念。如果您只是为了娱乐或您自己的教育利益而这样做,这也是我的建议。阅读原始的 HTML 1.0 和 HTML 2.0 规范,以及 HTTP 1.1 规范和当前的 URI 规范,并确保您的浏览器符合所有这些规范。您当然可以下载已经处理传输协议、URI 约定等的现有软件,但如果您认真设计自己的浏览器,我认为从头开始做这些事情也是一个很好的练习,所以您会得到很好地了解所有拼图是如何组合在一起的。在第 0 步结束时,您应该拥有一个至少可以与 90 年代最先进的浏览器相媲美的浏览器。这是一个很好的第一个里程碑。您实际上可以在ftp://ftp.ncsa.uiuc.edu/Mosaic/ 下载原始 Mosaic,并查看它与您的浏览器的比较。看看当前网站如何在像 Mosaic 这样的古老浏览器中呈现也是一个很好的练习。
为您的浏览器添加对 DOM 的支持。首先关注 W3C DOM Level 1 和 Level 2,因为几乎所有当前的浏览器都完全支持它们。然后看看 Level 3 和 Level 4。DOM 是 web 编程的基础,所以如果你要真正构建一个现代 web 浏览器,它的整个设计都必须考虑到这一点。由于您使用 C# 编写浏览器,因此您可能需要考虑如何利用现有的 .NET 对象模型来发挥自己的优势。
查看现有的脚本引擎,看看您是否可以将它们移植到您的项目中。我不鼓励您编写自己的 JavaScript 解释器,不仅因为这本身就是一个非常大的项目,而且因为已经在优化 JS 编译器(例如 V8)方面投入了大量工作。因此,除非您是编译器设计方面的专家,否则您手工构建的 JS 解释器可能不如现有的解释器,即使它完美地遵循 EMCAScript 规范。同样,我认为脚本引擎应该是一个完全独立于实际浏览器的模块,所以我认为拥有一个允许您替换任何脚本引擎的框架会更有用,而不是构建一个脚本引擎仅适用于您的浏览器。
查看北美排名前 10-20 的网站(Google、Facebook、YouTube、Twitter、维基百科、亚马逊、流行的博客平台等)的 HTML/CSS/JS 源代码并设计您的浏览器与这些网站很好地合作。这是一个更容易解决的问题,而不是制作一个符合所有现有标准的浏览器(当前的浏览器仍然不能完美地做到这一点)更不用说制作一个能够正确呈现网络上所有网站的浏览器(没有人可以去做)。人们会抱怨您的浏览器违反标准等等,但这并不像人们抱怨他们无法使用您的浏览器访问 Google 或 Facebook 那样大。我想不出任何浏览器在其第一个版本中正确地遵循了所有(甚至大多数)标准,所以我说不要费心去尝试。如果你能做出人们想要使用的东西,以至于会有第二个或第三个版本,那么你可以在那个时候担心标准。