闲来无事,我开发了一个谷歌浏览器书签插件~~

应用商店地址 欢迎大家下载使用 😁
本文仅在掘金发布

之前一直有朋友抱怨说浏览器的书签比较难管理,想要管理需要跳转到书签管理页面才行,也不想在浏览器工具栏多一行书签栏,感觉有点挤压页面大小。

最近在查看 chrome 开发者文档 的时候,发现 API 的支持完全满足现在想要的需求,同时也有不少人也在做类似的二次开发,于是心血来潮就有了这个小工具~~

才艺展示

注册 Chrome Web Store 开发者账号

首先得注册开发者账号,进入登录后就会看到要注册:

需要花费 5 美元注册,而且还必须是银行卡,我用的是中国银行的莫奈卡,往里边提前存点美元就可以了:

填收费地址的时候,现在是可以填国内地址了!

技术架构

本项目采用的是 antd + crxjs,它支持 vite + react/vue。

提一嘴,crxjs 这个工具,在打包的时候,可以自动识别 manifest 文件、service-worker 文件等,并将其放在打包的根目录上,打包结果可以直接上传,非常的方便。

各个功能点的技术实现

1. 支持树状列表展示

前期使用 antd 的 menu,但是发现目录树递归层级较深以后,性能会出现问题,后来改用 table 组件来展示递归树。

关于操作项的性能优化,原先使用 display: none, 在鼠标 hover 的时候再 display: inline-block,后来在测试的过程中,发现滚动过程中鼠标会反复 hover 在行列上,导致触发 hover 效果,进而不停地回流,此时滚动就会出现卡顿,后来进行了优化,使用 react 的 state 来保证同一时刻只有一个 操作组件渲染在界面上:

js 复制代码
<Flex justify="flex-end" style={{ flex: 1 }}>
  {currentShowActionRowId === id ? (
    <ColumnAction
      isDir={isDir}
      isTop={isTop}
      record={record}
      title={title}
      tags={tags}
      onOpenChange={onOpenChange}
      callback={callback}
    />
  ) : null}
</Flex>

这样,在鼠标移到某一行的时候,设置 currentShowActionRowId 就可以动态显示操作列:

js 复制代码
onRow={(record) => {
    return {
      onMouseEnter: (event) => {
        event.stopPropagation();
        if (!isWipOpening.current) {
          flushSync(() => {
            setCurrentShowActionRowId(record.id);
          });
        }
      },
    };
 }}

2. 自由打标签

顾名思义,我们默认支持几种颜色的标签,用户可以自定义颜色的新的标签:

然后支持通过标签颜色来筛选:

3. 支持增删改

添加当前页面到书签的功能竟然需要获取用户浏览记录权限,我只好放弃😂

4. 支持搜索记录

我们使用谷歌存储来放置记录信息:

js 复制代码
chrome.storage.local.set({ 'bookmarker-search-history': { ...history } }, function () {
    callback && callback();
});

界面效果(目前支持最近20条):

5. 支持动态主题切换

没啥好讲的,做了个主题切换:

主题的初始化是根据用户浏览器主题来的:

js 复制代码
useEffect(() => {
  setTheme(window.matchMedia('(prefers-color-scheme: dark)').matches ? THEME.DARK : THEME.LIGHT);
}, []);

6. 支持国际化

判断用户浏览器环境语言来初始化:

js 复制代码
const userLanguage = navigator.language || navigator.userLanguage;
const locale = userLanguage === 'zh-CN' ? zhCN : enUS;

<ConfigProvider
    locale={locale}
    ...
>
</ConfigProvider>

自定义文字的国际化,我是自己维护了一个json:

js 复制代码
const locale = {
  'yes-en': 'Yes',
  'yes-zh-cn': '决定了',
  'no-en': 'No',
  'no-zh-cn': '取消',
  'empty-en': 'Empty',
  'empty-zh-cn': '空空如也',
}

然后使用转换函数来实现的:

js 复制代码
export default function formatMessage(configContext, message) {
  const antdLocale = configContext?.locale?.locale || 'en';

  return locale[`${message}-${antdLocale}`] || '';
}

7. 支持右键菜单和快捷键

本插件开启了任意浏览器页面的邮件菜单:

以及快捷键打开:⌘+B 或 Ctrl+B

后期打算

  1. 应用商店搜索优化,目前搜索排名不是特别靠前
  2. 新功能支持:导入导出、筛选无效网址、网页快照等
  3. 迁移到 Edge 浏览器

谷歌应用商店地址

相关推荐
yogima2 小时前
Chrome插件elasticsearch-head的安装和使用
chrome·elasticsearch
不会倒的鸡蛋1 天前
网络爬虫详解
前端·chrome·python
thginWalker1 天前
【selenium】driver.get打包成exe后上报chrome.exe-损坏的映像
chrome·selenium·测试工具
Once_day1 天前
chrome-base源码分析(1)macros模块
c++·chrome
象野VH2 天前
JS基础与Chrome介绍
开发语言·javascript·chrome
tekin2 天前
彻底解决 macos中chrome应用程序 的 无法更新 Chrome 弹窗提示 mac自定义参数启动 chrome.app
chrome·macos·mac·chrome自定义启动参数·chrome启动参数
188_djh2 天前
# linux 系统中,使用 “ ll “ 命令报错 “ bash ll command not found “ 解决方法:
linux·chrome·bash·bashrc·alias·ll·ls -l
常乐hhh2 天前
浏览器内核与渲染机制深入解读
前端·性能优化·浏览器
STATICHIT静砸3 天前
谈谈检测浏览器类型
浏览器
流氓也是种气质 _Cookie3 天前
chrome 配置允许跨域
chrome·跨域