Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >chrome扩展应用开发快速科普

chrome扩展应用开发快速科普

作者头像
黄Java
发布于 2018-09-18 08:59:43
发布于 2018-09-18 08:59:43
1K00
代码可运行
举报
文章被收录于专栏:黄Java的地盘黄Java的地盘
运行总次数:0
代码可运行

概述

本文通过对chrome插件的各个部分进行快速的介绍,从而让大家了解插件各个部分的关系,并且知道如何将其进行组装成一个完整的chrome插件。

由于chrome官方文档中对于如何从零开发一个chrome扩展应用没有一套完整的流程,同时官方的API文档对于初学者也不是那么友好,因此本文将通过一个初学者的视角来讲解如何从零开始快速了解和开发一个chrome插件。

本文的目标群体:已经了解或使用过chrome扩展应用,但是自己不知道如何开发一个chrome扩展应用的工程师。如果有具体的chrome扩展应用开发经验的同学,本篇文章可能太过简单,并不适合你。

本文的主要内容如下:

  • chrome扩展应用模块功能介绍
  • chrome扩展应用模块开发介绍

本文的内容不包括chrome扩展应用开发时提供的各个API功能详解,有需求的同学可以自行查看官方API文档

chrome扩展应用模块功能介绍

chrome扩展应用由很多部分组成,其中主要模块为:

  • Manifest File
  • Background Pages
  • Content Script
  • Options

为了避免由于翻译原因导致的问题,因此在下文中对相关模块的称呼一律采用上面的英文。下面,我们先简单来了解下这些模块具体是什么作用。

Background Pages

A common need for extensions is to have a single long-running script to manage some task or state. Background pages to the rescue.

从官方的介绍我们可以知道,Background Pages的作用就是在浏览器运行时,会长时间执行的脚本。只要浏览器处于打开状态,在Background Pages中的脚本就会在后台执行。

Content Script

Content scripts are JavaScript files that run in the context of web pages. By using the standard Document Object Model (DOM), they can read details of the web pages the browser visits, or make changes to them.

从上面官方的介绍我们可以知道,Content Script其实就是我们需要写的将会在我们希望的目标页面中执行的脚本文件。每次目标页面刷新时,这部分脚本也会重新加载执行。

Options

To allow users to customize the behavior of your extension, you may wish to provide an options page.

从官方的介绍我们可以了解,Options部分就是我们对于扩展的管理功能。我们能够通过一个模块来对chrome扩展应用的设置和数据进行处理。

chrome扩展应用模块开发介绍

首先,让我们先确定我们插件需要完成的一个功能,这样我们就能够有一个目标示例来进行介绍。

以我自己开发的表情插件为例,它必须具备以下几项功能:

  • 能够收集任何网页的图片作为表情
  • 能够在插件中管理已有表情
  • 能够在特定页面中将表情发送出去

我们将上面的功能抽象一下,就能够得到如下的结果:

  • 能够收集保存任何网页的图片作为表情(长时间执行脚本监听用户操作)
  • 能够在特定页面中将保存的表情发送出去(在目标页面中使用脚本与页面进行交互)
  • 能够在插件中管理已有表情(插件管理相关功能)

因此,需要完成上述功能,我们就需要用到上面我们提到的功能模块。下面,让我们按照模块来看下,我们应该如何实现这些功能。

配置文件(Manifest File)

首先,在进行具体的功能开发时,我们需要来看下我们的项目配置文件。这个配置文件在整个chrome扩展应用中非常重要,包含了项目的属性、配置、权限和资源信息。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "manifest_version": 2,
  "name": "大象表情收藏",
  "description": "大象表情收藏(非官方)",
  "version": "4.15.1",
  "default_locale": "zh_CN",
  "icons": {
    "16": "img/icon16.png",
    "48": "img/icon48.png",
    "128": "img/icon128.png"
  },
  "background": {
    "scripts": [
      "js/background.js"
    ],
    "persistent": false
  },
  "permissions": [
    "<all_urls>",
    "storage",
    "contextMenus"
  ],
  "content_scripts": [
    {
      "css": [
        "js/main.css"
      ],
      "js": [
        "js/favor.js"
      ],
      "matches": [
        "*://x.sankuai.com/*"
      ],
      "run_at": "document_end"
    }
  ],
  "options_page": "options.html",
  "web_accessible_resources": [
    "img/favorite.png",
    "img/left.svg",
    "img/right.svg",
    "img/icon128.png",
    "img/plane.svg",
    "options.html"
  ]
}

这是我开发的大象表情插件的manifest配置文件,我们通过这个配置文件来看下相关的属性字段。

属性名称

属性含义

备注

manifest_version

manifest文件版本

name

项目名称

发布到商店时的名称。

description

项目简介

发布到商店时的简介。

version

项目版本

发布到商店时需要每次递增。

default_locale

默认的locale目录

具体见此处。

icons

扩展应用图标

需要提供16x16,48x48,128x128三种尺寸。

background

Background Pages文件

permissions

扩展应用所需权限

权限列表见此处。申请权限后,可以使用chrome对象来进行访问该权限提供的API接口。我所开发的扩展应用主要是使用到了右键菜单和存储权限

content_scripts

Content Script文件

matches字段表示Content Script文件生效的域名

options_page

Options文件

web_accessible_resources

扩展需要访问的本地资源

只用列举的资源才能够在扩展中通过相对路径方式访问。

根据上面的实例文件和具体的属性介绍,相信大家对manifest文件有了一个具体的了解。下面,我们来具体介绍下我们需要使用的各个功能模块。

收集网页的图片(Background Pages)

需要收集各个网页的图片,我们需要一个后台常驻的脚本来满足我们的需求。因此,我们需要使用Background Pages

根据前一节的manifest文件,我们指定了background.js文件作为我们的后台常驻脚本,下面让我们来看下这个文件的部分示例内容。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 注册一个右键菜单选项
chrome.runtime.onInstalled.addListener(function () {
    chrome.contextMenus.create({
        'id': 'F577D6742FF1A1AB5946A8E5281D5C5D',
        'title': '添加到表情收藏',
        'contexts': ['image']
    });
});

chrome.contextMenus.onClicked.addListener(function (info, tab) {
    var src = info['srcUrl'];
    // 获取之前存储的表情
    chrome.storage.local.get(['newFavorList'], function (items) {
        var newFavorList = items['newFavorList'] || [];
        newFavorList.push(src);
        
        // 存储所有表情
        chrome.storage.local.set({
            'newFavorList': newFavorList
        });
    });
});

通过上面的例子,我们可以实现我们的目标:当用户在任意网页上面右键一张图片时,右键菜单中都会增加一个选项——添加到表情收藏。点击这个选项,我们就能够将这张图片存储到我们的扩展应用提供的存储模块中。

其中,runtimecontextMenus是chrome提供的原生API,相关API接口可以见此处

具体效果如下:

发送保存的表情(Content Script)

当我们需要发送我们已经保存的表情时,我们就需要跟页面进行部分功能交互了。这个时候,我们需要使用到Content Script

当我们使用Content Script时,我们的执行上下文将会是整个页面。因此,我们可以使用JavaScript来操纵DOM节点,和页面原有的JavaScript进行交互。

下面,我们通过jQuery来页面注入表情面板,同时使用PostMessage来与原有页面进行数据通信。让我们来看下favor.js文件的部分示例代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
chrome.storage.local.get(['newFavorList'], (items) => {
    let favorBox = $('#favorbox');
    favorBox.empty();
    newFavorList = items.newFavorList;


    let emotionPanel = $('<div>', {
        class: 'smiley-emotion-panel'
    });

    newFavorList.forEach((element) => {
        if (element && element.url) {
            emotionPanel.append($('<span>', {
                class: 'icon icon-smiley-emotions',
                'click': postFavor
            }).append($('<img>', {
                'width': '100%',
                'height': '100%',
                src: element.url
            })));
        }
    });

    favorBox.append(emotionPanel);
});

function postFavor(e) {
    let src = event.target.getAttribute('src');
    
    window.postMessage({
        type: 'sendCustomEmotion',
        text: src
    }, '*');
}

通过上面的示例代码,我们可以知道:从Storage中将表情数据取出后,立即渲染到页面中。当渲染的表情被点击时,我们就通过PostMessage将数据按照约定的格式发送即可。

在具体项目中的使用如下图所示:

这样,我们就解决了在特定的网页与页面的代码进行交互的功能。接下来让我们来看下我们的“设置”页面应该怎么开发。

管理已有表情(Options)

通过Options,我们能够给chrome扩展应用开发一个“设置”页面。当我们指定options_page字段后,它的值就是我们的“设置”页面。

开发一个管理已有表情的options页面,其实就是一个带有特殊API接口的网页。我们仍然能够通过chrome对象来访问chrome提供的已经申请过权限的API接口。

首先,我们将我们存储在Storage中的图片表情数据渲染出来,然后提供相关的操作函数。options.js部分示例代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$scope.remove = function (obj) {
    var result = [];

    $scope.favors.forEach(function (element) {
        if (element.url !== obj.url) {
            result.push(element);
        }
    });
    $scope.favors = result;
    chrome.storage.local.set({
        'newFavorList': $scope.favors
    });
};

如果我们需要在“设置”页面删除后,Content Script页面立即响应应该怎么做呢?我们只需要在Content Script中增加Storage监听事件即可。具体代码示例如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
chrome.storage.onChanged.addListener((changes) => {
    let newFavorList = changes['newFavorList'];
    
    renderNewValue(newFavorList.newValue);
});

通过在OptionsContent Script增加相关代码,我们就能够完成管理已有表情的功能。具体展示效果如下:

总结

我们通过一个简单的表情插件的例子来快速的介绍了chrome扩展应用的各个模块的功能和开发方法。通过这篇文章大家应该知道了chrome扩展应用各个模块的作用和开发的方法。

如果大家想对chrome扩展应用有一个更加深入的了解,那么建议自己动手开发相关的功能。这样才能够对chrome扩展应用的相关逻辑有一个更加清楚的认识。

附录中提供了部分学习相关的文档,有兴趣的同学可以自行阅读。

附录

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-04-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
禁止Google Adsense撑破父类 避免破坏手机网页样式
最近挖的坑有点多,金库有点捉襟见肘。三年的腾讯云眼看也要到期了,本来打算是卖点硬件实现自给自足,因为懒的原因,好像并不是很成功,(只是多了一堆板子和趁手的工具)所以给网站加了点GoogleAds。 但在投放广告后发现,当访客使用手机访问时,Adsense自适应广告的宽度会展开为设备全宽。也就是说,广告宽度超过了父元素的宽度,就像下图所示:
怪兽
2022/12/15
4380
禁止Google Adsense撑破父类 避免破坏手机网页样式
验证码前端性能分析及优化实践
在越来越注重用户体验的趋势下,验证码作为一种自打诞生以来就被贴上“多余”标签的产品,更应该给用户提供良好的体验。本文以滑动验证码作为切入点,分析了验证码可能存在的性能问题,并通过资源合并、DOM操作优化和选择性内联打包等方式有效减少页面加载时间。同时本文总结了移动端组件化适配容易遇到的问题,并提供了规范化的解决方案。希望本文能给前端做性能优化的同学提供一些不一样的实践思路。
腾讯防水墙
2018/08/21
3.2K5
流量如何才能变现?实际测试谷歌广告联盟(Google Adsense)的广告效果以及如何优化相关代码
    CPC—英文全称CostPerClick;CostPerThousandClick-Through。CPC是一种点击付费广告,根据广告被点击的次数收费。如关键词广告一般采用这种定价模式,比较典型的有Google广告联盟和百度联盟。此类广告类型是目前大型广告联盟主推的合作方式,其展示的广告单价也随广告内容变化而改变。但此类广告也不太科学,广告虽然没被点击,但是却被浏览者实实在在的浏览了,广告价值已经产生,但却没有给我们网站主收入。
用户9127725
2022/08/08
3.3K0
流量如何才能变现?实际测试谷歌广告联盟(Google Adsense)的广告效果以及如何优化相关代码
小白站长怎么优化谷歌(AdSense)广告联盟
首先本文不是教你怎么获取广告费的,今天也不谈谷歌广告联盟是怎么申请的,如果需要后期我可以专门写一篇google广告联盟申请教程,其次我要优化的并不是收益而是怎么避免踩坑、怎么避免一些擦边广告,因为谷歌的自动广告很好用,一段代码就搞得定,但毕竟都是谷歌是国外的,有一些广告并不适用我们国内,所以我们就不能去投放,可能有些人可能会说我老生常谈,有很多人写过的文章怎么还是翻来覆去的写呢?是的现在随便百度有很多类似的文章,但是我写文章主要是为了记录,博客本意即使记录自己生活学习的碎碎念,谁能保证百度那些网站会一直存在呢,说跑题了,emmm。。。
李洋博客
2021/09/09
1.1K0
优化谷歌联盟广告JS加载缓慢问题,提高网站页面的加载速度
早上跟彧繎博主聊天,看到他博客有一篇优化谷歌联盟js优化的文章,因为谷歌在国内尴尬的局面,在网页加载js的时候可能会比较拖拉,然后他又给我了一篇关于优化谷歌联盟js的文章,然后看了下自己网站的加载速度,果然谷歌js加载的速度真的很慢,加速最慢的已经达到了6.19s,另外两个十秒+应该是图片资源,可以暂时忽略。虽说我的网站打开速度不是很快,但是不能这么拖拉啊,是该整顿整顿啦,网站还有百度联盟的广告,但是速度不至于这么拖拉,而且百度的也该下架了,基本没有什么收益,广告太局限了,这一点来说真的不如谷歌,如图,看看吧,就是着速度,嗖嗖地。。。
李洋博客
2022/04/01
3.8K0
优化谷歌联盟广告JS加载缓慢问题,提高网站页面的加载速度
应对冰桶算法的折腾再次领教了Adsense的强大!
百度最近的算法调整非常的频繁,特别是针对移动端的冰桶算法4.0的强势登场感觉影响更大,因为冰桶算法4.0主要是针对移动端广告位置、尺寸的,基本上可以理解为是打击移动端广告泛滥的,所有尺寸过大的以及对内容有遮挡的都会被降权,具体的大家可以看看图1、图2两张百度官方认为是标准正确的移动端广告范例来对比了解一下就明白了。
明月登楼的博客
2019/05/15
8710
应对冰桶算法的折腾再次领教了Adsense的强大!
开始着重体验 AdSense 的「链接广告」
细心的站长们可能发现明月的博客现在在文章标题下的广告位内容已经 PC 端和移动端都统一为谷歌 AdSense 的“链接广告”样式了,这样做的目的主要是为了提升广告跟内容的匹配度的,同时也根据用户特点专门选择的,毕竟明月的博客来访者几乎都是博客站长,对于图片、文字类广告的免疫度都很强悍,这势必会影响到点击率和浏览体验,所以最终明月还是感觉“链接广告”是最合适了。
明月登楼的博客
2019/05/15
8880
开始着重体验 AdSense 的「链接广告」
Hexo Next 接入 google AdSense 广告
个人网站 www.yanlongwang.net 已经运营近一年,每日的浏览量不断上升,现在维持在两位数,打算承接一点广告赚睡后收入,用来维持网站的日常运营,希望能覆盖网站的服务器和域名开销。
waylon
2020/02/18
4.2K0
Hexo Next 接入 google AdSense 广告
Google AD广告投放样式太乱怎么办 谷歌广告样式设定 Google adsense谷歌广告调整宽度
备忘:先记录下谷歌广告的地址: https://www.google.com/adsense/new/u/ 我们使用谷歌广告代码后,往往会占用屏幕满屏,特别我们移动端的时候,那么就与我们自己网站设置的样式格格不入了。我们需要让他在我们设置的样式div内部,不让他跑出去。
梦溪
2021/12/09
9890
记录一次谷歌广告导致网站js加载不全的问题
之前网站第一次访问,与pjax加载后js图标不显示的问题一直困扰我,昨天无意间把谷歌广告(GoogleAdsense)下面这段单元广告js删掉之后惊奇的发现网站正常了,于是就开整了。
浩瀚博客
2022/03/23
1.4K0
记录一次谷歌广告导致网站js加载不全的问题
Typecho 的 Handsome 主题下谷歌 AdSense 广告错位修正
最近明月在 Handsome 主题“文章页脚广告位”广告位投放了谷歌 AdSense 的“匹配内容”广告样式,这种广告样式的匹配度和对用户的吸引力以及延长访问者持续时间都让明月非常的喜欢,有兴趣了解的明月强烈建议大家看看谷歌官方的 简介 。可惜不知道为啥,在投放过程中发现了一个问题,那就是有时候会出现广告错位现象,主要表现就是广告超出了广告位的尺寸。
明月登楼
2018/08/28
8470
Typecho 的 Handsome 主题下谷歌 AdSense 广告错位修正
50道CSS基础面试题
23 0 0 50道CSS基础面试题 1 介绍一下标准的CSS的盒子模型?与低版本IE的盒子模型有什么不同的? 标准盒子模型:宽度=内容的宽度(content)+ border + padding + margin 低版本IE盒子模型:宽度=内容宽度(content+border+padding)+ margin 2 box-sizing属性? 用来控制元素的盒子模型的解析模式,默认为content-box context-box:W3C的标准盒子模型,设置元素的 height/width 属性
慕白
2018/07/06
1.5K0
BAT及各大互联网公司2014前端笔试面试题--Html,Css篇
  很多面试题是我自己面试BAT亲身经历碰到的。整理分享出来希望更多的前端er共同进步吧,不仅适用于求职者,对于巩固复习前端基础更是大有裨益。   而更多的题目是我一路以来收集的,也有往年的,答案不确
Sb_Coco
2018/05/28
9350
Bootstrap实用手册
Responsive Web Page,响应式网页/自适应网页,即一个页面既可以在 PC 浏览器中浏览,也可以在手机、平板中浏览,并且配合不同设备有不同的响应结果,响应式网页的特点:
越陌度阡
2020/11/26
6.2K0
前端框架与库 - Bootstrap响应式设计
在前端开发领域,Bootstrap无疑是最受欢迎的HTML、CSS和JS框架之一,它以其强大的组件库和响应式设计能力著称。响应式设计允许网页在不同设备和屏幕尺寸上都能提供优秀的用户体验。本文将深入探讨Bootstrap的响应式设计原理,常见问题,易错点以及如何避免它们,附带代码示例,帮助你更好地掌握Bootstrap的响应式特性。
Jimaks
2024/07/19
2770
HTML入门完全指南:从零开始构建你的第一个网页
每个网页都会有一个基本的结构标签(也称为骨架标签),页面内容也是在这些基本标签上写
IsLand1314
2025/03/08
5060
HTML入门完全指南:从零开始构建你的第一个网页
联系我们吧 - 12个联系我们表单和页面设计赏析和学习
设计网站时,关于我们页面和联系页面(contact us page)往往是必要页面之一。虽然只是一个简单的页面,但要真的能让用户有联系你的冲动还是很有挑战性。如果说,用户点击了联系页面,用户其实已经在尝试联系你了,这个时候,你需要提供的,不是花哨的设计,而是直观的联系方式,不阻碍用户尝试联系你的行为。但话又说回来,如果你有信心设计得美观,新颖,自然是最好,而且简洁也不意味着简单。今天我和大家分享12个联系我们表单和页面设计模板和例子,如果你喜欢,可以用在你的网页设计里哦。
奔跑的小鹿
2019/01/24
6.4K1
联系我们吧 - 12个联系我们表单和页面设计赏析和学习
简单编写小程序的 CSS 样式教程
我们在完成了小程序的内容编辑后,就需要对样式骨架进行调节与调优,才能写出最符合用户体验的样式内容。
金牌打杂仔
2022/01/05
2.1K0
前端HTML+CSS面试题汇总一[通俗易懂]
Quirks模式和Standards模式的区别: 首先,严格模式(又称标准模式,Standards模式)和混杂模式(Quirk模式)都是指浏览器的呈现模式,要与Doctype的两种风格区别开来(严格( strict )和过渡( transitional ),过渡 DOCTYPE 的目的是帮助开发人员从老版本迁移到新版本)。
全栈程序员站长
2022/09/02
6550
前端面试题归类-css
网页看着不方便,想要文档可以私聊我。要是有错别字和错误的地方,请各位大佬直接指出,谢谢啦!!
肥晨
2023/02/16
1.7K0
推荐阅读
相关推荐
禁止Google Adsense撑破父类 避免破坏手机网页样式
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验