Fluent Reader - 现代化的桌面RSS阅读器

项目标题与描述

Fluent Reader 是一款现代化的桌面 RSS 阅读器应用,采用 Fluent Design 设计语言,支持全黑暗模式。该项目基于 Electron 构建,提供了跨平台的 RSS 订阅管理解决方案。

主要特点:

  • 支持本地阅读或与自托管服务同步(兼容 Fever 或 Google Reader API)
  • 多平台支持(Windows/macOS/Linux)
  • 响应式设计和优雅的用户界面

应用截图

功能特性

  • :artist_palette: 受 Fluent Design System 启发的现代化 UI,支持完整黑暗模式
  • :counterclockwise_arrows_button: 支持与多种 RSS 服务同步(Inoreader、Feedbin、The Old Reader、BazQux Reader 等)
  • 📥 导入/导出 OPML 文件,完整的应用数据备份与恢复
  • 📖 内置文章视图阅读全文或默认加载网页
  • :magnifying_glass_tilted_left: 支持正则表达式搜索文章或按阅读状态筛选
  • 📂 使用文件夹式分组组织订阅源
  • ⌨️ 单键键盘快捷键支持
  • ⚙️ 自动隐藏、标记为已读或收藏文章的规则设置
  • 🔔 后台获取文章并发送推送通知
  • :globe_showing_Europe-Africa: 多语言国际化支持(20+种语言)

安装指南

Windows/macOS 用户

推荐通过应用商店安装:

其他平台

可以从 GitHub Releases 下载最新版本。

从源码构建

# 安装依赖
npm install

# 编译TypeScript和依赖
npm run build

# 启动应用
npm run electron

# 生成签名证书
electron-builder create-self-signed-cert
# 打包Windows应用
npm run package-win

使用说明

基本使用

// 初始化应用
import { initApp } from "./scripts/models/app"
import { rootStore } from "./scripts/reducer"

rootStore.dispatch(initApp())

// 渲染主界面
ReactDOM.render(
    <Provider store={rootStore}>
        <Root />
    </Provider>,
    document.getElementById("app")
)

订阅源管理

// 创建订阅源组
export class SourceGroup {
    isMultiple: boolean
    sids: number[]
    name?: string
    expanded?: boolean

    constructor(sids: number[], name: string = null) {
        name = (name && name.trim()) || "Source group"
        if (sids.length == 1) {
            this.isMultiple = false
        } else {
            this.isMultiple = true
            this.name = name
            this.expanded = true
        }
        this.sids = sids
    }
}

文章视图

// 文章组件
class Article extends React.Component<ArticleProps, ArticleState> {
    // 处理文章加载
    async function getArticle(url) {
        let article = get("a")
        if (get("m") === "1") {
            return (await Mercury.parse(url, {html: article})).content || ""
        } else {
            return article
        }
    }
    
    // 渲染文章内容
    render() {
        return (
            <div id="main"></div>
        )
    }
}

核心代码

主窗口管理

// WindowManager.ts
export class WindowManager {
    mainWindow: BrowserWindow = null
    
    createWindow() {
        this.mainWindow = new BrowserWindow({
            title: "Fluent Reader",
            backgroundColor: nativeTheme.shouldUseDarkColors ? "#282828" : "#faf9f8",
            vibrancy: "sidebar",
            width: 1200,
            height: 700,
            minWidth: 992,
            minHeight: 600,
            frame: process.platform === "darwin",
            titleBarStyle: "hiddenInset",
            webPreferences: {
                webviewTag: true,
                contextIsolation: true,
                preload: path.join(app.getAppPath(), "dist/preload.js")
            }
        })
    }
}

数据存储

// db.ts
export async function init() {
    sourcesDB = await sdbSchema.connect({ onUpgrade: onUpgradeSourceDB })
    sources = sourcesDB.getSchema().table("sources")
    itemsDB = await idbSchema.connect()
    items = itemsDB.getSchema().table("items")
    
    if (window.settings.getNeDBStatus()) {
        await migrateNeDB()
    }
}

主题设置

// theme.ts
export function setThemeDefaultFont(locale: string) {
    switch (locale) {
        case "zh-CN":
            lightTheme.defaultFontStyle.fontFamily = 
                '"Segoe UI", "Source Han Sans SC Regular", "Microsoft YaHei", sans-serif'
            break
        case "ja":
            lightTheme.defaultFontStyle.fontFamily = 
                '"Segoe UI", "Source Han Sans JP Regular", "Yu Gothic UI", sans-serif'
            break
        // 其他语言支持...
    }
}

更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
公众号二维码

posted @ 2025-06-29 16:02  qife  阅读(67)  评论(0)    收藏  举报