BewlyBewly 贡献指南:开发环境搭建、构建打包与分支 Commit 规范详解
前端【免费下载链接】BewlyBewlyJust make a few small changes to your Bilibili homepage. (English | 简体中文 | 正體中文 | 廣東話)项目地址https://gitcode.com/gh_mirrors/be/BewlyBewly点击查看免费下载本指南以 docs/CONTRIBUTING-cmn_CN.md 为骨架完整梳理 BewlyBewly 浏览器扩展的本地开发流程Chrome/Edge 与 Firefox 双浏览器、开发与构建双模式并结合仓库内 package.json、vite.config.ts、src/manifest.ts 等源码级证据深入讲解从pnpm dev到打包上线的完整工程管线以及项目贡献者必须遵守的分支、Commit 与 i18n 国际化维护规范。读完本文你将能够独立搭建 BewlyBewly 的开发环境、完成 Chrome 与 Firefox 两种目标浏览器的开发调试与构建打包并遵循项目约定提交符合规范的高质量 PR。项目概览与工程定位BewlyBewly 是一个基于 Manifest V3 的浏览器扩展目标是在不侵入 B 站业务逻辑的前提下通过注入脚本与样式的方式小幅改造Bilibili 首页体验。其工程核心是一套基于 Vite 的多入口构建方案options设置页与popup弹窗页作为 Vite 的 HTML 入口background后台脚本与contentScripts内容脚本则由 tsup 与独立 Vite 配置分别打包最终统一输出为一个标准 WebExtension 目录。从 package.json 可以看到项目的核心元信息包名bewly-bewly、版本0.40.2、包管理器固定为pnpm9.5.0项目描述为 Just make a few small changes to your Bilibili homepage.。整个仓库采用 pnpm 作为唯一包管理器因此以下所有命令均以pnpm前缀执行。开发环境准备必需工具按贡献指南要求本地开发前需确保安装以下工具工具用途说明Node.js运行构建工具链建议使用 LTS 版本pnpm包管理与脚本执行仓库packageManager字段固定为pnpm9.5.0建议保持同版本以免出现依赖行为差异Visual Studio Code开发 IDE项目 ESLint、Vue SFC、TypeScript 配置均围绕 VS Code 生态设计安装依赖进入仓库根目录后执行pnpm install值得注意的是pnpm install之后会通过postinstall钩子自动执行npx simple-git-hooks见 package.json安装 git 钩子。该钩子的配置为pre-commit: pnpm lint-staged而lint-staged对所有暂存文件执行eslint --fix见 package.json。也就是说每次提交前暂存区的所有文件都会自动被 ESLint 自动修复这是项目保证代码风格一致的第一道防线无需手动干预。构建管线总览读懂 package.json 的脚本矩阵要理解贡献指南中每条命令的含义先看 package.json 中定义的核心脚本矩阵脚本命令内容作用devclear NODE_ENVdevelopment run-p dev:*Chrome/Edge 开发模式先清理旧产物再并行运行dev:prepare、dev:web、dev:js、dev:bgdev-firefoxclear-firefox NODE_ENVdevelopment FIREFOXtrue run-p dev:*Firefox 开发模式通过FIREFOXtrue环境变量切换目标buildNODE_ENVproduction run-s clear build:web build:prepare build:js build:bgChrome/Edge 生产构建串行执行build-firefoxNODE_ENVproduction FIREFOXtrue run-s ...Firefox 生产构建build-safariNODE_ENVproduction SAFARItrue run-s ...Safari 构建供convert-safari转换用start:chromiumweb-ext run --source-dir ./extension --targetchromium自动启动 Chrome 并加载扩展start:firefoxweb-ext run --source-dir ./extension-firefox --targetfirefox-desktop自动启动 Firefox 并加载扩展lint/lint:fixeslint/eslint --fix全量代码检查与自动修复testvitest test运行单元测试typecheckvue-tscTypeScript 类型检查其中dev:*的四个子任务分别对应dev:prepare→esno scripts/prepare.ts生成开发用的 stubindex.html、拷贝assets资源并生成manifest.json详见下文dev:web→vite启动 Vite 开发服务器默认端口3303定义于 scripts/utils.tsdev:js→vite build --config vite.config.content.ts --mode development以开发模式构建 contentScriptsdev:bg→tsup --watch ./src以 watch 模式打包 background 脚本。正是这种Vite 服务器 tsup watch web-ext 自动加载的组合构成了贡献指南中所说的每次修改后自动重新加载、刷新网页即可看到变更的开发体验。prepare 脚本做了什么scripts/prepare.ts 在开发与构建阶段都会被执行dev:prepare/build:prepare它负责三件事创建目标输出目录extension/extension-firefox/extension-safari之一由环境变量决定把 assets 目录拷贝到输出目录供manifest.json中的图标与rules.json引用通过npx esno ./scripts/manifest.ts调用 scripts/manifest.ts动态生成manifest.json。其中 manifest 生成逻辑src/manifest.ts充分体现了一套源码、多浏览器适配的设计Chrome 使用service_worker作为 background而 Firefox/Safari 则改用background.scripts因为 Manifest V3 中 Firefox 不支持persistent: true的 service worker 语义同时 Firefox 版额外申请webRequest、webRequestBlocking、cookies权限并写入browser_specific_settings.gecko.id addonbewlybewly.com。content_scripts 覆盖了www.bilibili.com、search.bilibili.com、space.bilibili.com等十余个 B 站域名的document_start时机并额外通过world: MAIN注入一个页面主世界脚本src/inject/index.js。Chrome / Edge 开发贡献指南为 Chrome/Edge 提供了两种开发方式二者本质区别在于谁负责加载扩展。方式一web-ext 全自动启动推荐在仓库根目录依次执行# 安装依赖 pnpm install # 创建一个用于存储登录状态的扩展程序文件夹 mkdir web-ext-profile # 运行项目 pnpm dev # 自动打开一个新的 Chrome 窗口并打开 Bilibili 网站 pnpm start:chromium其中pnpm start:chromium实质是执行web-ext run --source-dir ./extension --targetchromium。web-ext 的默认行为可以在 package.json 的webExt配置段中看到keepProfileChanges: true保留浏览器 Profile 变更firefoxProfile/chromiumProfile均指向刚创建的./web-ext-profilestartUrl默认打开https://www.bilibili.com/。web-ext-profile目录的意义在于它保存了浏览器的登录态Cookie、本地存储等这样扩展在调试时可以直接使用已登录的 B 站账号避免每次启动都重新扫码登录。开发模式下每次修改源码构建管线会自动重新编译Vite 负责页面模块的 HMR而 vite-mv3-hmr.ts 这个自定义插件负责把 HMR 更新写回磁盘writeToDisktsup watch 则实时重打 background 脚本。因此你只需要刷新网页即可看到最新变更无需手动重载扩展。方式二浏览器手动加载pnpm install pnpm dev然后在浏览器地址栏输入chrome://extensions/Chrome或edge://extensions/Edge回车打开开发者模式点击加载已解压的扩展程序选择生成的extension/文件夹即可。注意手动模式下Vite 的 HMR 不会自动生效于扩展页面因此每次修改后需要点击扩展的重新加载按钮并刷新页面才能看到变更贡献指南中建议配合 Extensions Reloader 一类工具简化操作。这一限制的根本原因是扩展代码运行在浏览器扩展沙箱中与 Vite 开发服务器之间的 HMR 通道scripts/client.ts 中的mv3client.mjs客户端仅在 web-ext 启动时通过调试端口建立完整链路。Chrome / Edge 构建要产出可分发、可提交商店的正式包运行pnpm build构建完成后产物打包到extension/目录。该目录内包含manifest.json、dist/background 与 contentScripts 等、assets/图标与 assets/rules.json 网络规则等完整扩展结构。Vite 的构建输出路径定义在 vite.config.tsextension/dist非 Firefox/Safari 时。如需进一步产出extension.zip/extension.crx可执行pnpm pack内部调用pack:zip、pack:crx见 package.json。Firefox 开发Firefox 与 Chrome 在 Manifest V3 的 API 语义上存在差异项目通过FIREFOXtrue环境变量在整个构建链路中切换输出目录extension-firefox与 manifest 形态background 脚本、权限列表详见 scripts/utils.ts 与 src/manifest.ts。方式一web-ext 全自动启动# 安装依赖 pnpm install # 创建一个用于存储登录状态的扩展程序文件夹 mkdir web-ext-profile # 运行项目 pnpm dev-firefox # 自动打开一个新的 Firefox 窗口并打开 Bilibili 网站 pnpm start:firefoxpnpm start:firefox对应web-ext run --source-dir ./extension-firefox --targetfirefox-desktop同样复用./web-ext-profile保存登录态。方式二浏览器手动加载pnpm install pnpm dev-firefox然后在 Firefox 地址栏输入about:addons进入Extensions页面点击Debug Add-ons临时载入附加组件选择生成的extension-firefox/文件夹。Firefox 构建pnpm build-firefox产物打包到extension-firefox/目录。该目录结构与extension/平行但 manifest 与权限按 Firefox 语义生成。若要产出商店提交所需的extension-firefox.zip与源码包可运行pnpm pack:zip-firefox与pack:zip-firefox-sources后者通过git archive从 HEAD 导出源码。工程质量配套lint、测试与类型检查在提交代码之前建议在本地完整跑一遍工程自检# 代码风格检查提交时 lint-staged 已自动做 --fix这里做全量确认 pnpm lint # 单元测试基于 vitest配置在 vite.config.ts 的 test 字段jsdom 环境 全局注入 pnpm test # TypeScript 类型检查vue-tsc覆盖 Vue SFC 与普通 TS 文件 pnpm typecheck仓库内已有的测试样例包括 src/tests/uriParse.spec.ts解析bilibili://video/...深链、判定竖屏视频与 src/tests/demo.spec.ts新增逻辑时可参照这两个文件补充测试用例。贡献流程与分支规范常驻分支贡献指南明确规定Main 分支承担所有日常开发任务错误修复、新功能开发、性能改进以及对国际化i18n文件的修改都直接基于main分支进行。临时分支分支前缀用途feat/提交新的功能特性doc/专门用于修复文档不涉及功能改动fix/专门用于修复开发过程中出现的错误按此约定一个新增关注页筛选功能的 PR 分支应命名为feat/following-filter纯文档修正则使用doc/xxx前缀以确保从分支名即可判断 PR 的性质。Commit 规范贡献指南要求参照 Angular commit message guidelines 编写提交信息支持以下类型类型含义feat新功能fix修复 Bugdocs文档更新style不影响代码含义的更改空格、格式、缺少分号等refactor重构代码test添加或更新测试chore构建过程或工具链的变更perf性能改进ci持续集成/交付的变更除类型外还鼓励附加scope与footer。指南给出了典型示例fix(dock): xxx 变更描述 相关 PR: url其中fix(dock)中的dock即为 scope对应仓库内的 Dock 模块——scope 通常取自被改动模块名如topbar、videoCard、settings等可对照 src/components 目录结构footer 中可补充关联的 PR 地址等上下文信息便于维护者追溯变更来源。I18n 国际化维护规范BewlyBewly 面向多语言用户国际化文件位于 src/_locales 目录当前包含四个语言版本cmn-CN.yml简体中文cmn-TW.yml正体中文en.yml英文jyut.yml粤语这些 YAML 文件通过intlify/unplugin-vue-i18n在构建期打包进应用配置见 vite.config.ts 的include: [./src/_locales/**]运行时由 src/utils/i18n.ts 中的 vue-i18n 实例读取默认语言为英文并以此作为 fallback。贡献指南对翻译工作提出两条硬性要求遇到不熟悉的语言时可以使用你已经翻译过的另一种语言通常指英文作为占位翻译并在 PR 中明确指出你无法翻译的语言交由擅长该语言的维护者补齐必须手动维护 i18n 文件严禁使用i18n Ally等扩展自动维护。指南明确说明原因使用 i18n Ally 会导致翻译条目被放置到不确定的位置、或误删代码注释破坏 YAML 文件的既有组织方式。手动维护时的正确做法是对照 en.yml 的键层级结构在其余三个语言文件中保持完全一致的键路径与缩进仅替换文案值新增 key 时四个文件必须同步更新。提交 PR 前的检查清单综合以上规范整理一份贡献者自查清单分支命名符合feat/、doc/、fix/前缀约定pnpm lint、pnpm test、pnpm typecheck全部通过pre-commit 钩子会自动执行 lint-staged 的eslint --fixCommit message 使用规范类型必要时附上 scope 与 footer涉及界面文案时src/_locales 下四个语言文件同步更新且翻译不熟的语言已显式标注文档类改动如本文所属的 docs 目录使用doc/分支与功能改动分离。延伸阅读English 版贡献指南、正體中文版、廣東話版 —— 同一指南的多语言版本术语可与中文版对照scripts/prepare.ts 与 scripts/manifest.ts —— 构建期 manifest 与 stub 生成逻辑vite.config.ts 与 vite-mv3-hmr.ts —— 构建配置与 MV3 HMR 实现细节src/tests/uriParse.spec.ts —— 测试编写范式参考。赞分享前端【免费下载链接】BewlyBewlyJust make a few small changes to your Bilibili homepage. (English | 简体中文 | 正體中文 | 廣東話)项目地址https://gitcode.com/gh_mirrors/be/BewlyBewly点击查看免费下载相关推荐BewlyBewly 开发与贡献指南从环境搭建、多浏览器构建到提交规范BewlyBewly 开发与贡献指南从环境搭建、多浏览器构建到提交规范 BewlyBewly 是一款通过内容脚本与样式适配对 Bilibili 主页进行深度改前端kotaemon 开发者贡献指南环境搭建、包结构解析与 PR 协作规范kotaemon 开发者贡献指南环境搭建、包结构解析与 PR 协作规范 本篇指南以 docs/development/contributing.md http人工智能大模型RAG向量数据库后端Bruno 本地开发与贡献实战指南环境搭建、构建测试与分支规范全解析Bruno 本地开发与贡献实战指南环境搭建、构建测试与分支规范全解析 本文以仓库中的土耳其语版贡献指南 docs/contributing/contribut开发工具接口测试桌面应用CLI上一篇Mongoku开发指南基于SvelteKit构建高性能Web界面下一篇终极指南如何使用Atlantis简化Terraform基础设施环境切换 创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Dropwizard 2.0.x 升级迁移指南:Maven BOM、Jetty/Jersey/TLS 行为变更与破坏性 API 迁移详解

Dropwizard 2.0.x 升级迁移指南:Maven BOM、Jetty/Jersey/TLS 行为变更与破坏性 API 迁移详解

后端Web框架 【免费下载链接】dropwizard A damn simple library for building production-ready RESTful web services. 项目地址: https://gitcode.com/gh_mirrors/dr/dropwizard 点击查看 免费下载 Dropwizard 2.0.x 是从 1.x 迁移过程中破坏性变更最集中的大版…

2026/9/25 8:55:14 阅读更多 →
rsuite 图标头像(Icon Avatar)实战指南:用图标填充 Avatar 的完整方案

rsuite 图标头像(Icon Avatar)实战指南:用图标填充 Avatar 的完整方案

前端UI组件 【免费下载链接】rsuite 🧱 A suite of React components . 项目地址: https://gitcode.com/gh_mirrors/rs/rsuite 点击查看 免费下载 导读 在 rsuite 中,Avatar(头像)组件不仅支持图片和字符作为内容&a…

2026/9/25 8:55:14 阅读更多 →
业务开发视角的可观测体系建设:从日志、链路到告警的实战指南

业务开发视角的可观测体系建设:从日志、链路到告警的实战指南

那天晚上十一点半,业务群突然炸了:下单成功率掉了快一半,用户反馈进来一堆。我作为订单模块的业务开发,打开监控大盘一看,CPU 正常、内存正常、服务平均耗时也正常,整个系统看起来"健康"得不能再…

2026/9/25 8:54:13 阅读更多 →

最新新闻

x86汇编核心指令与栈帧实战:从寻址到调试

x86汇编核心指令与栈帧实战:从寻址到调试

1. 为什么还要啃x86汇编这块硬骨头很多人一听“汇编”两个字,脑子里蹦出来的第一反应就是“这玩意儿不是早就被淘汰了吗”。我刚开始带新人的时候也经常被问:现在都是Java、Python、Go满天飞,学x86汇编到底图什么。这个问题我认真想过&#x…

2026/9/25 10:10:03 阅读更多 →
Substrate底层承载层:概念解析、选型逻辑与工程实践指南

Substrate底层承载层:概念解析、选型逻辑与工程实践指南

1. 从“substrate”这个词说起:它到底指什么第一次看到“substrate”这个词,很多人会愣一下。它在不同圈子里含义差别很大:做区块链的人第一反应是 Parity 那套区块链框架,做材料化学的人想到的是“基底、衬底”,做半导…

2026/9/25 10:10:03 阅读更多 →
狗头军师7大主策略全解析:从承接到收线,每轮聊天该走哪一步

狗头军师7大主策略全解析:从承接到收线,每轮聊天该走哪一步

狗头军师7大主策略全解析:从承接到收线,每轮聊天该走哪一步 【免费下载链接】goutoujunshi 一个先接住情绪、再分析关系并给出可执行策略的 Codex 恋爱军师,内置心理、法律、社会、人文、哲学、婚姻家庭与性学知识库,支持多元关系…

2026/9/25 10:10:03 阅读更多 →
油猴脚本自动答题实战:从DOM操作到浏览器自动化

油猴脚本自动答题实战:从DOM操作到浏览器自动化

1. 从“一键答完整个练习页”说起:油猴脚本到底做了什么说实话,看到“油猴自动答题”这个标题,我的第一反应不是“又来一个作弊脚本”,而是“终于有人开始认真研究浏览器自动化了”。我自己写这类脚本,最初的动机其实特…

2026/9/25 10:10:03 阅读更多 →
人工智能基础概念全景解析:从 AI 到 Transformer、LLM、Prompt、Token、RAG、Agent、对齐与安全——用 TaoToken 统一 Key 串起概念验证

人工智能基础概念全景解析:从 AI 到 Transformer、LLM、Prompt、Token、RAG、Agent、对齐与安全——用 TaoToken 统一 Key 串起概念验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 10:10:03 阅读更多 →
Anbox 的进程控制基石:process-cpp-minimal 库源码深度解析与实战指南

Anbox 的进程控制基石:process-cpp-minimal 库源码深度解析与实战指南

虚拟化容器运行时 【免费下载链接】anbox Anbox is a container-based approach to boot a full Android system on a regular GNU/Linux system 项目地址: https://gitcode.com/gh_mirrors/an/anbox 点击查看 免费下载 process-cpp-minimal 是 Anbox 项目引入的轻…

2026/9/25 10:09:02 阅读更多 →

日新闻

AI元人文:从工具使用到思维重构的深度探索

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:00:41 阅读更多 →
Python+CNN车牌识别实战:从数据预处理到模型训练与部署

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:00:41 阅读更多 →
Vim基础操作全攻略:保存退出、模式切换与高频命令实战

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/25 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/24 9:10:42 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →