新闻详情

新闻详情

首页 / 资讯中心 / 详情

浏览器插件技术-wxt

发布时间:2026/9/30 6:45:32来源:尧图网络
浏览器插件技术-wxt
一、技术选型维度最终选择核心理由扩展框架WXT基于 Vite热更新快对 Vue 3 中立友好维护活跃不像 Plasmo 已进入维护模式Manifest 版本V3Chrome 强制推行V2 已彻底淘汰没有选择余地前端框架Vue 3你的技术栈偏好WXT 官方支持UI 组件库Element Plus静态 CSS 分发Shadow DOM 适配成本比 Ant Design Vue 低维护状态更健康抓取方式Content Script 读 DOM Main World Hook如需MV3 下阻塞式 webRequest 已不可用页面内 Hook 是主流替代方案测试Vitest单元 PlaywrightE2EWXT 官方对两者均有一等支持二、整体架构博客页面你的网站 │ │ 派发 Custom DOM Event 或 window.postMessage ▼ Content Script注入到博客页面 │ │ runtime.sendMessage ▼ Background Service WorkerWXT 后台 │ ├──► CSDN API发布 ├──► 掘金 API发布 └──► chrome.storage凭证/状态核心思路博客页面负责“选中文章”WXT 插件负责“同步到其他平台”。网页不直接调用各平台 API所有发布逻辑收敛在扩展后台凭证不暴露给网页。三、网页与扩展通信的两种方案方案一externally_connectableWXT 配置// wxt.config.ts import { defineConfig } from wxt; export default defineConfig({ modules: [wxt-dev/module-vue], manifest: { externally_connectable: { matches: [ http://localhost:5173/*, http://127.0.0.1:5173/*, ], }, permissions: [storage], }, });扩展后台监听// entrypoints/background.ts export default defineBackground(() { browser.runtime.onMessageExternal.addListener( (message, sender, sendResponse) { const allowedOrigins [ http://localhost:5173, http://127.0.0.1:5173, ]; if (!sender.origin || !allowedOrigins.includes(sender.origin)) { sendResponse({ success: false, error: 未授权的来源 }); return true; } if (message.action sync-article) { console.log(收到文章:, message.article.title); browser.storage.local.set({ lastSyncedArticle: message.article, }); sendResponse({ success: true, message: 已接收 }); } return true; } ); });博客页面发送// 你的博客网站代码 const EXTENSION_ID 你的扩展ID; // 从 chrome://extensions 获取 function syncArticle(article) { if (!window.chrome?.runtime?.sendMessage) { alert(请先安装同步插件); return; } chrome.runtime.sendMessage( EXTENSION_ID, { action: sync-article, article }, (response) { if (chrome.runtime.lastError) { console.error(通信失败:, chrome.runtime.lastError.message); return; } console.log(同步结果:, response); } ); } // 用户点击“同步”按钮时调用 syncArticle({ title: 我的文章标题, content: # 正文内容..., tags: [技术, 前端], });特点网页直接调用扩展 API代码简洁但需要知道扩展 ID且Firefox 不支持。方案二桥接方式DOM 事件WXT 配置// wxt.config.ts import { defineConfig } from wxt; export default defineConfig({ modules: [wxt-dev/module-vue], manifest: { host_permissions: [ http://localhost:5173/*, http://127.0.0.1:5173/*, ], permissions: [storage], }, });内容脚本注入博客页面// entrypoints/content/index.ts export default defineContentScript({ matches: [ http://localhost:5173/*, http://127.0.0.1:5173/*, ], main() { document.addEventListener(BLOG_SYNC_ARTICLE, (event: Event) { const customEvent event as CustomEvent; const article customEvent.detail; if (!article?.title || !article?.content) { console.warn(文章数据格式不正确); return; } browser.runtime.sendMessage({ action: sync-article, article, }); }); }, });扩展后台接收// entrypoints/background.ts export default defineBackground(() { browser.runtime.onMessage.addListener((message, sender, sendResponse) { if (message.action sync-article) { console.log(收到文章:, message.article.title); browser.storage.local.set({ lastSyncedArticle: message.article, }); sendResponse({ success: true, message: 已接收 }); } return true; }); });博客页面派发事件// 你的博客网站代码 —— 不依赖任何 chrome.* API function syncArticle(article) { const event new CustomEvent(BLOG_SYNC_ARTICLE, { detail: article, }); document.dispatchEvent(event); } // 用户点击“同步”按钮时调用 syncArticle({ title: 我的文章标题, content: # 正文内容..., tags: [技术, 前端], });特点网页代码完全不依赖chrome.*APIFirefox 也能用但需要扩展注入内容脚本到你的博客页面。两种方案对比externally_connectable桥接方式DOM 事件Firefox 支持❌ 不支持✅ 支持需要扩展 ID需要不需要网页代码依赖chrome.runtime.sendMessage纯 DOM 事件无扩展 API前提条件扩展已安装且域名在matches中扩展的内容脚本已注入博客页面安全性由matches限制域名内容脚本需自行校验数据格式响应机制支持回调可拿到扩展返回值单向事件如需响应可再派发反向事件建议如果你的博客希望覆盖 Firefox 用户或者不想在网页代码里硬编码扩展 ID桥接方式是更稳妥的选择。它把“扩展相关”的逻辑完全收敛在内容脚本里网页端只负责派发一个标准 DOM 事件耦合度最低。四、关键避坑点扩展 ID 不是项目名它是 Chrome 基于密钥生成的独立字符串。开发时路径一变 ID 就变建议尽早用manifest.key固定。Shadow DOM 样式隔离Element Plus 的:rootCSS 变量不会自动进入 Shadow DOM需要替换为:host或使用cssInjectionMode: ui。MV3 网络拦截限制无法实时修改请求爬虫/同步逻辑要转向“页面内 Hook”或“声明式规则”思路。凭证安全CSDN/掘金的登录凭证应存在扩展的storage中由后台 Service Worker 调用 API不要暴露给网页。测试策略纯函数提取逻辑用 Vitest 快速验证完整流程用 Playwright 的持久化上下文跑通。五、项目结构参考blog-sync-extension/ ├── entrypoints/ │ ├── content/ # 注入博客页面监听事件并转发 │ ├── background.ts # 接收文章调用各平台 API │ └── popup/ # 配置凭证、查看同步状态 ├── components/ # Vue 组件自动导入 ├── composables/ # 组合式函数 ├── utils/ # 消息/存储封装 ├── wxt.config.ts # manifest、权限、externally_connectable └── package.json
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

智能体架构设计与实操:从规划、记忆到工具调用的完整搭建指南 2026/9/30 9:36:46

智能体架构设计与实操:从规划、记忆到工具调用的完整搭建指南

1. 智能体这波浪潮到底走到哪了过去一年我几乎把周末都砸在了智能体相关的论文和开源项目上,从最早的 ReAct 那套“想一步做一步”的范式,到后来各种多智能体协作框架,再到最近一批把训练方法公开出来的工作,整个领域的变化速度说…

阅读更多 →
SSD+MobileNet+KCF:地铁客流检测复现全指南 2026/9/30 9:36:46

SSD+MobileNet+KCF:地铁客流检测复现全指南

简介:基于深度学习的地铁客流实时监测PDF文档,面向轨道交通运营管理人员、智能交通从业者及深度学习目标检测方向的研究人员,针对传统人工统计、红外感应、三辊闸等客流监测方式精度低、影响通行等问题,提出以SSD算法为核心、Mobi…

阅读更多 →
ArmorPaint:开源免费的PBR贴图绘制工具,实时引擎预览与Blender工作流 2026/9/30 9:36:46

ArmorPaint:开源免费的PBR贴图绘制工具,实时引擎预览与Blender工作流

做游戏美术或者3D内容创作的朋友,应该都经历过这个场景:模型在Blender里建的没问题,UV也拆完了,接下来该画材质贴图了。打开商业贴图软件,功能确实强,但价格和授权对独立开发者来说有点劝退;用B…

阅读更多 →
浏览器端深度学习推理实战:TensorFlow.js多后端调度与生产避坑指南 2026/9/30 9:36:46

浏览器端深度学习推理实战:TensorFlow.js多后端调度与生产避坑指南

浏览器里跑深度学习这件事,我从三年前开始断断续续折腾,踩过的坑比跑通的模型多得多。最开始我以为把 Python 训练好的模型导出,前端加载一下就能推理,结果第一版在手机上直接卡成幻灯片,页面主线程被占满,…

阅读更多 →
校园网网络系统集成课程设计:三层架构与VLAN/ACL配置详解 2026/9/30 9:36:46

校园网网络系统集成课程设计:三层架构与VLAN/ACL配置详解

简介:这是一份面向计算机网络相关专业学生的《网络系统集成课程设计报告书》Word文档,以某高校校园网为实际场景,完整呈现从需求分析、网络拓扑规划到设备选型的全过程。内容涵盖学校网络现状调研、建设目标设定、千兆主干设计、VLAN划分与三…

阅读更多 →
多模态生成新突破:少样本场景理解与动画空间重构实战 2026/9/30 9:36:39

多模态生成新突破:少样本场景理解与动画空间重构实战

最近一直在折腾多模态生成模型,手头这个 Seed-2.1-pro 的测试版本,刚上手时我以为它顶多就是文生图再稳一点、画面再清楚一点,结果在视觉维度的进化上,它直接刷新了我对“看图生成”的认知。我拿了 7 张《哆啦A梦》动画截图丢进去…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉