- 插件的核心功能是支持编辑网页的URL,可以调整参数、域名、路径等
- 同时支持记忆历史参数、路径、片段等,方便快速选择
- 插件支持在任意输入框按下回车立即刷新页面,和浏览器本身的路径栏使用体验一致
- 插件支持同步生成二维码,便于手机进行调试
- 插件目前支持自定义环境和场景,按照对应的匹配规则,可以从页面的网络请求中获取请求链接,便于拼接链接
- 未来会支持更自由地编辑匹配规则,目前只能在代码中修改
- 插件支持获取页面中iframe(部分场景可能存在嵌套两层iframe,因为浏览器跨域限制无法获取)、a、img元素的链接,便于调试
1.某些情况下,你可能需要使用一些值,但又不想在粘贴板中寻找时,可以试着放在这里
- 记录一些测试文档、链接、工具等,在调试时快速跳转
目前有这几个需求
- 能够方便修改当前页面的url参数
- 通用功能,不仅局限于开发调试场景,甚至可以切换路径,切换参数,目的主要都是减少直接操作浏览器地址栏
- 能够根据设定场景获取请求链接
0. 可能得更多考虑在业务场景的使用,自定义功能
- 预设场景
- 代码配置场景-适配度高,支持自定义功能,无法方便拓展,不过作为开发者,可以自己修改代码
- 配置文件场景-适配度低,无法根据不同场景自定义功能,优点是方便拓展,可以考虑导出配置
- 保存历史参数,设置备注,快速切换
- 预设场景
- 快速获取页面中的链接链接,支持多种元素的链接
- 一些外部链接的快速跳转,便于开发
- 储存一些信息
浏览器插件一般由几个部分组成
- popup 点击插件图标时弹出的窗口
- content script 注入到页面中的js代码,可以分为带界面的和不带界面的
- background 后台脚本,拥有较多浏览器的API和特性,比如获取网络请求等
- option 插件独有的页面
- ... 其他一些省略了
如果是纯原生开发,面临的问题是
- 我没有办法方便的做数据响应式了
- 我不好拆分页面了
- 我没有好的组件生态,写不出好看的页面了
所以选择使用前端框架+组件库开发,选型为react+vite+antd+ts
但是有几个问题
- 插件的编译需要打成:popup.html、option.html、background.js、content.js,需要各自独立编译,不能依赖外部的js(浏览器限制),所以需要配置vite打包配置,比较繁琐
- vite支持HMR,但浏览器不支持,所以每次修改一点东西,都需要疯狂点插件刷新...而一些浏览器插件框架支持真正的HMR,甚至可以自动安装插件调试
浏览器插件框架的选型
- Plasmo
- 不会自动安装插件,但是都支持热更新
- 支持多个浏览器
- 内容放在plasmo-csui的shadow dom中,可以实现样式隔离
- 使用parcel打包
- 使用@plasmojs/messaging实现消息传递
- WXT
- 脚手架快速生成,支持热更新,支持自动安装插件
- 可以同时支持多个浏览器
- 有多种隔离方案,不过基本使用shadow dom,和plasmo差不多
- 使用vite打包
- 没有官方的消息传递方案
- 选择方案
- 相比于原生开发, 使用框架可以节省配置的时间、包括HMR、或者自动安装插件(实际上作用不大)
- 框架都配置有隔离方案,包括shadow dom、iframe等,可以实现样式隔离,而原生开发需要自己实现(没啥思路)
- plasmo和wxt,plasmo相比更加成熟,包括就antd的集成,wxt就没有相关文档,所以暂时选择plasmo(主要是也没怎么熟悉这两个框架)
因为popup不能操作页面,也就无法修改URL,所以使用注入在页面中的content script实现页面URL的获取,页面刷新等操作
探索一下tab的API吧,让background脚本来操作页面
background脚本拥有脚本浏览器API特性,可以方便地操作浏览器,比如获取监听请求,在插件中使用popup与background进行通信实现请求的监听
插件基础部分master分支在github上开源,meituan-intern分支在美团内部使用
为了防止误推送到开源平台,使用git hook进行限制,如果branch为meituan-intern,则只允许推送到meituan remote
#!/bin/bash
remote="$1"
url="$2"
# 用于标记是否找到了推送的分支信息
found_push_info=0
# 从标准输入获取每个要推送的引用
while read local_ref local_sha remote_ref remote_sha; do
found_push_info=1
# 提取推送的分支名
PUSHING_BRANCH=${remote_ref#refs/heads/}
# 检查是否是推送到 meituan-intern 分支
if [ "$PUSHING_BRANCH" = "meituan-intern" ]; then
# 检查remote是否是美团的git仓库
if [[ $url != *"meituan"* ]] && [[ $remote != *"meituan"* ]]; then
echo "错误: meituan-intern分支只允许推送到美团的远程仓库。"
echo "当前尝试推送到: $remote ($url)"
exit 1
fi
fi
done
# 如果没有从标准输入读取到推送信息
# 这可能是因为分支是新的,或者其他特殊情况
if [ $found_push_info -eq 0 ]; then
# 获取当前分支名称作为备选方案
CURRENT_BRANCH=$(git symbolic-ref --short HEAD 2>/dev/null || echo "")
# 检查是否是meituan-intern分支推送到非美团远程
if [ "$CURRENT_BRANCH" = "meituan-intern" ]; then
# 检查remote是否是美团的git仓库
if [[ $url != *"meituan"* ]] && [[ $remote != *"meituan"* ]]; then
echo "错误: meituan-intern分支只允许推送到美团的远程仓库。"
echo "当前尝试推送到: $remote ($url)"
exit 1
fi
fi
fi
# 推送允许继续
exit 0



