引言
在日常阅读中,我们经常会遇到喜欢的小说想要下载保存的需求。本文将分享如何使用Vue 3 + Vite开发一款功能完整的浏览器扩展——番茄小说下载器,包含验证码解锁、下载限额管理、历史记录等核心功能。
项目概述
功能特性
- 📚 支持通过书籍ID快速下载小说章节
- ⚠️ 分级下载限额(默认1本/天,解锁后5本/天)
- 🔐 验证码解锁机制(有效期7天)
- 📝 内置下载历史记录
- 🎨 简洁美观的UI设计
- 🚀 高效的批量下载算法
技术栈
- 前端框架:Vue 3 + Composition API
- UI库:Element Plus
- 构建工具:Vite
- 数据存储:localStorage
- 网络请求:Fetch API
- 扩展类型:Chrome Extension (Manifest V3)
核心功能实现
1. 扩展基础架构
使用Vite构建Chrome扩展需要特殊配置,主要包括:
// package.json
{
"type": "module",
"scripts": {
"dev": "vite",
"build": "rimraf dist && vite build"
}
}
<!-- index.html -->
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>番茄小说下载器</title>
</head>
<body>
<div id="app"></div>
<script type="module" src="/src/main.js"></script>
</body>
</html>
2. 下载限额系统设计
实现了分级下载限额机制,通过localStorage持久化存储:
// 配置常量
const DEFAULT_DAILY_LIMIT = 1
const UNLOCKED_DAILY_LIMIT = 5
const STORAGE_KEY = 'fanqie_daily_limit'
const UNLOCK_STATUS_KEY = 'fanqie_unlock_status'
// 检查解锁状态
const checkUnlockStatus = () => {
const unlockData = JSON.parse(localStorage.getItem(UNLOCK_STATUS_KEY) || '{}')
if (unlockData.unlocked && unlockData.expiry) {
const now = new Date().getTime()
const expiry = new Date(unlockData.expiry).getTime()
if (now < expiry) {
isUnlocked.value = true
} else {
resetUnlockStatus()
}
}
}
// 检查下载限额
const checkQuota = () => {
const todayStr = new Date().toLocaleDateString()
const record = JSON.parse(localStorage.getItem(STORAGE_KEY) || '{}')
if (record.date !== todayStr) {
todayCount.value = 0
localStorage.setItem(STORAGE_KEY, JSON.stringify({ date: todayStr, count: 0 }))
return true
}
const currentLimit = isUnlocked.value ? UNLOCKED_DAILY_LIMIT : DEFAULT_DAILY_LIMIT
return record.count < currentLimit
}
3. 验证码解锁机制
实现了基于前端验证码库的解锁功能,具有7天有效期:
// 验证码验证
const verifyCode = () => {
if (!form.verificationCode) {
return ElMessage.warning('请输入验证码')
}
const code = form.verificationCode.trim().toUpperCase()
if (VERIFICATION_CODES.includes(code)) {
const expiryDate = new Date()
expiryDate.setDate(expiryDate.getDate() + 7) // 有效期7天
localStorage.setItem(UNLOCK_STATUS_KEY, JSON.stringify({
unlocked: true,
expiry: expiryDate.toISOString()
}))
ElMessage.success('🎉 验证码验证成功!已解锁每日5本下载限额')
} else {
ElMessage.error('❌ 验证码错误,请检查后重试')
}
}
4. 高效批量下载算法
采用批量请求+异步处理的方式,提高下载效率:
const startDownload = async () => {
if (!checkQuota()) {
return ElMessageBox.alert('今日下载次数已达上限')
}
downloading.value = true
let contentBuffer = []
let start = form.startChapter
try {
// 批量下载逻辑
while (start <= form.endChapter) {
const batchSize = 30
const chapters = []
for (let i = 0; i < batchSize && (start + i) <= form.endChapter; i++) {
chapters.push(start + i)
}
const batchStr = chapters.join(',')
const chaptersData = await fetchChapters(batchStr)
if (chaptersData && chaptersData.length > 0) {
processBatchContent(chaptersData, contentBuffer)
}
start += batchSize
await new Promise(r => setTimeout(r, 300)) // 避免请求过快
}
// 保存文件
if (contentBuffer.length > 0) {
saveFile(contentBuffer)
incrementQuota()
ElMessage.success(`下载完成!共 ${contentBuffer.length} 章`)
}
} catch (e) {
ElMessage.error('下载出错: ' + e.message)
} finally {
downloading.value = false
}
}
开发过程中的问题与解决方案
1. 扩展打包体积优化
问题:构建后的扩展体积较大,影响加载速度
解决方案:
- 配置Vite的代码分割
- 使用Tree Shaking移除未使用的代码
- 优化依赖引入,只导入必要的组件
- 压缩静态资源
2. 跨域请求处理
问题:扩展需要访问外部API,遇到跨域限制
解决方案:
- 在manifest.json中配置host_permissions
- 使用Chrome扩展的background script代理请求
- 配置正确的CORS头
3. 版本号规范问题
问题:Edge扩展商店对版本号格式有严格要求(非零整数不能以0开头)
解决方案:
- 采用
年份.月份.日期.版本号格式,如26.1.16.1 - 避免使用0开头的月份和日期数字
- 构建脚本中自动生成符合规范的版本号
项目构建与部署
1. 自动化构建流程
配置了完整的自动化构建脚本:
"scripts": {
"build": "rimraf dist && vite build && node scripts/zip-build.js"
}
2. 扩展打包与发布
- 构建生成dist目录
- 自动压缩为zip文件
- 提交到Chrome Web Store和Microsoft Edge Add-ons
- 完善的发布说明和截图
总结与展望
通过开发番茄小说下载器,我们掌握了:
- Chrome扩展开发的完整流程
- Vue 3 Composition API的实战应用
- 前端状态管理与持久化
- 异步编程与性能优化
- 扩展商店发布规范
未来可以考虑的功能扩展:
- 📱 支持移动端适配
- 🔄 自动更新小说章节
- 📊 统计分析功能
- 🔒 更安全的验证码机制
- 🌐 支持更多小说平台
应用商店扩展直链地址
写在最后
开发Chrome扩展是一个很好的学习机会,它涉及到前端开发、浏览器API、网络请求等多个方面。希望本文的实践经验能对你有所帮助,欢迎在评论区交流讨论!
关键词:Chrome扩展开发、Vue 3、Vite、番茄小说下载器、验证码解锁、下载限额管理、浏览器插件开发
阅读建议:适合有一定前端基础,想要学习Chrome扩展开发的开发者阅读。文中包含了完整的代码示例和技术实现思路,可以作为实际开发的参考。