Stylus 浏览器扩展开发-Cursor AI辅助
项目起源
作为一个经常需要长时间盯着屏幕的开发者,我一直在寻找一个简单的方法来保护眼睛。最初的想法很简单:将网页背景色替换成护眼的豆沙绿。虽然市面上已经有类似的扩展,但我想要一个更加轻量且可定制的解决方案。
这个简单的需求逐渐演变成了一个完整的浏览器扩展项目 —— Stylus。不仅实现了最初的护眼模式,还扩展出了更多实用的功能。

技术选型
在开发初期,我面临着技术栈选择的问题。传统的浏览器扩展开发往往需要处理很多底层细节,特别是在 Manifest V3 规范下。在调研过程中,我发现了 WXT (Web Extension Tools) 这个强大的工具。
选择 WXT 的原因:
- 提供了现代化的开发体验
- 内置了 TypeScript 支持
- 简化了扩展开发的复杂度
- 支持 React 等现代前端框架
- 完全兼容 Manifest V3 规范
技术栈概览:
- WXT 作为核心开发框架
- React 18 构建用户界面
- TypeScript 5 确保代码类型安全
- Stylus 处理样式
- Chrome Extension Manifest V3 规范

AI 辅助开发
在开发过程中,我大量使用了 Cursor AI 作为开发助手。这极大地提升了开发效率:
-
代码生成
- 快速生成样式模板
- 编写常用的注入函数
- 处理复杂的正则匹配规则
-
问题解决
- 快速定位和修复 bug
- 优化性能问题
- 提供最佳实践建议
-
文档编写
- 生成注释和文档
- 完善 README
- 编写用户指南
核心功能实现
护眼模式
最初的核心功能 —— 护眼模式的实现:
body {background-color: #c7edcc !important;color: #333333 !important;
}/* 调整文本颜色和背景 */
p, div, span, li, td, th, caption, label, input, textarea {background-color: #c7edcc !important;color: #333333 !important;
}/* 调整图片亮度 */
img {filter: brightness(0.95) !important;
}
样式注入系统
为了使扩展更加通用,我设计了一个灵活的样式注入系统:
- 支持多样式表管理
- 实时预览功能
- URL 匹配规则
- 样式优先级控制
国际化支持
考虑到不同用户的需求,添加了多语言支持:
- 简体中文
- 繁体中文
- 日语
- 韩语
- 英语
未来计划
-
性能优化
- 减少样式注入的性能开销
- 优化规则匹配算法
- 添加样式缓存机制
-
功能扩展
- 支持更多预设模板
- 添加样式分享功能
- 实现云端同步
-
社区建设
- 开源代码
- 建立用户反馈系统
- 完善文档和示例
总结
从一个简单的护眼需求,到一个功能完整的浏览器扩展,Stylus 的开发过程让我深入理解了浏览器扩展的开发模式。通过使用现代化的开发工具和 AI 辅助,大大提升了开发效率。希望这个项目能帮助到更多需要定制网页样式的用户。
欢迎访问 项目主页 了解更多详情,也欢迎提交 Issue 和 PR 来帮助改进项目。
📌 开发者必备工具: 在 Tool.tushuoit.com 发现免费在线工具集!推荐 App Store 截图生成器、应用图标生成器 和 [小红书引导图生成器]
相关文章:
Stylus 浏览器扩展开发-Cursor AI辅助
项目起源 作为一个经常需要长时间盯着屏幕的开发者,我一直在寻找一个简单的方法来保护眼睛。最初的想法很简单:将网页背景色替换成护眼的豆沙绿。虽然市面上已经有类似的扩展,但我想要一个更加轻量且可定制的解决方案。 这个简单的需求逐渐…...
DAY35|动态规划Part03|LeetCode:01背包问题 二维、01背包问题 一维、416. 分割等和子集
目录 01背包理论基础(一) 基本思路 C代码 01背包理论基础(二) 基本思路 C代码 LeetCode:416. 分割等和子集 基本思路 C代码 01背包理论基础(一) 题目链接:卡码网46. 携带研究材料 文字…...
创建空向量:std::vector<int> v,刚创建时大小为0
创建一个空的std::vector<int> v会在刚创建时具有大小(size)为0的特点。这意味着此时向量中没有任何元素,而且其容量(capacity)也返回0,表明还没有为这个向量分配任何内存空间3。换句话说,…...
VBA基础2
VBA基础2 sub过程语法对单元格进行赋值操作连续赋值不连续赋值 cells (行,列)行引用rows列引用 (columns)offset位移属性End属性(指定返回) 使用VBA编辑器需要用AltF11打开 或者VB编辑器打开 可…...
计算机网络-GRE基础实验二
前面我们学习了GRE隧道的建立以及通过静态路由指向的方式使得双方能够网络互联,但是通过静态路由可能比较麻烦,GRE支持组播、单播、广播因此可以在GRE隧道中运行动态路由协议使得网络配置更加灵活。 通过前面的动态路由协议的学习我们知道动态路由协议都…...
JSON 使用
JSON 使用 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。它基于JavaScript编程语言的一个子集,但因其文本格式清晰简洁,被广泛用于数据交换和存储。本文将详细介绍JSON的使用方法,包括其语法、数据类型、如…...
Leetcode—1539. 第 k 个缺失的正整数【简单】
2024每日刷题(206) Leetcode—1539. 第 k 个缺失的正整数 C实现代码 class Solution { public:int findKthPositive(vector<int>& arr, int k) {int missing 1;int cur 1;int n arr.size();int missingCnt 0;int ptr 0;for(; missingCn…...
深入浅出:PHP 控制结构与循环语句
文章目录 引言控制结构条件判断if-else 语句elseif 语句嵌套的 if 语句三元运算符 switch 语句 循环语句for 循环遍历数组使用 range() while 循环基本用法无限循环循环控制语句break 语句continue 语句do-while 循环 综合案例参考资料 引言 PHP 是一种广泛用于服务器端开发的…...
深入解析 Loss 减少方式:mean和sum的区别及其在大语言模型中的应用 (中英双语)
深入解析 Loss 减少方式:mean 和 sum 的区别及其在大语言模型中的应用 在训练大语言模型(Large Language Models, LLM)时,损失函数(Loss Function)的处理方式对模型的性能和优化过程有显著影响。本文以 re…...
c++ auto
在C中,auto 是一种类型推导关键字,它允许编译器根据初始化表达式的类型自动推导变量的类型。自 C11 标准引入以来,auto 使得代码更加简洁,并且可以减少冗长的类型声明,尤其是在类型名称非常复杂或难以立即确定的情况下…...
python中的列表、元组、字典的介绍与使用
目录 一、区别介绍 1.使用场景以及区别图 2.详细介绍 列表 元组 字典 二、例子操作 (一)列表list 1.定义和初始化 2.访问元素(下标) 3.修改元素(下标) 4.添加元素(append、下标insert) 5.删除…...
深入浅出:PHP中的表单处理全解析
引言 在Web开发的世界里,表单是用户与服务器之间交互的重要桥梁。它们允许用户提交信息,并通过后端语言(如PHP)进行处理。本文将带你深入了解PHP中的表单处理,从基础的创建和提交到高级的安全措施和实用技巧ÿ…...
双绞线直连两台电脑的方法及遇到的问题
文章目录 前言一、步骤二、问题总结:问题1:遇到ping不通的问题。问题2:访问其他电脑上的共享文件时提示输入网络凭证问题3:局域网共享文件时提示“没有权限访问,请与网络管理员联系请求访问权限” 前言 办公室里有两台电脑,一台装了显卡用于…...
2024年认证杯SPSSPRO杯数学建模D题(第一阶段)AI绘画带来的挑战解题全过程文档及程序
2024年认证杯SPSSPRO杯数学建模 D题 AI绘画带来的挑战 原题再现: 2023 年开年,ChatGPT 作为一款聊天型AI工具,成为了超越疫情的热门词条;而在AI的另一个分支——绘图领域,一款名为Midjourney(MJÿ…...
Qt 设置QLineEdit控件placeholderText颜色
Qt 会根据QLineEdit控件显示文本的颜色自动设置placeholderText颜色,如果想自定义placeholderText颜色,可以通过以下方法。 在样式文件中增加以下设置: QLineEdit#lineEdit_userName, QLineEdit#lineEdit_password{border: none;padding: 6…...
麒麟 V10 系统(arm64/aarch64)离线安装 docker 和 docker-compose
前期准备 查看操作系统版本,跟本文标题核对一下 uname -a查看操作系统架构 uname -m下载离线包 下载 docker 离线包 地址:https://download.docker.com/linux/static/stable/ 选择系统架构对应的文件目录:aarch64,我目前使用…...
Windows基线自动化检查脚本
本批处理脚本的主要目的是对Windows系统进行安全性检查。检查了多个安全参数和设置,以确保系统符合特定的安全标准。当然也可能有些检查项不是很准确,需要根据实际环境再调试一下,以下是该脚本的详细描述和功能分析: 1. 脚本初始…...
离谱的梯形滤波器——增加过渡点
增加过渡点 频率采样法(Frequency Sampling Method)是一种设计FIR滤波器的方法,通过在频域中指定希望的频率响应,然后利用逆离散傅里叶变换(IDFT)来获得滤波器的脉冲响应。然而,这种方法容易导…...
tauri下的两个常用rust web框架:Leptos和Trunk
tauri下有两个常用rust web框架,就是Leptos和Trunk Leptos Leptos 是一个基于 Rust 的 Web 框架。您可以在他们的官方网站上了解更多关于 Leptos 的信息。本指南适用于 Leptos 的 0.6 版本。 Leptos Leptos 是一个用 Rust 编写的现代、高效且安全的 Web 框架。它…...
pubmed关键词搜索技能1:待更新
1,白话变为领域内学术词: 例如,我想要做蛋白质糖基化修饰以功能,这个领域课题,则 第一性原理,首先是拆分词汇:糖基化(一般比蛋白质、修饰、功能要在title中更常见,或者是…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...
【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...
