ymmr
Recent Articles
    公開日: 2023/11/04

    GitHub Actions で Next.js の型参照エラーが起きる問題を解消する

    Next.js でプロジェクトをつくるとき、GitHub Actions で TypeScript のコンパイルエラーをチェックする様に設定しています。しかし、最近になってローカル環境では発生しないエラーを吐いていることに気づきました。調べてみると next-env.d.ts というファイルに原因があるようなので、暫定的な回避策を記事にします。

    next-env.d.ts とは

    Next.js が提供する型を参照している型定義ファイル です。next build または next dev を実行すると自動生成されます。内容をみると node_modules 下の next/index.d.ts および next/image-types/global.d.ts を読み込んでいることがわかります。

    next-env.d.ts
    /// <reference types="next" />
    /// <reference types="next/image-types/global" />
    
    // NOTE: This file should not be edited
    // see https://nextjs.org/docs/basic-features/typescript for more information.
    

    エラーとその原因

    create-next-app の環境下において、next-env.d.ts は .gitignore の対象になっています。そのため、CI 上でコードのチェックアウトと依存パッケージのインストールを実行しただけでは生成されません。それに起因して、TypeScript によるチェック tsc --noEmit が失敗しているようです。

    対応方法

    こちらの Issue にある通り、いくつかの対応方法 (next-env.d.ts をコミットしてしまう等) が考えられます。ここでは、ワークフロー内にビルド処理を追加することで next-env.d.ts を生成する方法を採りました。

    まずは package.json に postinstall スクリプトを追加します。

    package.json
    {
      "scripts": {
         "lint": "npm run -s lint:es; npm run -s lint:style",
         "test:ci": "jest --ci --silent --passWithNoTests",
         "type": "bash -c tsc --noEmit",
    +    "postinstall": "next build"
       },
    

    すると npm ci によるパッケージのインストールが実行された後に、next build コマンドが動きます。このタイミングで next-env.d.ts も生成されるためエラーは解消されます。しかし、ビルドキャッシュが有効になっていないという警告が出てきました。

    Next.js のドキュメントに従って、ビルドキャッシュを利用するための設定を追加します。

    .github/workflows/pull-request.yml
     jobs:
       main:
    +  - uses: actions/cache@v3
    +    with:
    +      path: |
    +        ~/.npm
    +        ${{ github.workspace }}/.next/cache
    +      key: ${{ runner.os }}-nextjs-${{ hashFiles('**/package-lock.json') }}-${{ hashFiles('**/*.js', '**/*.jsx', '**/*.ts', '**/*.tsx') }}
    +      restore-keys: |
    +        ${{ runner.os }}-nextjs-${{ hashFiles('**/package-lock.json') }}-
         - name: install dependencies
           run: npm ci
         - name: run Prettier
         - name: run Jest
           run: npm run test:ci
         - name: run TypeScript Compiler
           run: npm run type
    

    これでビルドキャッシュが有効になるため、2 回目以降の実行時間は短縮されます。

    おわりに

    GitHub Actions で TypeScript のエラーチェックを動かすため、ワークフローにビルドを組み込みました。本来不要なことをやっているので、キャッシュを使うとはいえ実行時間の観点から望ましくありません。何かよい方法をご存知であれば、ぜひ教えていただきたいです 🙏

    参考

    next-env.d.tsの意味 - Qiitaはじめにcreate-next-appをしてプロジェクトを作成した時に作成される、next-env.d.tsというファイルがあります。このファイルの中身は///の後にxmlが書かれているような内…qiita.com