Chrome 插件开发和数据迁移教程
1. 项目结构
PMCA/
├── manifest.json # 插件配置文件
├── manifest.base.json # 基础配置文件
├── webpack.config.js # webpack构建配置
├── package.json # npm包配置
├── popup.html # 弹出窗口HTML
├── options.html # 选项页面HTML
├── src/ # 源代码目录
│ ├── popup/ # 弹出窗口相关代码
│ │ ├── service/ # 服务层代码
│ │ ├── view/ # 视图层代码
│ │ ├── util/ # 工具函数
│ │ ├── script/ # 脚本文件
│ │ │ ├── leetcode.js # LeetCode国际版脚本
│ │ │ └── leetcodecn.js # LeetCode中国版脚本
│ │ └── options.js # 选项页面脚本
│ └── autoReset.js # 内容脚本
├── dist/ # 构建输出目录
├── assets/ # 静态资源(图标等)
├── lib/ # 第三方库
└── deploy/ # 部署相关脚本
├── generate-manifest.js # 生成manifest.json的脚本
├── zip.js # 打包扩展的脚本
├── unzip.js # 解压扩展的脚本
└── clear.js # 清理脚本
2. 开发环境设置
2.1 安装依赖
首先确保你已安装Node.js和npm,然后运行:
# 安装项目依赖
npm install
2.2 构建项目
# 开发环境构建
npm run build
# 生成manifest.json文件
npm run manifest:dev # 开发环境
npm run manifest:prod # 生产环境
2.3 生成发布版本
# 生成用于Chrome商店的zip包
npm run release:prod # 会在根目录生成pmca.zip
# 清理构建文件
npm run clear
3. 添加新功能的步骤
3.1 修改 manifest.json 或 manifest.base.json
manifest.json 是插件的配置文件,定义了插件的各种属性和权限。在PMCA项目中,我们使用manifest.base.json作为基础文件,然后通过脚本生成最终的manifest.json。
- 基本结构
{
"manifest_version": 3, // 固定值,表 示使用 Manifest V3
"name": "PMCA", // 插件名称
"version": "0.9.9", // 插件版本
"description": "...", // 插件描述
"author": "...", // 作者信息
"homepage_url": "...", // 主页URL
"permissions": [...], // 权限列表
"host_permissions": [...], // 主机权限
"content_scripts": [...], // 内容脚本配置
"action": {...}, // 插件图标点击行为
"options_ui": {...}, // 选项页面配置
"icons": {...}, // 图标配置
"background": {} // 背景脚本配置
}
- 添加权限
{
"permissions": [
"storage", // 允许使用存储功能
"unlimitedStorage" // 允许使用无限存储
],
"host_permissions": [
"https://leetcode.com/*", // 允许访问 LeetCode 网站
"https://leetcode.cn/*" // 允许访问 LeetCode 中国网站
]
}
- 添加内容脚本
{
"content_scripts": [
{
"matches": [ // 匹配的网页 URL 模式
"https://leetcode.com/*" // 在所有 LeetCode 页面运行
],
"js": [ // 要注入的 JavaScript 文件
"dist/leetcode.js", // LeetCode专用脚本
"dist/autoReset.js" // 通用脚本
],
"run_at": "document_idle" // 在页面加载完成后运行
},
{
"matches": [
"https://leetcode.cn/*" // 在所有 LeetCode 中国页面运行
],
"js": [
"dist/leetcodecn.js", // LeetCode中国专用脚本
"dist/autoReset.js" // 通用脚本
],
"run_at": "document_idle"
}
]
}
- 配置弹出窗口和选项页
{
"action": {
"default_icon": "assets/logo.png", // 工具栏图标
"default_popup": "popup.html" // 点击图标显示的弹出页面
},
"options_ui": {
"page": "options.html", // 选项页面
"open_in_tab": false // 是否在新标签页中打开
}
}
3.2 修改 webpack.config.js
webpack.config.js 是构建配置文件,定义了如何将源代码编译成最终的文件。
- 基本结构
module.exports = {
entry: { ... }, // 入口文件配置
output: { ... }, // 输出配置
module: { ... }, // 模块处理规则
mode: 'production' // 构建模式
}
- 添加新的入口文件
module.exports = {
entry: {
// 现有的入口
popup: './src/popup/popup.js', // 弹出窗口脚本
options: './src/popup/options.js', // 选项页面脚本
leetcode: './src/popup/script/leetcode.js', // LeetCode 脚本
leetcodecn: './src/popup/script/leetcodecn.js',// LeetCode 中国脚本
// 添加新功能的入口
autoReset: './src/autoReset.js' // 新添加的自动重置脚本
},
output: {
filename: '[name].js', // 输出文件名,[name]会被替换为entry中的键名
path: path.resolve(__dirname, 'dist') // 输出目录
}
}
- 添加样式处理规则
如果你的项目使用CSS:
module.exports = {
// ...前面的配置
module: {
rules: [
{
test: /\.css$/,
use: ['style-loader', 'css-loader']
}
]
}
}
- 注意事项
- 路径要使用正确的相对路径(以项目根目录为基准)
- 文件名要完全匹配,区分大小写
- 添加新入口后要重新运行
npm run build - 确保
dist目录中生成了新的文件 - 如果报错,检查路径是否正确、依赖是否安装
3.3 添加新的源代码文件
- 创建文件
- 确定功能应该放在哪个目录(如服务层、视图层等)
- 在适当的目录下创建新文件
- 例如:在
src/下创建autoReset.js
- 编写代码
基本模板:
// 引入所需依赖
import { ... } from './path/to/module';
// 定义常量
const CONSTANTS = {
// ...
};
// 主要功能函数
function mainFunction() {
// 实现功能
}
// 初始化函数
function initialize() {
// 绑定事件监听器
document.addEventListener('DOMContentLoaded', () => {
// 处理DOM加载完成后的逻辑
});
// 可能的消息监听
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
// 处理消息
});
}
// 立即执行函数
(function() {
initialize();
})();
- 访问Chrome API
// 存储数据
chrome.storage.local.set({key: value}, function() {
console.log('数据已保存');
});
// 获取数据
chrome.storage.local.get(['key'], function(result) {
console.log('Value currently is ' + result.key);
});
- 与网页内容交互
// 选择元素
const element = document.querySelector('.selector');
// 监听事件
element.addEventListener('click', function() {
// 处理点击事件
});
// 修改页面内容
element.textContent = '新内容';
3.4 重新构建项目
在项目根目录下运行:
# 重新构建项目
npm run build
# 如果需要生成新的manifest.json
npm run manifest:dev # 开发环境
4. 在 Chrome 中加载修改后的插件
4.1 准备工作
- 确保 manifest.json 存在
- 如果只有 manifest.base.json,需要生成manifest.json:
npm run manifest:dev
- 确保已构建项目
npm run build