在文章開始之前。我要叽歪几句,一上来就看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. oracle: 浅谈sqlnet.ora文件的作用,及SQLNET.AUTHENTICATION_SERVICES设置

    关于sqlnet.ora的说明: *****************************************************FROM ORACLE11G DOCS*********** ...

  2. ES6/ES2015核心内容(上)

    ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准.因为当前版本的ES6是在2015年发布的,所以又称ECMAScript 2015.也就是说,ES6就是ES2015. ...

  3. 奇特的JavaScript连续赋值运算

    一.引子: }; a.x = a = {n:}; alert(a.x); // --> undefined 以上第二句 a.x = a = {n:2} 是一个连续赋值表达式.这个连续赋值表达式在 ...

  4. vue2自定义事件之$emit

    父组件: API上的解释不多: https://cn.vuejs.org/v2/api/#vm-emit vm.$emit( event, […args] ) 参数: {string} event [ ...

  5. Digg工程师讲述Digg背后的技术

    虽然最近业绩有所下滑,也出现了一些技术故障,但Digg作为首屈一指的社会化新闻网站,其背后的技术还是值得一探,Digg工程师 Dave Beckett 在今年4月份写一篇名为<How Digg ...

  6. S7:享元模式 Flyweight

    运用共享技术有效的支持大量细粒度的对象. 应用场景: A.减少对相同对象的重复创建 UML: 示例代码:如果在工厂中,有用户,我们就直接调用,没有用户,我们就获取.减少对同一uid的user对象的重复 ...

  7. Dart Essentials(读书笔记)——这本书非常大篇幅都在谈AngularDart,Zones概念没谈到

    Dart Essentials 文件夹 1 Getting Started 2 Practical Dart 3 The Power of HTML5 with Dart 4 Developing a ...

  8. Mysql数据库分库备份,分表备份

    分库备份 #!/bin/sh DBPATH=/server/backup MYUSER=root MYPASS=oldboy123 SOCKET=/data/3306/mysql.sock MYCMD ...

  9. Servlet3.0: 简介AsyncContext

    每个请求来到Web容器,Web容器会为其分配一条执行绪来专门负责该请求,直到回应完成前,该执行绪都不会被释放回容器. 执行绪会耗用系统资源,若有些请求需要长时间处理(例如长时间运算.等待某个资源),就 ...

  10. Python内置函数之format()

    format(value[,format_spec])返回字符串对象. 可以用来格式化value. >>> format(,'0.3f') #保留3位小数 '12.000' > ...