summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/app/anime/[animeId]/page.tsx8
-rw-r--r--src/app/anime/all/page.tsx4
-rw-r--r--src/app/article/all/[pageId]/page.tsx6
-rw-r--r--src/app/article/tag/[tagName]/page.tsx5
-rw-r--r--src/app/article/tag/page.tsx2
-rw-r--r--src/util/animeLoader.ts10
-rw-r--r--src/util/articleLoader.ts14
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[] };
/**
* パンくずリストを管理