在文章開始之前。我要叽歪几句,一上来就看Chrome的代码。简直晕头转向,摸来摸去莫不着头脑,好不easy看了一点点代码。却犹如瞎子摸象。无法众观全局。以下这篇小文,简介当中一个重要的模块--Component的设计,为我们阅读Google的代码打开思路。

概述

Chrome浏览器组件是一个google的一个项目。它用来不断的模块化Chrome的代码。

把整个content模块从src/chrome文件夹下抽取出来,虽然组件项目付出了不少努力,到眼下为止,这个文件夹(src/chrome)仍然是最大的互相依赖的模块。

因此,抽取src/chrome子模块仍然是google团队下一步的工作之中的一个。

目标

        众所周知,Chrome项目在过去几年中,不管是代码还是复杂度都增长了很多。

对这个项目贡献代码的人员数量也添加了很多。并且。google也添加了很多目标平台以及配置,这些并没有在项目启动初期被他们预见到得到。对每一个人来说,要理解整个架构变得越来越难。更别说全部代码了。

        Chrome浏览器组件项目引入了模块化并强制运行,目标例如以下:
  • 按比例增大架构,使得浏览器更适合需求变更。比方:使用src/chrome/browser模块的浏览器希望关掉或者又一次实现某些模块。比方安卓上的Chrome;
  • 通过进一步实现依赖关系图,我们想要实现的架构变得更清晰。

    那些依赖规则指出哪些子模块是同意的。哪些是不同意的。

  • 大大简化了src/chrome子模块的依赖关系图,使他们不循环依赖;
  • 通过添加很多独立的组件比方单元測试可运行程序来加速开发人员的浏览器构建过程。

    降低最大组件的连接时间。比如browser组件。单元測试程序更小了,这有利于大家用gdb调试代码。或者通过printf高速便利代码。

  • 上面提到的方法应该能够降低大家的担忧、也让google团队更easy合作,使得架构更不easy误解,同一时候不easy写出不好的架构来,通常也会使我们更高效。

设计

概览

1 把src/chrome文件夹提取出一个个的组件。这些组件变成了一个个的目标,他们有自己独立的单元測试目标,明白指定他们的依赖。没有循环依赖。

2 没有循环依赖

指的是组件并不认识自己的使用者(embedder)--嵌入组件的模块比如src/chrome。假设组件须要获得自己使用者的信息和服务,他们能够在初始化的时候获得。或者执行时通过抽象的client接口获得。这个client接口由组件定义、使用者(embedder)来实现。

3  组件在哪里?

在src/components/的子文件夹里。

  • 注意: 一些模块更像一个抽象层--比方src/content、或者更像一个产品--比方src/chrome,这些模块应该有自己的顶级文件夹,而不应该放到src/components文件夹下。

4 Client接口在哪里?

他们的声明在每个组件里,而实如今组件的使用者那里。

5  组件有必要提供API给组件的使用者调用吗?

A: 通常说来。例如以下使用方法是没问题的:组件的使用者採用C++类的详细类来使用组件。这样的情况下,API是非常easy的,不管组建类是什么--组件收到指针。实现来自使用者的托付接口。某些情况下,google引入了全然抽象的API给组件的使用者调用,这些API隐藏了组件的实现细节。就像他们给src/content组件做的一样。

某些其它情况下,他们给组件的C++详细类分分类,一部分分到内部类,一部分分到public类里。不管是内部类还是外部类,他们都应该存在于组件文件夹下,比如:src/components/mycomponent/public/.
假设一个组件的public分类存在,组件的client接口应该存在那里。

部分參考:http://www.chromium.org/developers/content-module

本文属原创,转载请注明出处,违者必究

关注chromium群480089700。或者微信公众平台:程序猿互动联盟(coder_online),你能够第一时间获取原创技术文章,和(java/C/C++/Android/Windows/Linux)技术大牛做朋友。在线交流编程经验。获取编程基础知识,解决编程问题。程序猿互动联盟,开发者自己的家。

Chromium浏览器组件设计意图的更多相关文章

  1. React组件设计

    React组件设计 组件分类 展示组件和容器组件 展示组件 容器组件 关注事物的展示 关注事物如何工作 可能包含展示和容器组件,并且一般会有DOM标签和css样式 可能包含展示和容器组件,并且不会有D ...

  2. React组件设计(转)

    React组件设计 组件分类 展示组件和容器组件 展示组件 容器组件 关注事物的展示 关注事物如何工作 可能包含展示和容器组件,并且一般会有DOM标签和css样式 可能包含展示和容器组件,并且不会有D ...

  3. 【整理总结】代码沉淀 - CefSharp - 比较流行的第三方内嵌浏览器组件

    .NET (WPF and Windows Forms) bindings for the Chromium Embedded Framework web: https://github.com/ce ...

  4. React组件设计技巧

    React组件设计 组件分类 展示组件和容器组件 展示组件 容器组件 关注事物的展示 关注事物如何工作 可能包含展示和容器组件,并且一般会有DOM标签和css样式 可能包含展示和容器组件,并且不会有D ...

  5. HT图形组件设计之道(三)

    上篇我们通过定制了CPU和内存展示界面,体验了HT for Web通过定义矢量实现图形绘制与业务数据的代码解耦及绑定联动,这类案例后续文章还会继续以便大家掌握更多的矢量应用场景,本篇我们先切换个话题, ...

  6. Android核心分析之二十Android应用程序框架之无边界设计意图

    Android应用程序框架1 无边界设计理念 Android的应用框架的外特性空间的描述在SDK文档(http://androidappdocs.appspot.com/guide/topics/fu ...

  7. Android应用程序框架之无边界设计意图

    Android的应用框架的外特性空间的描述在SDK文档有十分清楚的描述,Android应用的基本概念,组件生命周期等等有详细的描述.在外特性空间中,Android提供了Activity,Service ...

  8. xmlplus 组件设计系列之零 - xmlplus 简介

    xmlplus 是什么 xmlplus 是博主写的一个 JavaScript 框架,用于快速开发前后端项目. xmlplus 基于组件设计,组件是基本的构造块.评价组件设计好坏的一个重要标准是封装度. ...

  9. chromium浏览器开发系列第三篇:chromium源码目录结构

    上两篇介绍了下载源码和编译源码,这次主要介绍chromium的源码目录结构,我也是通过源码和官网结合来跟大家说,如果有说的不准确的,欢迎交流. 另外,官网的不一定准确,他们其实也很懒,所以最主要还是靠 ...

随机推荐

  1. linux:使用comm命令比较两个文件:交集、差

    linux:使用comm命令比较两个文件:交集.差 comm命令可以按行比较两个排序好的文件,输出有3列:第一列是file1独有的.第二列是file2独有的,第三列是两者都有的,简单语法如下:NAME ...

  2. [转载]使用32位64位交叉编码混淆来打败静态和动态分析工具 - wildsator

    0×00 摘要 混淆是一种能增加二进制分析和逆向工程难度与成本的常用技术.主流的混淆技术都是着眼于使用与目标CPU相同的机器代码,在相同的处理器模式下,隐藏代码并进行控制.本文中引入了一种新的混淆方法 ...

  3. Python中调用其他程序的方式

    前言 在Python中,可以方便地使用os模块来运行其他脚本或者程序,这样就可以在脚本中直接使用其他脚本或程序提供的功能,而不必再次编写实现该功能的代码.为了更好地控制运行的进程, 可以使用win32 ...

  4. kafka启动报错:kafka.common.KafkaException: Failed to acquire lock on file .lock

    kafka 异常退出后重启时遇到的问题 解决: 执行 netstat -lnp|grep 9092 在执行结果中找到进程号执行 kill -9 进程号再尝试启动Kafka  

  5. Python 获取图片文件大小并转换为base64编码

    import os import base64 fileSize = os.path.getsize(文件路径) with open(文件路径, 'rb') as f: data = base64.b ...

  6. Nginx主动连接与被动连接的差别

    1.主动连接是指Nginx主动发起的同上游server的连接:被动连接是指Nginx接收到的来自client主动发起的连接; 2.主动连接用ngx_peer_connection_t结构体表示:被动连 ...

  7. HTML5开发移动web应用——Sencha Touch篇(10)

    我们把数据可视化出来,为的就是进行一些针对数据的操作. 这里介绍一下DataView的排序功能和搜索功能. 掌握这两个技能,能够让写出的数据界面内的数据能够依据要求进行排序,能够进行数据的搜索显示灯功 ...

  8. 剑指Offer-正则表达式匹配(Python)

    1 题干内容 请实现一个函数用来匹配包括.和*的正则表达式.模式中的字符.表示任意一个字符,而*表示它前面的字符可以出现任意次(包含0次). 在本题中,匹配是指字符串的所有字符匹配整个模式. 例如,字 ...

  9. Android布局中match_parent和fill_parent的差别

    今天在做项目的一个新功能的时候,从网上查找资源,发现android2.2中出现的MATCH_PARENT感到不明确.过去仅仅有FILL_PARENT和WRAP_CONTENT那么match_paren ...

  10. jQuery select的操作实现代码

          //改变时的事件  $("#testSelect").change(function(){ //事件发生生 jQuery('option:selected', this ...