diff --git a/spa-example/src/data/Prefecture.ts b/spa-example/src/data/Prefecture.ts
new file mode 100644
index 0000000..8c7b973
--- /dev/null
+++ b/spa-example/src/data/Prefecture.ts
@@ -0,0 +1,54 @@
+export interface Prefecture {
+ code: string;
+ name: string;
+}
+
+export const prefectures: Prefecture[] = [
+ { code: "01", name: "北海道" },
+ { code: "02", name: "青森県" },
+ { code: "03", name: "岩手県" },
+ { code: "04", name: "宮城県" },
+ { code: "05", name: "秋田県" },
+ { code: "06", name: "山形県" },
+ { code: "07", name: "福島県" },
+ { code: "08", name: "茨城県" },
+ { code: "09", name: "栃木県" },
+ { code: "10", name: "群馬県" },
+ { code: "11", name: "埼玉県" },
+ { code: "12", name: "千葉県" },
+ { code: "13", name: "東京都" },
+ { code: "14", name: "神奈川県" },
+ { code: "15", name: "新潟県" },
+ { code: "16", name: "富山県" },
+ { code: "17", name: "石川県" },
+ { code: "18", name: "福井県" },
+ { code: "19", name: "山梨県" },
+ { code: "20", name: "長野県" },
+ { code: "21", name: "岐阜県" },
+ { code: "22", name: "静岡県" },
+ { code: "23", name: "愛知県" },
+ { code: "24", name: "三重県" },
+ { code: "25", name: "滋賀県" },
+ { code: "26", name: "京都府" },
+ { code: "27", name: "大阪府" },
+ { code: "28", name: "兵庫県" },
+ { code: "29", name: "奈良県" },
+ { code: "30", name: "和歌山県" },
+ { code: "31", name: "鳥取県" },
+ { code: "32", name: "島根県" },
+ { code: "33", name: "岡山県" },
+ { code: "34", name: "広島県" },
+ { code: "35", name: "山口県" },
+ { code: "36", name: "徳島県" },
+ { code: "37", name: "香川県" },
+ { code: "38", name: "愛媛県" },
+ { code: "39", name: "高知県" },
+ { code: "40", name: "福岡県" },
+ { code: "41", name: "佐賀県" },
+ { code: "42", name: "長崎県" },
+ { code: "43", name: "熊本県" },
+ { code: "44", name: "大分県" },
+ { code: "45", name: "宮崎県" },
+ { code: "46", name: "鹿児島県" },
+ { code: "47", name: "沖縄県" }
+];
diff --git a/spa-example/src/data/PrefectureWeatherForecast.ts b/spa-example/src/data/PrefectureWeatherForecast.ts
new file mode 100644
index 0000000..358988c
--- /dev/null
+++ b/spa-example/src/data/PrefectureWeatherForecast.ts
@@ -0,0 +1,25 @@
+/**
+ * 都道府県天気予報
+ */
+export interface PrefectureWeatherForecast {
+ /**
+ * 発表気象台
+ */
+ publishingOffice:string;
+ /**
+ * 発表日時
+ */
+ reportDatetime: string;
+ /**
+ * 対象エリア
+ */
+ targetArea: string;
+ /**
+ * ヘッドライン
+ */
+ headlineText: string;
+ /**
+ * 本文
+ */
+ text: string;
+}
\ No newline at end of file
diff --git a/spa-example/src/lib/i18n/en.json b/spa-example/src/lib/i18n/en.json
index cb2d759..cffaee1 100644
--- a/spa-example/src/lib/i18n/en.json
+++ b/spa-example/src/lib/i18n/en.json
@@ -14,7 +14,8 @@
"nav": {
"home": "Home",
- "contact": "Contact"
+ "contact": "Contact",
+ "pref_forecast": "Forecast"
},
"home": {
"title": "Home"
diff --git a/spa-example/src/lib/i18n/ja.json b/spa-example/src/lib/i18n/ja.json
index 962fedd..5928747 100644
--- a/spa-example/src/lib/i18n/ja.json
+++ b/spa-example/src/lib/i18n/ja.json
@@ -13,7 +13,8 @@
},
"nav": {
"home": "ホーム",
- "contact": "問い合わせ"
+ "contact": "問い合わせ",
+ "pref_forecast": "天気予報"
},
"home": {
"title": "ホーム"
diff --git a/spa-example/src/routes/+layout.svelte b/spa-example/src/routes/+layout.svelte
index 47df5b6..742def0 100644
--- a/spa-example/src/routes/+layout.svelte
+++ b/spa-example/src/routes/+layout.svelte
@@ -57,6 +57,9 @@
{$str('nav.contact', '問い合わせ')}
+
+ {$str('nav.pref_forecast', '天気予報')}
+
@@ -84,7 +87,7 @@
-
+
diff --git a/spa-example/src/routes/+page.svelte b/spa-example/src/routes/+page.svelte
index a38bf75..9fa8aa0 100644
--- a/spa-example/src/routes/+page.svelte
+++ b/spa-example/src/routes/+page.svelte
@@ -23,7 +23,7 @@ import { str } from '$lib/i18n/i18n';
diff --git a/spa-example/src/routes/layout.ts b/spa-example/src/routes/layout.ts
index 5e79fea..f97211a 100644
--- a/spa-example/src/routes/layout.ts
+++ b/spa-example/src/routes/layout.ts
@@ -1,3 +1,3 @@
// 最上位のlayout.tsでサーバーサイドレンダリングをOFFにする
export const ssr = false;
-export const prerender = false;
\ No newline at end of file
+export const prerender = true;
\ No newline at end of file
diff --git a/spa-example/src/routes/weather/+layout.svelte b/spa-example/src/routes/weather/+layout.svelte
new file mode 100644
index 0000000..b8484e3
--- /dev/null
+++ b/spa-example/src/routes/weather/+layout.svelte
@@ -0,0 +1,34 @@
+
+
+
+
※気象庁のデータを参照しています。
+
+
+
+
+
+
+
+
diff --git a/spa-example/src/routes/weather/[prefCode]/+page.svelte b/spa-example/src/routes/weather/[prefCode]/+page.svelte
new file mode 100644
index 0000000..055905b
--- /dev/null
+++ b/spa-example/src/routes/weather/[prefCode]/+page.svelte
@@ -0,0 +1,31 @@
+
+
+
+ {#if forecast}
+
{forecast?.publishingOffice}
+
{forecast?.reportDatetime}
+
{forecast?.targetArea}
+
+
+
{forecast?.headlineText}
+
{@html forecast?.text.replace('\n', '
')}
+
+ {:else}
+
天気予報を取得できませんでした。
+ {/if}
+
diff --git a/spa-example/src/routes/weather/[prefCode]/+page.ts b/spa-example/src/routes/weather/[prefCode]/+page.ts
new file mode 100644
index 0000000..d939cd7
--- /dev/null
+++ b/spa-example/src/routes/weather/[prefCode]/+page.ts
@@ -0,0 +1,44 @@
+import type { PrefectureWeatherForecast } from "../../../data/PrefectureWeatherForecast";
+import type { PageLoad } from "./$types";
+
+
+const regex = /^\d{2}$/;
+
+type Data = { prefectureWeatherForecast: PrefectureWeatherForecast | null }
+
+export const load: PageLoad = async ({ params }) => {
+
+ if (!regex.test(params.prefCode)) {
+ throw new Error(`Invalid path`);
+ }
+
+ try {
+ // 気象庁のjsonファイルを参照します。
+ // https://www.jma.go.jp/jma/kishou/info/coment.html
+ const response = await fetch(`https://www.jma.go.jp/bosai/forecast/data/overview_forecast/${params.prefCode}0000.json`);
+
+ if (!response.ok) {
+ if (response.status == 404) {
+ return {
+ prefectureWeatherForecast: null
+ }
+ }
+
+ throw new Error(`レスポンスステータス: ${response.status}`);
+ }
+
+ let json = await response.json();
+
+ return {
+ prefectureWeatherForecast: json
+ };
+ } catch (e) {
+ // TODO エラーハンドリング
+ console.error(e);
+
+ return {
+ prefectureWeatherForecast: null
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/spa-example/src/routes/weather/layout.ts b/spa-example/src/routes/weather/layout.ts
new file mode 100644
index 0000000..7585189
--- /dev/null
+++ b/spa-example/src/routes/weather/layout.ts
@@ -0,0 +1,3 @@
+// 動的にパスを変える場合、prerenderはfalseにする
+export const ssr = false;
+export const prerender = false;
\ No newline at end of file
diff --git a/spa-example/svelte.config.js b/spa-example/svelte.config.js
index 6c71366..f22c15c 100644
--- a/spa-example/svelte.config.js
+++ b/spa-example/svelte.config.js
@@ -24,7 +24,7 @@ const config = {
directives: {
'default-src': ['none'],
'script-src': ['self'],
- 'connect-src' : ['self'],
+ 'connect-src' : ['self', 'https://www.jma.go.jp'],
'style-src' : ['self', 'unsafe-inline'],
'img-src': ['self']
}
diff --git a/spa-example/tsconfig.json b/spa-example/tsconfig.json
index 6ae0c8c..44a64e5 100644
--- a/spa-example/tsconfig.json
+++ b/spa-example/tsconfig.json
@@ -1,6 +1,9 @@
{
"extends": "./.svelte-kit/tsconfig.json",
"compilerOptions": {
+ "paths": {
+ "$src/*": ["./src"]
+ },
"allowJs": true,
"checkJs": true,
"esModuleInterop": true,