Closed14

Slidevをモノレポ管理して公開したい

ぱんだぱんだ

Slidevでスライドを作りたいけど一応公開してリンクを共有できるようにしておきたい。VercelとNetlifyとGitHub Pagesへの静的ホスティングをサポートしているので簡単に公開できるが基本的にSlidev1プロジェクトに対して1つのスライドとなるので毎回Gitリポジトリを作成するのは面倒。

なのでモノレポのような構成にして1つのリポジトリで複数のSlidevプロジェクトを管理したい。

ぱんだぱんだ

Vercel

Vercelでモノレポのプロジェクトもデプロイできるみたい。

https://vercel.com/docs/monorepos

ただ、無料枠だと3つまでしかプロジェクトを公開できないみたいなので別の方法を探す。

ぱんだぱんだ

Netlify

Netlifyは月300分のビルド時間を超えると課金が走るよう。クレジット登録しないでも使えるみたいだけど上限超えるとサイトが停止するよう。モノレポにも対応してそう。

https://docs.netlify.com/configure-builds/monorepos/

そんなにスライド作る予定ないから公開できるプロジェクト数の上限とかなければNetlifyでもいいかも。

ぱんだぱんだ

Slidevの作者の方のスライド管理してるリポジトリ見つけた

https://github.com/antfu/talks

pnpmのモノレポで管理していてNetlifyで公開してる。ちょっとリダイレクトの設定が理解しきれなかったのだけど公開URLをわかりやすくリダイレクトしてるのか?

ぱんだぱんだ

できた

ルートディレクトリにnetlify.tomlを置いてビルドコマンドでpnpm run -r buildを実行して各slidevプロジェクトのビルドをする。ビルドの成果物はルートのdistに置いておいてルーティングはリダイレクトセクションを設定してビルドしたページに行くようにする。

https://github.com/JY8752/slidev-monorepo-demo

ぱんだぱんだ

ルートパスだけ設定してないから404ページになってしまうのでなにかしら置いておくかどこかのスライドにリダイレクトするようにしておかないといけない。

ぱんだぱんだ

pnpm workspaceを使ったモノレポ化

書いてなかったので書いておく。
pnpmのインストールがしてない場合、インストールする。
今からインストールするならcorepacksを使ってインストールするのが推奨らしい。

# corepackの有効化
corepack enable
# corepack経由でインストール
corepack prepare pnpm@latest --activate

pnpm -v
9.4.0
pnpm init

workspaceを有効にするために以下を作成

pnpm-workspace.yaml
packages:
  - "*/src"

ディレクトリ構造は悩んだけどとりあえずantfuさんの構成を真似した。

ルートのpackage.jsonにビルドタスクを記載しておく。

package.json
{
  "name": "talks",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
+    "build": "pnpm run -r build",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "packageManager": "pnpm@9.4.0+sha512.f549b8a52c9d2b8536762f99c0722205efc5af913e77835dbccc3b0b0b2ca9e7dc8022b78062c17291c48e88749c70ce88eb5a74f1fa8c4bf5e18bb46c8bd83a"
}

あとはスライドを作りたいディレクトリを作成してpnpm create slidevを実行すればslidevのプロジェクトが作成される。

vercelとnetlifyのデプロイファイルは不要なので削除しておく。

ルートにpnpm-lock.yamlnode_modulesを作成したいので一回pnpm installを実行しておく。

ここまでで、ディレクトリ構成は以下のようになっているはず

% tree -I node_modules
.
├── 2024-06-28
│   └── src
│       ├── README.md
│       ├── components
│       │   └── Counter.vue
│       ├── package.json
│       ├── pages
│       │   └── multiple-entries.md
│       ├── slides.md
│       └── snippets
│           └── external.ts
├── README.md
├── package.json
├── pnpm-lock.yaml
└── pnpm-workspace.yaml

プロジェクトごとのpackage.jsonは以下のようにルートのdistにビルドするようにしておく。

package.json
{
  "type": "module",
  "private": true,
  "scripts": {
    "dev": "slidev --open",
    "build": "slidev build --base /2024/not-hate-go/ --out ../../dist/2024/not-hate-go",
    "export": "slidev export --dark --output ../2024-06-28-not-hate-go.pdf"
  }
}

途中でビルドできなくて焦ったが以下のissueで解決

https://github.com/slidevjs/slidev/issues/1695

ぱんだぱんだ

やっぱりCloudflare pagesにデプロイする

netlifyでできたけど結局pnpmのworkspaceを使ったモノレポ管理だがdist配下にすべてbuildしてredirectの設定をすることでルーティングをしているだけなのでモノレポ対応していなくてもデプロイできる。

なので、Cloudflare pagesにデプロイしてみる。

netlify.tomlで設定していたredirectセクションはデプロイ対象のディレクトリ配下に_redirectsというファイルを作成すればok。

/2024/not-hate-go/*    /2024/not-hate-go/index.html   200
/ /index.html 200

あとはデプロイするだけ。

pnpm i -D wrangler
pnpx wrangler login
pnpx wrangler pages deploy dist

まじでデプロイ楽

ぱんだぱんだ

トップ画面

ルートディレクトリを設定していないので何かしら設定しておく。いろいろやり方が考えられたが今回はhome/srcにviteプロジェクトを作成してdist配下にbuildするようにした。

mkdir -p home/src
cd home/src
pnpm create vite@latest talks-home --template vanilla-ts

適当にスライドのリンクを箇条書きしただけのトップページを作ってデプロイ。ほんと楽

このスクラップは5ヶ月前にクローズされました