在文章開始之前。我要叽歪几句,一上来就看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. vue假全家桶升级方式,形成类似于小程序的路径管理(新增require-css与require-text)

    1.路径布局大致就是这样,完全模拟小程序,主要是靠require来做到的 2.首先index.html是这样的(配置js和css没有用requireJs主要是方便而且载入什么组件比较清晰) <! ...

  2. Queue 队列的用法

    队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作. LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用. 以下实例演示了队 ...

  3. ZOJ 3792 Romantic Value 最小割(最小费用下最小边数)

    求最小割及最小花费 把边权c = c*10000+1 然后跑一个最小割,则flow / 10000就是费用 flow%10000就是边数. 且是边数最少的情况.. #include<stdio. ...

  4. nmcli日常用法

    一.nmcli日常用法nmcli dev status //查看系统现有网络设备的连接状态nmcli conn show //查看已有连接nmcli conn delete UUID1 UUID2 U ...

  5. Linux学习笔记 (七)挂载命令

    在Linux中,光盘,U盘,硬盘在使用之前必须进行挂载,挂载类似windows中的分配盘符. 一.查看挂载和自动挂载 1.mount:直接输入mount表示查看系统中所有的挂载点. 2.mount - ...

  6. 进程资源和进程状态 TASK_RUNNING TASK_INTERRUPTIBLE TASK_UNINTERRUPTIBLE

    摘要:本文主要介绍进程资源和进程状态.进程资源由两部分组成:内核空间进程资源以及用户空间进程资源.进程状态,就绪/执行状态.等待状态(能够被中断打断).等待状态(不能够被中断打断).停止状态和僵死状态 ...

  7. TP框架I方法详解

    TP框架I方法详解   I方法是ThinkPHP众多单字母函数中的新成员,其命名来自于英文Input(输入),主要用于更加方便和安全的获取系统输入变量,可以用于任何地方,用法格式如下:I('变量类型. ...

  8. ijkPlayer 集成

    代码地址如下:http://www.demodashi.com/demo/11957.html 概述 ijkplayer 是一款做视频直播的框架,基于FFmpeg,支持Android和iOS.这里介绍 ...

  9. ios 自动布局水平跟垂直居中

    [view addConstraint:[NSLayoutConstraint constraintWithItem:segment attribute:NSLayoutAttributeCenter ...

  10. Spring Cloud简单入门教程

    原文地址:http://www.cnblogs.com/skyblog/p/5127690.html 按照官方的话说:Spring Cloud 为开发者提供了在分布式系统(如配置管理.服务发现.断路器 ...