diff options
author | Fushihara <1039534+fushihara@users.noreply.github.com> | 2024-09-25 09:19:13 +0900 |
---|---|---|
committer | Fushihara <1039534+fushihara@users.noreply.github.com> | 2024-09-25 09:19:13 +0900 |
commit | 4ccee1438e3c341075fdcf1d62e6900eb29d1908 (patch) | |
tree | 852dd4e1b74f6d45371619d1c55d3f94343c5c38 | |
parent | 2ce86e17bdeaaa00d758ecb312f2171c33d7d5ec (diff) |
データ読み込みのクラスをシングルトン化
-rw-r--r-- | src/app/anime/[animeId]/page.tsx | 8 | ||||
-rw-r--r-- | src/app/anime/all/page.tsx | 4 | ||||
-rw-r--r-- | src/app/article/all/[pageId]/page.tsx | 6 | ||||
-rw-r--r-- | src/app/article/tag/[tagName]/page.tsx | 5 | ||||
-rw-r--r-- | src/app/article/tag/page.tsx | 2 | ||||
-rw-r--r-- | src/util/animeLoader.ts | 10 | ||||
-rw-r--r-- | src/util/articleLoader.ts | 14 |
7 files changed, 28 insertions, 21 deletions
diff --git a/src/app/anime/[animeId]/page.tsx b/src/app/anime/[animeId]/page.tsx index 0f96f30..a92cda8 100644 --- a/src/app/anime/[animeId]/page.tsx +++ b/src/app/anime/[animeId]/page.tsx @@ -1,7 +1,7 @@ import "./style.css"; import style from "./style.module.css"; import dateformat from "dateformat"; -import { animeLoader, AnimeLoaderData } from "../../../util/animeLoader"; +import { AnimeLoader, AnimeLoaderData } from "../../../util/animeLoader"; import Link from "next/link"; dateformat.i18n.dayNames = [ '日', '月', '火', '水', '木', '金', '土', @@ -12,7 +12,7 @@ type PageType = { params: { animeId: string, } } export async function generateMetadata(context: PageType) { - const loadedData = await animeLoader.loadData().then(d => { + const loadedData = await AnimeLoader.instance.loadData().then(d => { const r = d.find(a => a.animeId == Number(context.params.animeId))!; return r; }); @@ -21,7 +21,7 @@ export async function generateMetadata(context: PageType) { } } export default async function Page(context: PageType) { - const loadedData = await animeLoader.loadData().then(d => { + const loadedData = await AnimeLoader.instance.loadData().then(d => { const r = d.find(a => a.animeId == Number(context.params.animeId))!; return r; });; @@ -224,7 +224,7 @@ function episodeHitokotoList(list: AnimeLoaderData["episodeHitokotoList"]) { </>); } export async function generateStaticParams() { - const loadedData = await animeLoader.loadData(); + const loadedData = await AnimeLoader.instance.loadData(); return loadedData.map(c => { return { animeId: String(c.animeId) }; }) satisfies PageType["params"][]; diff --git a/src/app/anime/all/page.tsx b/src/app/anime/all/page.tsx index 9c4f4e6..288171a 100644 --- a/src/app/anime/all/page.tsx +++ b/src/app/anime/all/page.tsx @@ -1,4 +1,4 @@ -import { animeLoader } from "../../../util/animeLoader"; +import { AnimeLoader } from "../../../util/animeLoader"; import style from "./style.module.css"; import Link from "next/link"; type PageType = { @@ -11,7 +11,7 @@ export async function generateMetadata(context: PageType) { } } export default async function Page(context: PageType) { - const loadedData = await animeLoader.loadData(); + const loadedData = await AnimeLoader.instance.loadData(); return ( <div className="p-1 gap-16"> <div className="text-right">全:{loadedData.length}件</div> diff --git a/src/app/article/all/[pageId]/page.tsx b/src/app/article/all/[pageId]/page.tsx index 0374401..fda6fbb 100644 --- a/src/app/article/all/[pageId]/page.tsx +++ b/src/app/article/all/[pageId]/page.tsx @@ -21,8 +21,7 @@ export async function generateMetadata(context: PageType) { } export default async function Page(context: PageType) { const pageId = getPageIdNumber(context.params.pageId); - const al = new ArticleLoader() - const loadedData = await al.loadData(); + const loadedData = await ArticleLoader.instance.loadData(); const chunkdData = chunk(loadedData, PPV); const displayData = chunkdData[pageId - 1]; return ( @@ -142,8 +141,7 @@ if (!Number.isInteger(PPV)) { } //export const dynamicParams = true; export async function generateStaticParams() { - const al = new ArticleLoader() - const loadedData = await al.loadData(); + const loadedData = await ArticleLoader.instance.loadData(); const chunkdData = chunk(loadedData, PPV); return chunkdData.map((data, index) => { return { pageId: `page-${index + 1}`, data: data }; diff --git a/src/app/article/tag/[tagName]/page.tsx b/src/app/article/tag/[tagName]/page.tsx index d41befb..84c1677 100644 --- a/src/app/article/tag/[tagName]/page.tsx +++ b/src/app/article/tag/[tagName]/page.tsx @@ -12,9 +12,8 @@ export async function generateMetadata(context: PageType) { } } export default async function Page(context: PageType) { - const al = new ArticleLoader() const nowPageTagName = decodeURIComponent(context.params.tagName); - const loadedData = await al.loadData().then(articles => { + const loadedData = await ArticleLoader.instance.loadData().then(articles => { const filterd = articles.filter(article => { if (article.tags.includes(nowPageTagName)) { return true; @@ -35,7 +34,7 @@ export default async function Page(context: PageType) { ); } export async function generateStaticParams() { - const tagList = await new ArticleLoader().getTagList(); + const tagList = await ArticleLoader.instance.getTagList(); return tagList.map((data, index) => { return { tagName: data.tag }; }); diff --git a/src/app/article/tag/page.tsx b/src/app/article/tag/page.tsx index f1d161b..4f6ae0b 100644 --- a/src/app/article/tag/page.tsx +++ b/src/app/article/tag/page.tsx @@ -13,7 +13,7 @@ export async function generateMetadata(context: PageType) { } } export default async function Page(context: PageType) { - const tagList = await new ArticleLoader().getTagList(); + const tagList = await ArticleLoader.instance.getTagList(); type TAG = { tag: string, count: number, primary?: boolean }; const elementListPcPart: TAG[] = []; const elementListAkiba: TAG[] = []; diff --git a/src/util/animeLoader.ts b/src/util/animeLoader.ts index 120123b..92dbd5f 100644 --- a/src/util/animeLoader.ts +++ b/src/util/animeLoader.ts @@ -58,18 +58,19 @@ const zodType = z.array( ); const MAX_ITEM_LIMIT = process.env["AKIBA_SOUKEN_MAX_ITEM_LIMIT"]; export type AnimeLoaderData = z.infer<typeof zodType>[number] -class AnimeLoader { +export class AnimeLoader { + static instance = new AnimeLoader(); constructor() { } - private dataCache: Awaited<ReturnType<AnimeLoader["loadData_"]>> | null = null; + private dataCache: Awaited<ReturnType<AnimeLoader["_loadData"]>> | null = null; async loadData() { if (this.dataCache != null) { return this.dataCache; } - const loadedData = await this.loadData_(); + const loadedData = await this._loadData(); this.dataCache = loadedData; return loadedData; } - private async loadData_() { + private async _loadData() { const articleJsonPath = process.env["AKIBA_SOUKEN_ANIME_JSON"]!; //console.log(`[${articleJsonPath}]`); const jsonStr = await readFile(articleJsonPath, { encoding: "utf-8" }).then(text => { @@ -90,4 +91,3 @@ class AnimeLoader { return parsedObj; } } -export const animeLoader = new AnimeLoader();
\ No newline at end of file diff --git a/src/util/articleLoader.ts b/src/util/articleLoader.ts index f63b28c..860593d 100644 --- a/src/util/articleLoader.ts +++ b/src/util/articleLoader.ts @@ -12,8 +12,18 @@ const zodType = z.array( ); const MAX_ITEM_LIMIT = process.env["AKIBA_SOUKEN_MAX_ITEM_LIMIT"]; export class ArticleLoader { - constructor() { } + static instance = new ArticleLoader(); + private constructor() { } + private dataCache: Awaited<ReturnType<ArticleLoader["_loadData"]>> | null = null; async loadData() { + if (this.dataCache != null) { + return this.dataCache; + } + const loadedData = await this._loadData(); + this.dataCache = loadedData; + return loadedData; + } + private async _loadData() { const articleJsonPath = process.env["AKIBA_SOUKEN_ARTICLE_JSON"]!; const jsonStr = await readFile(articleJsonPath, { encoding: "utf-8" }).then(text => { const jsonObj = JSON.parse(text); @@ -28,7 +38,6 @@ export class ArticleLoader { } return parsedObj; } - async getCategoryList() { const loadedData = await this.loadData(); // key:カテゴリ名 , val:回数 @@ -95,6 +104,7 @@ export class ArticleLoader { } } + type BreadcrumbInternal = { name: string, count: number, child: BreadcrumbInternal[] }; /** * パンくずリストを管理 |