跳转到主内容
新派编程网 - 新潮编程理念,全新技术课堂!

Chrome插件开发实战,教你从零打造高效Chrome扩展

目录 一、 项目准备:你的第一个 Chrome 插件 1. 插件基础结构 2. 创建项目目录 3. manifest.json (核心配置) 4. 制作图标 5. popup.html 与 popup.js (用户交互界面) 6. background.js (后台服务与 API 调用) 7. content.js (与网页内容交互 - 可选) 二、 加载与调试插件 三、 前端工程化实践 1. 使用打包工具 (Vite/Webpack) 2. TypeScript 支持 四、 API 深度调用与安全 五、 常见插件类型与进阶 六、总结

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。

Chrome 插件开发,本质上是利用 Web 技术(HTML, CSS, JavaScript) 在浏览器环境中运行的一套小程序。

它能让你定制浏览器行为、扩展网页功能、与外部 API 交互。

本指南将带你从零开始,创建一个具备前端工程化实践的 Chrome 插件,并深度调用 API。

一、 项目准备:你的第一个 Chrome 插件 1. 插件基础结构 一个最简单的 Chrome 插件包含以下核心文件:

manifest.json

:插件的“身份证”,描述插件名称、版本、权限、脚本等。

popup.html

:插件图标点击后弹出的窗口(可选)。

popup.js

:控制

popup.html

行为的 JavaScript。

content.js

:注入到目标网页执行的 JavaScript。

background.js

:后台服务脚本,处理持久性任务、事件监听。

2. 创建项目目录 在你喜欢的目录下创建一个新文件夹,例如

my-chrome-extension

。

3.

manifest.json

(核心配置) 创建

manifest.json

文件,这是插件的入口。

{ "manifest_version": 3, // 推荐使用 Manifest V3 "name": "My Awesome Extension", "version": "1.0", "description": "A simple example Chrome Extension.", "permissions": [ "activeTab", // 允许访问当前激活标签页 "scripting", // 允许注入 content scripts "storage",   // 允许使用 chrome.storage API "https://api.example.com/*" // 允许访问特定 API 域名 (必填!

否则无法跨域请求) ], "action": { "default_popup": "popup.html", // 点击插件图标时显示的文件 "default_icon": { "16": "images/icon16.png", // 16x16 像素图标 "48": "images/icon48.png", // 48x48 像素图标 "128": "images/icon128.png" // 128x128 像素图标 } }, "background": { "service_worker": "background.js" // 后台服务脚本 (Manifest V3 使用 Service Worker) }, "icons": { "16": "images/icon16.png", "48": "images/icon48.png", "128": "images/icon128.png" } } 4. 制作图标 在项目根目录下创建

images

文件夹,并放置

icon16.png

,

icon48.png

,

icon128.png

。

你可以用任何图片编辑工具生成。

5.

popup.html

与

popup.js

(用户交互界面) 创建

popup.html

:

My Extension

Hello from My Extension!

创建

popup.js

: document.addEventListener('DOMContentLoaded', function() { const fetchDataBtn = document.getElementById('fetchDataBtn'); const dataDisplay = document.getElementById('dataDisplay'); fetchDataBtn.addEventListener('click', async () => { dataDisplay.innerText = 'Loading...'; try { // 调用 background.js 中的方法来获取数据,直接在 popup.js 中调用 chrome.runtime.sendMessage() // 涉及到跨域API请求,最好在 background.js 中处理,避免 CSP (Content Security Policy) 问题 const response = await chrome.runtime.sendMessage({ action: "fetchApiData" }); if (response.success) { dataDisplay.innerText = JSON.stringify(response.data, null, 2); } else { dataDisplay.innerText = `Error: ${response.error}`; } } catch (error) { dataDisplay.innerText = `Error sending message: ${error}`; } }); }); 6.

background.js

(后台服务与 API 调用) 创建

background.js

: // background.js // 监听来自 popup.js 或 content.js 的消息 chrome.runtime.onMessage.addListener( function(request, sender, sendResponse) { if (request.action === "fetchApiData") { fetchDataFromApi().then(data => { sendResponse({ success: true, data: data }); }).catch(error => { sendResponse({ success: false, error: error.message }); }); return true; // 表示将异步发送响应 } // 可以添加其他 action 的处理 } ); async function fetchDataFromApi() { const apiUrl = 'https://jsonplaceholder.typicode.com/todos/1'; // 示例 API const response = await fetch(apiUrl, { method: 'GET', headers: { 'Content-Type': 'application/json', // 如果 API 需要认证,在这里添加 Authorization header // 'Authorization': 'Bearer YOUR_API_KEY' } }); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } return await response.json(); } 重要 :

manifest.json

中的

permissions

必须包含你请求的 API 域名,否则

fetch

会报 CORS 错误。

7.

content.js

(与网页内容交互 - 可选) 如果你想操作当前网页的内容,可以创建

content.js

。

在

manifest.json

中需要配置

content_scripts

: // ... manifest.json ... "content_scripts": [ { "matches": [""], // 作用于所有网页 "js": ["content.js"] } ], // ...

content.js

示例: console.log("Content script injected!"); // 示例:修改网页标题 // document.title = "Modified by My Extension"; // 示例:通过 message passing 与 background.js 交互 chrome.runtime.onMessage.addListener( function(request, sender, sendResponse) { if (request.action === "getPageTitle") { sendResponse({ title: document.title }); } } );

二、 加载与调试插件 打开 Chrome 扩展程序页面 : 在 Chrome 地址栏输入

chrome://extensions/

并回车。

启用开发者模式 : 在页面右上角,打开“开发者模式”开关。

加载已解压的扩展程序 : 点击左上角的“加载已解压的扩展程序”按钮。

选择你创建的插件项目根目录(例如

my-chrome-extension

)。

你的插件会出现在扩展程序列表中。

调试 : Popup 调试 :在插件图标上右键,选择“检查 popup”。

会打开一个类似 DevTools 的界面,可以调试

popup.js

。

Background 调试 :在

chrome://extensions/

页面,找到你的插件,点击“Service worker”的链接。

会打开一个 DevTools 界面,可以调试

background.js

。

Content Script 调试 :在目标网页中打开 DevTools,切换到 Console 或 Sources 标签页,可以看到

content.js

的输出和进行调试。

三、 前端工程化实践 当插件变得复杂,静态文件直接管理会混乱。

1. 使用打包工具 (Vite/Webpack) 安装 : cd my-chrome-extension npm init -y npm install vite --save-dev npm install @vitejs/plugin-legacy --save-dev # 可选,用于兼容老版本浏览器 配置vite.config.js : import { defineConfig } from 'vite'; import legacy from '@vitejs/plugin-legacy'; export default defineConfig({ plugins: [ legacy({ // 兼容性配置 targets: ['defaults', 'not IE 11'] }), // Vite 默认会生成 index.html,但 Chrome 插件是 manifest.json 作为入口 // 需要特殊处理,或者将 popup.html 作为 Vite 的入口 ], build: { // 打包输出到插件根目录,并保持原有的 manifest.json outDir: 'dist', // 打包输出目录 rollupOptions: { input: { // 定义入口文件 popup: 'popup.html', // popup.js 会自动引入 // background: 'background.js' // background.js 作为 service worker 不需要在这里单独入口 }, output: { assetFileNames: 'assets/[name].[hash][extname]', // 资源文件输出命名 entryFileNames: '[name].js' // 入口文件输出命名 } }, emptyOutDir: true, // 清空输出目录 }, // 如果你的 manifest.json 引用了 .js 文件,直接放在根目录即可,Vite 会处理 // 如果 manifest.json 放在 dist 目录,需要调整 manifest.json 中的路径 // 最佳实践:manifest.json 保持在根目录,打包后手动复制到 dist }); 调整manifest.json : 将

popup.html

指向打包后的文件(如

dist/popup.html

)。

background.js

通常也不需要 Vite 处理,直接放在根目录。

运行构建 : npm run build 这会在

dist

文件夹生成打包后的文件。

加载插件 :在

chrome://extensions/

页面,加载

dist

文件夹。

2. TypeScript 支持 安装 : npm install typescript --save-dev npm install @types/chrome --save-dev # Chrome API 类型定义 创建.ts文件 :将

popup.js

,

background.js

,

content.js

重命名为

.ts

。

配置tsconfig.json : { "compilerOptions": { "target": "ES2020", // 现代 JS 目标 "module": "ESNext", "moduleResolution": "node", "strict": true, "esModuleInterop": true, "skipLibCheck": true, "forceConsistentCasingInFileNames": true, "outDir": "dist", // TS 文件编译输出到 dist "lib": ["ES2020", "DOM", "WebWorker"], "types": ["chrome", "node"] // 包含 chrome 类型 }, "include": ["src/**/*"], // TS 源文件目录 "exclude": ["node_modules", "dist"] // 排除目录 } 修改 Vite 配置 : 安装

@vitejs/plugin-vue

或

@vitejs/plugin-react

(如果你使用 Vue/React)。

调整

vite.config.js

,指向

src

目录作为入口。

四、 API 深度调用与安全 跨域请求(CORS) :

manifest.json

的

permissions

中必须声明允许访问的 API 域名。

"https://api.example.com/*"

这种声明是强制的。

如果你要访问chrome://内的 API,是不允许的。

用户数据敏感性 : 如果 API 调用涉及到用户敏感信息(如用户 ID、个人配置), 切勿直接在content.js中进行 。

最佳实践 :所有敏感 API 调用都应放在

background.js

中。

content.js

负责收集网页信息,通过

chrome.runtime.sendMessage

发送给

background.js

,由

background.js

处理 API 请求,然后将结果

sendResponse

回去。

API 密钥管理 : 绝不硬编码 :将 API Key 硬编码在插件的 JavaScript 文件中是极其危险的,用户可以轻易地在插件源码中看到。

推荐策略 : 用户设置页面 :为插件创建一个

options.html

(在

manifest.json

中配置

options_page

)。

让用户在插件的设置页面输入 API Key,然后通过

chrome.storage.sync

或

chrome.storage.local

保存。

背景脚本获取 :

background.js

在需要时从

chrome.storage

读取 API Key。

错误处理与用户反馈 : API 请求失败时,要给用户清晰的反馈(例如在 popup 中显示错误信息)。

使用

try...catch

块处理

fetch

错误,并向用户说明原因。

五、 常见插件类型与进阶 数据抓取类 :

content.js

负责从网页 DOM 中提取数据,

background.js

负责将数据发送到后端 API。

网页增强类 :

content.js

动态修改页面样式或内容,

background.js

负责监听某些事件(如标签页切换、书签更新)。

快速访问类 :

popup.html

提供快捷链接、搜索框,

popup.js

通过

chrome.tabs.create

或

chrome.runtime.sendMessage

与后台交互。

六、总结 Chrome 插件开发是一个融合了前端工程化与浏览器 API 调用的过程。

Manifest V3 是趋势 ,学习它的生命周期和权限管理。

API 调用放在 background.js ,并优先使用

chrome.storage

管理敏感信息。

拥抱前端工程化工具(Vite/TypeScript) ,让你的插件开发更高效、更健壮。

永远要考虑用户体验和安全 ,尤其是 API Key 的管理。

通过以上步骤,你已经构建了一个具备基本 API 调用能力、支持前端工程化的 Chrome 插件。

从这里开始,你可以探索更多浏览器 API,实现更丰富的功能!

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。

相关文章