Kuberski - 酷伯司机

写在代码边上
posts - 57, comments - 212, trackbacks - 13, articles - 1
  博客园 :: 首页 :: 联系 :: 订阅 订阅 :: 管理

公告

用户脚本比扩展更省内存吗

Posted on 2010-04-08 11:36 kuber 阅读(...) 评论(...) 编辑 收藏
谷奥chrome迷最近都转载了一篇ghacks的文章"为什么说 Chrome 能用脚本就尽量不要用扩展",因为用户脚本比扩展更省内存,所以建议用户尽量用user script。因为我自己装了很多扩展,而且开发了几个扩展,以前关注过这个问题,想借此机会说明一下我的看法:扩展未必比脚本消耗更多资源,如果扩展开发者适当地使用Chrome 扩展API的话.

要说明这个问题,首先要看看一个Chrome 扩展包括了哪几个部分:
popup page(弹出页面): 当你点击地址栏边上的图标时弹出的页面. 这个页面只在你点击时创建, 当鼠标移开页面关闭时就会被销毁掉. 因此在你不使用这个页面时不会消耗资源. 很多信息查看的插件就只使用了popup page, 如China Stock Chart;
content scripts(页面脚本): Chrome 会把一段javascript 脚本注入到符合要求(由开发者指定)的页面中, 好像页面本来就引用了这段脚本一样, 并在Chrome 加载完页面后自动运行这段脚本. 很多修改页面布局和使用快捷键的扩展都使用了这种方式. 在Chrome 中使用user script 其实就是由Chrome 自动把脚本包装成一个只有content scripts的扩展, 这也是Chrome 不需要装插件就能使用user script的原因.
background page (背景页面): 所谓背景页面就是在后台自动运行的一段程序, 虽然也是用html+javascript 写的, 但是用户是看不到的. 当Chrome 启动时会启动所有扩展的背景页面, 并且这些背景页面会一直呆在Chrome 里面直到关闭浏览器. 因为它是一直在运行的, 扩展可以定期执行一些工作, 比如说定期检查你的gamil 邮件. 还有就是出于安全考虑, 在Chrome中页面脚本和弹出页面不能直接交换数据, 扩展也不能直接和其它扩展交换数据, 必须通过background page来交流.

 

 从上面的介绍可以看出, 消耗的资源从上到下越来越多. 只要你不点击图标, popup page 不会使用资源, content scripts 只存在特定的页面中, 并且只是响应页面上的事件. 而且content scripts其实就是user script, 因此消耗的资源和user script是一样的. background page 则是最大的资源消耗者. 其实在Task Manager 中能看到的扩展都是因为它们使用了background page, 以实现user script 所做不到的事情. 所以我的结论是"理论上"使用实现相同功能的user script 不会比扩展节省资源.


 

但是, 这个世界坏就坏在有但是 :-), 在实际我们使用的扩展中有不少其实不需要使用background page 却用了. 比如说一些划词翻译的扩展, 主要是响应用户在页面上鼠标选词事件, 其实并不需要background page. 我看过其代码, 它在background page中其实什么都没有做, 但是却加了一个background page常驻在浏览器的内存里面. 装多了类似的扩展自然你的chrome 消耗的资源就多了, 对于这种扩展显然 user script 或者bookmarklet 更合适. 

--------------------------------------------------------------------------------- 

Moreover, 我曾经想过为什么很多扩展不需要background page却吃力不讨好地加了一个放在扩展里面. 我的猜想是, google 以前给出的chrome扩展开发教程里面的Get Started 示例包含了 background page, 可能有些开发者把那个示例当作新扩展的模板, 但是忘记在适当是时候去掉了.