Introduction | 简体中文 |はじめに
ts-fsrs是一个基于TypeScript的多功能包,支持ES模块、CommonJS和UMD。它实现了自由间隔重复调度器(FSRS)算法,使开发人员能够将FSRS集成到他们的闪卡应用程序中,从而增强用户的学习体验。
你可以通过ts-fsrs-workflow.drawio来获取ts-fsrs的工作流信息。
[email protected]
需要运行在 Node.js (>=16.0.0)上,[email protected]
需要运行在 Node.js (>=18.0.0)上。
从[email protected]
开始,ts-fsrs支持CommonJS、ESM和UMD模块系统
npm install ts-fsrs
yarn install ts-fsrs
pnpm install ts-fsrs
bun install ts-fsrs
import {createEmptyCard, formatDate, fsrs, generatorParameters, Rating, Grades} from 'ts-fsrs';
const params = generatorParameters({ enable_fuzz: true, enable_short_term: false });
const f = fsrs(params);
const card = createEmptyCard(new Date('2022-2-1 10:00:00'));// createEmptyCard();
const now = new Date('2022-2-2 10:00:00');// new Date();
const scheduling_cards = f.repeat(card, now);
// console.log(scheduling_cards);
for (const item of scheduling_cards) {
// grades = [Rating.Again, Rating.Hard, Rating.Good, Rating.Easy]
const grade = item.log.rating
const { log, card } = item;
console.group(`${Rating[grade]}`);
console.table({
[`card_${Rating[grade]}`]: {
...card,
due: formatDate(card.due),
last_review: formatDate(card.last_review as Date),
},
});
console.table({
[`log_${Rating[grade]}`]: {
...log,
review: formatDate(log.review),
},
});
console.groupEnd();
console.log('----------------------------------------------------------------');
}
更多的参考:
- 参考文档- Github Pages
- 参考调度 - Github Pages
- 浏览器使用 (使用CDN来访问ts-fsrs ESM包)
- 案例应用 - 基于Next.js+Prisma
- 现代化抽成卡 - Next.js+Drizzle+tRPC
首先,创建一个空的卡片实例并设置当前日期(默认为当前系统时间):
import {Card, createEmptyCard} from "ts-fsrs";
let card: Card = createEmptyCard();
// createEmptyCard(new Date('2022-2-1 10:00:00'));
// createEmptyCard(new Date(Date.UTC(2023, 9, 18, 14, 32, 3, 370)));
// createEmptyCard(new Date('2023-09-18T14:32:03.370Z'));
该ts-fsrs库允许自定义SRS参数。使用generatorParameters
来生成SRS算法的最终参数集。以下是设置最大间隔的示例:
import {Card, createEmptyCard, generatorParameters, FSRSParameters} from "ts-fsrs";
let card: Card = createEmptyCard();
const params: FSRSParameters = generatorParameters({maximum_interval: 1000});
核心功能位于fsrs
函数中。当调用repeat
该函数时,它会根据不同的用户评级返回一个卡片集合的调度结果:
import {
Card,
createEmptyCard,
generatorParameters,
FSRSParameters,
FSRS,
RecordLog,
} from "ts-fsrs";
let card: Card = createEmptyCard();
const f: FSRS = new FSRS(); // or const f: FSRS = fsrs(params);
let scheduling_cards: RecordLog = f.repeat(card, new Date());
// 如果你想要指定一个特定的评级,你可以这样做:(ts-fsrs版本必须 >= 4.0.0)
// let scheduling_cards: RecordLog = f.next(card, new Date(), Rating.Good);
一旦你有了scheduling_cards
对象,你可以根据用户评级来获取卡片。例如,要访问一个被安排在“Good
”评级下的卡片:
const good: RecordLogItem = scheduling_cards[Rating.Good];
const newCard: Card = good.card;
当然,你可以获取每个评级下卡片的新状态和对应的历史记录:
scheduling_cards[Rating.Again].card
scheduling_cards[Rating.Again].log
scheduling_cards[Rating.Hard].card
scheduling_cards[Rating.Hard].log
scheduling_cards[Rating.Good].card
scheduling_cards[Rating.Good].log
scheduling_cards[Rating.Easy].card
scheduling_cards[Rating.Easy].log
每个Card
对象都包含各种属性,这些属性决定了它的状态、调度和其他指标(DS):
type Card = {
due: Date; // 卡片下次复习的日期
stability: number; // 记忆稳定性
difficulty: number; // 卡片难度
elapsed_days: number; // 自上次复习以来的天数
scheduled_days: number; // 下次复习的间隔天数
reps: number; // 卡片被复习的总次数
lapses: number; // 卡片被遗忘或错误记忆的次数
state: State; // 卡片的当前状态(新卡片、学习中、复习中、重新学习中)
last_review?: Date; // 最近的复习日期(如果适用)
};
每个ReviewLog
对象都包含各种属性,这些属性决定了与之关联的卡片的复习记录信息,用于分析,回退本次复习,优化(编写中):
type ReviewLog = {
rating: Rating; // 复习的评级(手动变更,重来,困难,良好,容易)
state: State; // 复习的状态(新卡片、学习中、复习中、重新学习中)
due: Date; // 上次的调度日期
stability: number; // 复习前的记忆稳定性
difficulty: number; // 复习前的卡片难度
elapsed_days: number; // 自上次复习以来的天数
last_elapsed_days: number; // 上次复习的间隔天数
scheduled_days: number; // 下次复习的间隔天数
review: Date; // 复习的日期
}