created: 2020-09-06T06:43:45.000Z

既存のtypescriptプロジェクトにnextjsのSSGを導入する

簡単に追加できる。

準備

nextを入れる

$ npm install next

src/pages配下にtsxを作成

$ touch ./src/pages/index.tsx

なお、nextはトップレベルではなくsrc配下にpagesディレクトリを作ってもちゃんとそこを認識してくれるようだ。

Pages can also be added under src/pages as an alternative to the root pages directory. The src directory is very common in many apps and Next.js supports it by default.

index.tsx

index.tsxはこんな感じ

import { GetStaticProps } from "next";
import React from "react";

export default ({ hello }: { hello: string }) => <h1>{hello}</h1>;

// 
export const getStaticProps: GetStaticProps = async () => {
  const hello = "helloworld";
  return { props: { hello } };
};
  • getStaticProps
    • next export の時に呼ばれて、結果がdefault関数にpropsとして渡される
  • default関数
    • このページのhtmlを生成するコンポーネント

動作確認

$ npx next build && npx next export && npx next start &

...

$ ready - started server on http://localhost:3000
$ curl http://localhost:3000
<!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><noscript data-n-css="true"></noscript><link rel="preload" href="/_next/static/chunks/main-087f27b04f4c732ab1a1.js" as="script"/><link rel="preload" href="/_next/static/chunks/webpack-e067438c4cf4ef2ef178.js" as="script"/><link rel="preload" href="/_next/static/chunks/framework.cb05d56be993eb6b088a.js" as="script"/><link rel="preload" href="/_next/static/chunks/f6078781a05fe1bcb0902d23dbbb2662c8d200b3.00aaea69a4bfc61676f6.js" as="script"/><link rel="preload" href="/_next/static/chunks/pages/_app-af1b8e54567fd58d71e4.js" as="script"/><link rel="preload" href="/_next/static/chunks/pages/index-cc4f0e2bbac07be32208.js" as="script"/></head><body><div id="__next"><h1>helloworld</h1>

...

その他

typescript環境で動かすとnextが勝手にtsconfig.jsonを変更する。

+    "allowJs": true,
+    "skipLibCheck": true,
+    "forceConsistentCasingInFileNames": true,
+    "noEmit": true,
+    "isolatedModules": true

また、next-env.d.ts というファイルがトップレベルに作成される。

/next-env.d.ts
@@ -0,0 +1,2 @@
+/// <reference types="next" />
+/// <reference types="next/types/global" />

デフォルトだと以下にビルド結果のファイルが作られるので .gitignore に追加しておく。

+# next
+/out
+/.next