1.3 Manifest文件格式

Chrome扩展都包含一个Manifest文件——manifest.json,这个文件可以告诉Chrome关于这个扩展的相关信息,它是整个扩展的入口,也是Chrome扩展必不可少的部分。

Manifest文件使用JSON格式保存数据,为了避免有的读者对JSON不了解而无法继续阅读,下面我将简单介绍一下JSON。JSON是JavaScript Object Notation的缩写,这是一种基于JavaScript语言的轻量级数据交换格式。由于JSON储存的数据冗余度比XML更低,而且便于读取,所以也被很多其他语言所支持,现在JSON已经成为一种跨平台跨语言的通用数据交换格式。

JSON包含两种结构:一种是key:value对的形式,名称和值之间用冒号(:)连接,多个key:value对之间用逗号(,)连接,最后在整个对象两侧加上“{”和“}”;另一种是值的有序集合,值与值之间用逗号(,)连接,最后在整个数组两侧加上“[”和“]”。

enter image description here
对象形式的结构,图片来源于www.json.org

enter image description here
数组形式的结构,图片来源于www.json.org

其中无论是对象形式还是数组形式,它们的值均可以是字符串、数字、对象、数组、布尔和null中的一种,也就是说JSON有嵌套的性质,值也可以是JSON格式的数据。

下面给出了一个JSON的例子:

{
    "name" : "Harry Potter",
    "author" : {
        "name" : "J.K.Rowling",
        "birth" : 1964
    },
    "books" : [
        "Harry Potter and the Philosopher's Stone",
        "Harry Potter and the Chamber of Secrets",
        "Harry Potter and the Prisoner of Azkaban",
        "Harry Potter and the Goblet of Fire",
        "Harry Potter and the Order of the Phoenix",
        "Harry Potter and the Half-Blood Prince",
        "Harry Potter and the Deathly Hallows"
    ]
}

上述例子中的JSON整体是一个对象的形式,这个对象包含三个属性,分别是nameauthorbooks。其中name的值是字符串,为"Harry Potter"author的值是一个对象,这个对象有两个属性,分别是namebirthname的值是字符串,为"J.K.Rowling"birth的值是数字,为1964,可以说author的值也是一个JSON格式的数据;books的值是数组,这个数组包含七个元素,每个元素都是一个字符串。

接下来我们看看Chrome扩展中Manifest的内容。Google的官方文档中对于扩展和应用给出了两个不同的Manifest介绍界面,这是因为有些属性只能由扩展使用,而有些属性只能由应用使用。如果这两者同时出现在同一个Manifest文件中,就会使Chrome困惑,不知是按照扩展对待这个程序还是按照应用来对待这个程序。但无论是扩展还是应用,它们的Manifest又有很多共有的属性,所以我决定还是放到一起讲。

Chrome扩展的Manifest必须包含nameversionmanifest_version属性,目前来说manifest_version属性值只能为数字2,对于应用来说,还必须包含app属性。

其他常用的可选属性还有browser_actionpage_actionbackgroundpermissionsoptions_pagecontent_scripts,所以我们可以保留一份manifest.json模板,当编写新的扩展时直接填入相应的属性值。如果我们需要的属性不在这个模板中,可以再去查阅官方文档,但我想这样的一份模板可以应对大部分的扩展了。

{
    "app": {
        "background": {
            "scripts": ["background.js"]
        }
    },
    "manifest_version": 2,
    "name": "My Extension",
    "version": "versionString",
    "default_locale": "en",
    "description": "A plain text description",
    "icons": {
        "16": "images/icon16.png",
        "48": "images/icon48.png",
        "128": "images/icon128.png"
    },
    "browser_action": {
        "default_icon": {
            "19": "images/icon19.png",
            "38": "images/icon38.png"
        },
        "default_title": "Extension Title",
        "default_popup": "popup.html"
    },
    "page_action": {
        "default_icon": {
            "19": "images/icon19.png",
            "38": "images/icon38.png"
        },
        "default_title": "Extension Title",
        "default_popup": "popup.html"
    },
    "background": {
        "scripts": ["background.js"]
    },
    "content_scripts": [
        {
            "matches": ["http://www.google.com/*"],
            "css": ["mystyles.css"],
            "js": ["jquery.js", "myscript.js"]
        }
    ],
    "options_page": "options.html",
    "permissions": [
        "*://www.google.com/*"
    ],
    "web_accessible_resources": [
        "images/*.png"
    ]
}

在官方文档中可以找到完整的Manifest属性列表,扩展在https://developer.chrome.com/extensions/manifest,应用在https://developer.chrome.com/apps/manifest。由于Google更新得非常频繁,上述页面内容可能会经常变动,但那些比较基本的属性变动的几率不会很大。