😎

SvelteKitアプリケーションをGitHub Pagesにデプロイする

2023/01/08に公開

プライベートでアプリを書くことがめっきり減っちゃったなー、との昨年の反省から、2023年始はv1.0がリリースされたてのSvelteKitで遊んでいました。

https://kit.svelte.jp/

https://svelte.jp/blog/announcing-sveltekit-1.0

SvelteKit上での開発は簡単な検証程度で済ましながら、SSGとして静的リソースを吐き出した上でGitHub Pagesにデプロイするまで、との一貫したフローを一通り踏んだため、今回は特に開発完了後の

  • 静的リソースを作る様に設定をして
  • GitHub Pagesにデプロイする

の部分の手順をメモとして書き落とします。

SvelteKit

adapter-static を設定する

https://kit.svelte.jp/docs/adapters

SvelteKitはビルドを行った後、adapter と呼ばれる機構でデプロイ用のリソースを生成する様です。GitHub Pagesは index.html をエントリーポイントにした静的リソースを求めているため、adapter 周りも静的リソースを作る様に定義を書いていきます。

まず、svelte.config.js でデフォルトで定義されている adapteradapter-static に修正。

$ npm i -D @sveltejs/adapter-static
svelte.config.js
- import adapter from '@sveltejs/adapter-auto';
+ import adapter from '@sveltejs/adapter-static';

/** @type {import('@sveltejs/kit').Config} */
const config = {
    kit: {
        adapter: adapter()
    }
};

export default config;

src/routes+layout.js でプリレンダリング対象であることを設定する

https://github.com/sveltejs/kit/tree/master/packages/adapter-static#usage

adapter-static のドキュメントに沿い、最上位の +layouts.js にてプリレンダリングを有効化する様に設定をします。

src/routes/+layouts.js
+ export const prerender = true;

基本的に、SvelteKitでの静的リソース生成はこれで完了です。めちゃくちゃ簡単!

$ npm run build

を実行すると、build 配下にリソースが配置されますが、その中には index.html 等の静的リソースがきちんと配置されていると思います。

GitHub Pages向け/ベースパスを設定する

https://github.com/sveltejs/kit/tree/master/packages/adapter-static#github-pages

ただし、GitHub Pagesにデプロイする場合は

# local
- https://localhost:XXXX
# GitHub Pages
+ https://{ユーザー名}.github.io/{リポジトリ名}

と、ルートパスとしてホスト名にプラスで {リポジトリ名} が必要になるため、若干設定を足す必要があります。

svelte.config.js
import adapter from '@sveltejs/adapter-static';

+ const dev = process.argv.include('dev');

/** @type {import('@sveltejs/kit').Config} */
const config = {
    kit: {
        adapter: adapter(),
+        paths: {
+            base: dev ? '' : '/{リポジトリ名}'
+        }
    }
};

export default config;

上記は adapter-static のサンプルのままですが、本番の場合はベースパスに {リポジトリ名} を設定する様にしています。ちゃんとしたアプリケーションならば NODE_ENV で判別する形で書くと思いますが、やることとしては上記と大差無い理解です。

paths.base を設定すると、アプリ上で書く相対パス周りも下記の様に $app/paths から呼び出す形で書くことが出来ます。

sample.svelte
<script>
+    import { base } from '$app/paths';
</script>

- <a href="/posts/a"></a>
+ <a href="{base}/posts/a"></a>

npm run build を再度走らせて、リンク箇所のパスに base で指定した設定が入っていれば成功です!

GitHub

アクセストークンを準備する

今回はGitHub ActionsからGitHub Pagesにデプロイをかけるべく、ページ用のブランチを生成するため、リポジトリ操作用にアクセストークンを取得しておきます。

アクセストークンは「Settings -> Developer settings -> Personal access tokens」で生成出来ます。権限範囲は repo にチェックが入っていれば問題無し。

生成が完了するとアクセストークンが一度限り表示されるため、エディタ等に控えておきましょう。

アクセストークンをSecretsに設定する

アクセストークンの様な機密情報を利用する場合は、GitHub側で提供をしているキーストアであるSecretsの仕組みを利用します。

「Settings -> Secrets -> Actions」に行くと、「New repository secret」とのボタンがあるため、こちらからキー/バリューの形式でアクセストークンを設定します。今回は GH_API_TOKEN として登録をしたとします。

GitHub Actionsを組む

設定例を配置しておきます。

deploy-to-github-pages.yml
name: deploy-to-github-pages

on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]
  workflow_dispatch:

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v3

      - name: setup node.js
        uses: actions/setup-node@v3.6.0
      
      # package.jsonの内容でパッケージインストール
      - name: setup app env
        run: npm i
      
      # ビルド実行、静的リソースを作る
      - name: build static resources
        run: npm run build
          
      # GitHub Pagesにデプロイする
      - name: deploy to github pages
        uses: peaceiris/actions-gh-pages@v3
        with:
          github_token: ${{ secrets.GH_API_TOKEN }}
          # アプリ直下のbuildディレクトリに生成されるため、指定
          publish_dir: build

めちゃくちゃ簡単!

まとめ

ばっさりと省いた開発箇所も含めてですが、簡単・簡素なフレームワークで最高です。Svelte本体が容量・コード記述量の両面から簡素さを重んじたライブラリ(正しくはコンパイラなのですが)でしたが、SvelteKitもそのポリシーをしっかりと大事にした仕上がりで、面倒な箇所がほとんど無かったです。こういうのでいいんだよ、こういうので。

NuxtもNextも、個人的にはデファクトスタンダードになる過程で、フレームワークとしてカバーする範囲が広がった結果、各所でやりたいことのシンプルさに比べると作りが面倒になっちゃうなー、との場面にいくらか遭遇する様になった感覚があります(Nuxt3は環境変数周りでめちゃくちゃハマった、、)。SvelteKitは根本のポリシーである簡素さを重んじたまま、この調子でさらなる洗練を楽しみにしたいと思います。

Discussion