Introduction | 简体中文 |はじめに
ts-fsrs is a versatile package based on TypeScript that supports ES modules, CommonJS, and UMD. It implements the Free Spaced Repetition Scheduler (FSRS) algorithm, enabling developers to integrate FSRS into their flashcard applications to enhance the user learning experience.
The workflow for TS-FSRS can be referenced from the following resources:
- google driver: ts-fsrs-workflow.drawio (You may provide commentary)
- github: ts-fsrs-workflow.drawio
The ts-fsrs@3.x
package requires Node.js version 16.0.0
or higher. Starting with ts-fsrs@4.x
, the minimum required Node.js version is 18.0.0
.
From version 3.5.6
onwards, ts-fsrs supports CommonJS, ESM, and UMD module systems.
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('----------------------------------------------------------------');
}
More refer:
- Docs - Github Pages
- Example.html - Github Pages
- Browser (ts-fsrs package using CDN)
- ts-fsrs-demo - Next.js+Prisma
- spaced - Next.js+Drizzle+tRPC
To begin, create an empty card instance and set the current date(default: current time from system):
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'));
The library allows for customization of SRS parameters. Use generatorParameters
to produce the final set of parameters for the SRS algorithm. Here's an example setting a maximum interval:
import { Card, createEmptyCard, generatorParameters, FSRSParameters } from "ts-fsrs";
let card: Card = createEmptyCard();
const params: FSRSParameters = generatorParameters({ maximum_interval: 1000 });
The core functionality lies in the fsrs
function. When invoked, it returns a collection of cards scheduled based on different potential user ratings:
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());
// if you want to specify the grade, you can use the following code: (ts-fsrs >=4.0.0)
// let scheduling_card: RecordLog = f.next(card, new Date(), Rating.Good);
Once you have the scheduling_cards
object, you can retrieve cards based on user ratings. For instance, to access the card scheduled for a 'Good' rating:
const good: RecordLogItem = scheduling_cards[Rating.Good];
const newCard: Card = good.card;
Get the new state of card for each rating:
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
Each Card
object consists of various attributes that determine its status, scheduling, and other metrics:
type Card = {
due: Date; // Date when the card is next due for review
stability: number; // A measure of how well the information is retained
difficulty: number; // Reflects the inherent difficulty of the card content
elapsed_days: number; // Days since the card was last reviewed
scheduled_days: number; // The interval at which the card is next scheduled
reps: number; // Total number of times the card has been reviewed
lapses: number; // Times the card was forgotten or remembered incorrectly
state: State; // The current state of the card (New, Learning, Review, Relearning)
last_review?: Date; // The most recent review date, if applicable
};
Each ReviewLog
object contains various attributes that determine the review record information associated with the card, used for analysis, undoing the review, and optimization (WIP).
type ReviewLog = {
rating: Rating; // Rating of the review (Again, Hard, Good, Easy)
state: State; // State of the review (New, Learning, Review, Relearning)
due: Date; // Date of the last scheduling
stability: number; // Stability of the card before the review
difficulty: number; // Difficulty of the card before the review
elapsed_days: number; // Number of days elapsed since the last review
last_elapsed_days: number; // Number of days between the last two reviews
scheduled_days: number; // Number of days until the next review
review: Date; // Date of the review
}