Chrome浏览器组件是一个google的一个项目,google用它来不断的模块化Chrome的代码。把整个content模块从src/chrome目录下抽取出来,尽管组件项目付出了不少努力,到目前为止,这个目录(src/chrome)仍然是最大的互相依赖的模块。因此,抽取src/chrome子模块仍然是google团队下一步的工作之一。
众所周知,Chrome项目在过去几年中,无论是代码还是复杂度都增长了许多。对这个项目贡献代码的人员数量也增加了许多,而且,google也增加了许多目标平台以及配置,这些并没有在项目启动初期被他们预见到得到。对每个人来说,要理解整个架构变得越来越难,更别说所有代码了。
Chrome浏览器组件的目标如下:
1 把src/chrome目录提取出一个个的组件,这些组件变成了一个个的目标,他们有自己独立的单元测试目标,明确指定他们的依赖,没有循环依赖。
2 没有循环依赖
指的是组件并不认识自己的使用者(embedder)--嵌入组件的模块例如src/chrome。如果组件需要获得自己使用者的信息和服务,他们可以在初始化的时候获得,或者运行时通过抽象的client接口获得,这个client接口由组件定义、使用者(embedder)来实现。
3 组件在哪里? 在src/components/的子目录里。
4 Client接口在哪里? 他们的声明在每一个组件里,而实现在组件的使用者那里。
5 组件有必要提供API给组件的使用者调用吗?
通常说来,如下用法是没问题的:组件的使用者采用C++类的具体类来使用组件,这种情况下,API是很简单的,无论组建类是什么--组件收到指针,实现来自使用者的委托接口。某些情况下,google引入了完全抽象的API给组件的使用者调用,这些API隐藏了组件的实现细节,就像他们给src/content组件做的一样。某些其他情况下,他们给组件的C++具体类分分类,一部分分到内部类,一部分分到public类里。无论是内部类还是外部类,他们都应该存在于组件目录下,例如:src/components/mycomponent/public/。 如果一个组件的public分类存在,组件的client接口应该存在那里。
参考:http://www.chromium.org/developers/design-documents/browser-components