【SSD系列】五分钟,不,三分钟,实现一个颜色拾取器chrome插件

前言

在 之前 不知道,但是可能超有用的 Web API 提到了 EyeDropper 拾色器,并提到 基于此做个取色插件,是不是分分钟就搞定呢?

答案就是: 分分钟搞定。

此外,欢迎关注 前端SSD系列 专栏。

一些有意思的前端内容,旨在3-10分钟里,有所获,又不为所累。

插件效果

直接先看效果。不仅仅可以取色浏览器本身,浏览器外也不在话下。

动手, 三分钟足以。

选择项目模板

选择一个合适的模板,比如

本文就以 chrome-extension-boilerplate-react-vite 为基础开发。

打开项目,主要需要改动的地方就是pages和配置 manifest.js, 既然说到这里了,就得简单了解一下这些pages下文件夹 和 chrome插件功能的对应关系

名字 功能/作用范围
background 后台 偷偷 运行的代码
content 打开满足条件标签页 页面的可运行的代码
devtools 打开开发者工具后的对应的tab
panel 打开开发者工具后的对应的tab下的内容
newtab 打开标签页
options 插件的配置
popup 点击插件后的弹框
sidepanel 侧边栏

每个块都还比较容易理解,今天的插件涉及的是 popup部分,简单介绍一下

popup 点击 标注1 对应的插件图标后, 标注2 就是 popup的区域。

sidepanel

这算是比较新的一个能力了,简单介绍一下。 点击如下图的标注 1, 在标注2处可以选择相应的功能。 真个红色区域就是 side panel。

实现

更改 src\pages\popup\Popup.tsx 代码如下:

ts 复制代码
import '@pages/popup/Popup.css';
import withErrorBoundary from '@src/shared/hoc/withErrorBoundary';
import withSuspense from '@src/shared/hoc/withSuspense';
import { useState } from 'react';

const Popup = () => {
  const [backgroundColor, setBackgroundColor] = useState('');

  const onToPickColor = () => {
    if (!('EyeDropper' in window)) {
      alert("你的浏览器不支持 EyeDropper API");
      return;
    }
    // @ts-ignore
    const eyeDropper = new EyeDropper();
    const abortController = new AbortController();

    eyeDropper
      .open({ signal: abortController.signal })
      .then((result) => {
        setBackgroundColor(result.sRGBHex);
      })
      .catch((err: Error) => {
        alert(`发生错误:${err && err.message || '未知错误'}`)
      });
  }

  return (
    <div className='App'>
      <button className="start-button" onClick={onToPickColor}>打开拾色器</button>
      <div>
        颜色是:<span id="result">{backgroundColor}</span>
      </div>
      <div className='color-rect' style={{
        backgroundColor
      }}></div>
    </div>
  );
};

export default withErrorBoundary(withSuspense(Popup, <div> Loading ... </div>), <div> Error Occur </div>);

本地部署

  1. pnpm install
  2. npm run build
  3. chrome 浏览器输入 chrome://extensions/
  4. 加载已加压的扩展正序,选择项目里面的 dist 目录

小结

是不是很简单,一切都看起来没那么难,三分钟是不是都多了。

写在最后

不忘初衷,有所得,而不为所累,如果你觉得不错,你的一赞一评就是我前行的最大动力。

微信公众号:成长的程序世界 ,关注之后,海量电子书,打包拿走不送。

或者添加我的微信 dirge-cloud,一起学习。

引用

chrome-extensions-samples

相关推荐
卷帘依旧20 分钟前
JavaScript 闭包经典问题:为什么输出 10 次 i=10
javascript
柳杉38 分钟前
Three.js × Blender:从建模到 Web 3D 的完整工作流深度解析
前端·javascript·数据可视化
reembarkation2 小时前
vue3中使用howler播放音频列表
前端·vue.js·音视频
手握风云-2 小时前
基于 Java 的网页聊天室(三)
服务器·前端·数据库
weixin199701080162 小时前
《识货商品详情页前端性能优化实战》
前端·性能优化
Forever7_2 小时前
重磅!Vue3 手势工具正式发布!免费使用!
前端·前端框架·前端工程化
用户806138166592 小时前
发布为一个 npm 包
前端·javascript
树上有只程序猿2 小时前
低代码何时能出个“秦始皇”一统天下?我是真学不动啦!
前端·后端·低代码
TT_哲哲2 小时前
小程序双模式(文件 / 照片)上传组件封装与解析
前端·javascript
菜果果儿3 小时前
Vue 3 + TypeScript 常用代码示例总结
前端