mottox2 blog

Next.js 9からTypeScriptの利用方法が変わるのでまとめてみた

dev

ZEIT社が開発しているReact製のフレームワークNext.jsですが、現在v.8.1.1のカナリー版がリリースされています。
v.9では様々な変更が入っていますが、個人的に注目しているのはTypeScriptが標準で利用可能になった点です。そこで備忘録を兼ねて型の書き方を整理してみました。

カナリー版の段階で書いた記事を更新しました。

Next.js 8からの変更点

  • TypeScriptを利用するためにwebpackの設定を行う@zeit/next-typescript パッケージが不要になりました。
    • このパッケージはnext.config.js内で利用しwebpackとbabelの設定を弄る役割を担っていました。内部にビルドインになりました。
  • 型定義は@types/nextのものを使っていましたが、next.jsの本体側で型定義を持つようになりました。
  • ForkTsCheckerWebpackPluginがデフォルトで有効になっています
    • 雑な型を書いていると既存のプロジェクトを上げる際にエラーになり、ビルドでコケるようになります。
  • つまり、v9からはnextだけインストールすればTypeScriptが利用できるようになります。
関連Pull Request

Add Typescript compilation by timneutkens · Pull Request #7110 · zeit/next.js
Add automatic TypeScript setup by ijjk · Pull Request #7125 · zeit/next.js
Add .d.ts for next-server by timneutkens · Pull Request #7133 · zeit/next.js
Add declaration files by lfades · Pull Request #7118 · zeit/next.js
Add types for getInitialProps by lfades · Pull Request #7162 · zeit/next.js

型の使用例

Page Component

pages/以下に配置するとルーティングと対応するコンポーネントの例です。

pages/index.tsx
import  { NextPage } from 'next'

interface Props {
  books: Book[]
}

const Index : NextPage<Props> = () => {
  return <div>
    <p>Hello World</p>
  </div>
}

index.getInitialProps = async ({req}) => {
  // do something
}

Page Component (class component)

Hooks以前のクラスコンポーネントでの書き方

tsx
class Index extends React.Component<Props> {
  static getInitialProps = async ({ query }: NextPageContext) => {
  }

  render {
    return <div/>
  }
)

Page Component w/ router

withRouterを使ってコンポーネント内でルーターを触るパターンです。

pages/index.tsx
import  { NextPage } from 'next'
import { withRouter } from 'next/router'
import { WithRouterProps } from 'next/dist/client/with-router'

interface Props {
  books: Book[]
}

const Index : NextPage<WithRouterProps & Props> = () => {
  return <div>
    <p>Hello World</p>
  </div>
}

index.getInitialProps = async ({req}) => {
  // do something
}

export default withRouter(Index)
B!
dev

なぜSPA技術でウェブサイトをつくるのか?

ここ最近、SPAを作るフロントエンドエンジニアを中心に、アプリケーションではないウェブサイトもReactやVueで作る動きが活発になってきました。 - そもそもなぜReactやVueを使ってウェブ

spa
tips

VSCodeの調子が悪い時はVSCode Insidersに避難しよう

> 私のVSCode遅くない?私のVSCode遅くない? 自分は普段から『VSCode』(Visual Studio Code)を愛用していて、RubyやPythonなどJavaScript/Ty

vscodepoem
event

「技術書典7」にサークル参加してきた

2019/09/22に池袋で開催された技術書典にサークル参加してきました。今回はJAMStackの既刊を持たず、Slack App開発本を2冊頒布してきました。 だいぶ遅れてしまいましたが、「ブロ

技術同人誌