谷奥和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来交流.
![](https://images.cnblogs.com/cnblogs_com/kuber/chrome-extension.jpg)
从上面的介绍可以看出, 消耗的资源从上到下越来越多. 只要你不点击图标, popup page 不会使用资源, content scripts 只存在特定的页面中, 并且只是响应页面上的事件. 而且content scripts其实就是user script, 因此消耗的资源和user script是一样的. background page 则是最大的资源消耗者. 其实在Task Manager 中能看到的扩展都是因为它们使用了background page, 以实现user script 所做不到的事情. 所以我的结论是"理论上"使用实现相同功能的user script 不会比扩展节省资源.
![](https://images.cnblogs.com/cnblogs_com/kuber/google_chrome_task_manager.jpg)
但是, 这个世界坏就坏在有但是 :-), 在实际我们使用的扩展中有不少其实不需要使用background page 却用了. 比如说一些划词翻译的扩展, 主要是响应用户在页面上鼠标选词事件, 其实并不需要background page. 我看过其代码, 它在background page中其实什么都没有做, 但是却加了一个background page常驻在浏览器的内存里面. 装多了类似的扩展自然你的chrome 消耗的资源就多了, 对于这种扩展显然 user script 或者bookmarklet 更合适.
---------------------------------------------------------------------------------
Moreover, 我曾经想过为什么很多扩展不需要background page却吃力不讨好地加了一个放在扩展里面. 我的猜想是, google 以前给出的chrome扩展开发教程里面的Get Started 示例包含了 background page, 可能有些开发者把那个示例当作新扩展的模板, 但是忘记在适当是时候去掉了.