Chrome 中有两种扩展应用类型,一种是 Extension,它通过往页面中添加 script 脚本来达到其目的。另外一种是 Packaged Application,它是基于 Chrome 的本地应用。具体用法以后再总结。
这两种扩展都是需要用户手动安装的,也是可以自动更新的。但是有些时候,我们还是需要去检查 Extension 的版本。下面我们就看看如何去做?
首先,我们知道,在编写 Extension 时,我们都需要写一个manifest.json
文件,它里面包含着关于这个 Extension 的信息。比如name
,description
,version
等很多信息。那么我就可以通过获取该文件来获取本扩展的版本。
那么如何获取manifest.json
文件呢?
首先我们知道 Extension 中可以通过XMLHttpRequest
来获取资源文件,而manifest.json
也可以看做是普通的一个资源文件,那么我们就可以通过XMLHttpRequest
获取manifest.json
。
1 | (function() { |
以上方法放在 Extension 的 content script 中,报如下错误:GET http://[ip]:[port]/manifest.json 404 (Not Found)
。这个很容易理解,因为在 Extension 中,该脚本是通过 script 标签插入到 DOM 中执行的。那么我们如何来获取 manifest.json 的实际路径呢?答案是chrome.extension.getURL
,这个 API 就是根据扩展中资源文件的相对路径来获取其绝对路径。而在 Packaged App 中则可以直接使用相对路径。所以在 Extension 中的做法是:
1 | (function() { |
还要记住,我们需要在manifest.json
中声明manifest.json
是一种可以访问的资源。
1 | { |
否则我们会看到如下错误:
1 | Denying load of chrome-extension://ongmmjdilaoifhglgibpinckpckeclch/manifest.json. Resources must be listed in the web_accessible_resources manifest key in order to be loaded by pages outside the extension. |
以上我们把manifest.json
当做一个普通的资源文件来访问。那么manifest.json
作为一种很关键很通用(所有 Extension 中都有该文件)的一个配置文件,那么有没有更简单的方法呢?答案是肯定的。在最新的 Chrome(v22+)中提供了chrome.runtime.*
API,他们提供了获取 background 页面,manifest.json 文件,以及和其他 Extension 通信的各种 API。代码如下:
1 | var manifest = chrome.runtime.getManifest(); |
很明显,直接使用chrome.runtime.getManifest
来获取 Extension 的版本号,最为简单,代码少,还是同步的。
总结:文章总结了获取 Extension 版本号(在manifest.json
中)的两种方法,一种把manifest.json
当做普通资源文件访问,一种直接使用chrome.runtime.getManifest
访问,后者更为简单易用。