hanzochang
hanzochang
はじめに
対象読者
対象バージョン
主要エラーメッセージ
結論
主な原因:
1. ESMとCommonJSの互換性問題
2. MastraでのPrismaクライアントビルド問題
対処方法
解決方法具体
1. Prismaスキーマの設定最適化
重要なポイント:
2. Prismaクライアントのバージョン更新
3. ESM互換のインポート方法の実装
ビルドにおいては、以下の書き方にする必要があります:
なぜこの書き方が必要なのか:
4. ビルドプロセスの改善
なぜこんな複雑なビルドプロセスが必要なのか:
このスクリプトの処理内容:
なぜビルド後にPrisma generateが必要なのか:
他TIPS
Docker環境でのバイナリ互換性エラー
まとめ
1. ESMとCommonJSの互換性問題
2. MastraでのPrismaクライアントビルド問題
解決のポイント:
参考情報:
https://s3.ap-northeast-1.amazonaws.com/hanzochang.com/_v2/article-ogp-018.png

mastra x prisma ビルドエラー - production buildでprisma generateでclientを生成できない問題の解消

mastraにprismaを組み合わせて本番ビルドを行う際に、prismaのclientがbuildできない問題。ESMとCommonJSの互換性問題が原因で発生するこの問題の解決方法を詳しく解説します。

公開日2025.07.15

更新日2025.07.15

はじめに

この記事は、mastraにprismaを組み合わせて本番ビルドを行う際に発生する、prismaのclientがbuildできない問題について解説します。

実際にmastraでアプリケーションを開発していて、ローカルでは問題なく動作するが、本番環境でビルドしようとするとgenerateできているはずのprisma clientが参照できないという問題に当たりました。

背景として、MastraではPostgreSQLを使ったデータベース操作が推奨されており、公式ドキュメントでも@mastra/pgパッケージを使用したPostgreSQLストレージの実装が提供されています(出典:Mastra Storage Documentation)。しかし、Prismaはクエリビルダとマイグレーション管理が楽なので、今回はPrismaを直接使用することにしました。

対象読者

  • mastraにprismaを組み合わせて本番ビルドを行いたい方
  • prismaのclientがbuildできずに困っている方
  • ESMとCommonJSの互換性問題に悩んでいる方

対象バージョン

- "@mastra/core": "^0.10.12"
- "mastra": "^0.10.12"
- "@prisma/client": "^6.11.1",
- "prisma": "^6.11.1"

主要エラーメッセージ

The requested module '@prisma/client' is a CommonJS module,
which may not support all module.exports as named exports.

prisma generateをビルドプロセスで行っているはずなのに、なぜか生成されない。。調べてみるとESMとCommonJSの互換性問題が原因。

結論

MastraとPrismaを組み合わせた本番ビルドでは、ESMとCommonJSの互換性問題により、PrismaClientのインポートが失敗してしまいます。

Mastraのバンドリングプロセスが標準的なESMインポート文を正しく処理できないことが原因でした。Prismaスキーマの設定最適化、ESM互換のインポート方法の実装、Mastra用のprisma clientビルドプロセスの構築が必要です。

主な原因:

1. ESMとCommonJSの互換性問題

  • MastraはESMでビルドされる:MastraはTypeScriptフレームワークとして、ESM(ES Modules)形式でビルドされます(出典:Mastra公式ドキュメント
  • PrismaはデフォルトでCommonJSで生成される:Prisma v6.11.1では、デフォルトのprisma-client-jsジェネレーターはCommonJSでクライアントを生成します(出典:Prisma公式ドキュメント
  • 結果:この2つのモジュールシステムの違いにより、インポート時に互換性エラーが発生

2. MastraでのPrismaクライアントビルド問題

  • Mastraのビルド環境でのPrismaクライアント不整合:Mastraが.mastra/outputディレクトリにビルドする際、元のPrismaクライアントが正しく参照されない問題が発生します
  • 結果:ビルド後の実行環境でPrismaクライアントが正常に動作しない

対処方法

問題を解決するために、以下の手順で対処していきます:

  1. Prismaスキーマの設定を最適化する
  2. Prismaクライアントを最新版に更新する
  3. ESM互換のインポート方法を実装する
  4. ビルドプロセスを改善する

それぞれ詳しく見ていきましょう。

解決方法具体

1. Prismaスキーマの設定最適化

まず、prisma/schema.prismaのgeneratorセクションを以下のように修正します:

generator client {
  provider   = "prisma-client-js"
  engineType = "binary"
}

重要なポイント:

  • engineType = "binary"でESM互換に

2. Prismaクライアントのバージョン更新

次に、Prismaクライアントを最新版に更新:

pnpm update @prisma/client@^6.11.1
pnpm run prisma:generate

最新版のPrismaクライアントはESM互換性が大幅に改善されているので、この更新だけでも問題が解決する場合があります。

3. ESM互換のインポート方法の実装

通常、PrismaClientを使用する際は、何も意識せずに以下のようにインポートしてしまいます:

import { PrismaClient } from '@prisma/client'

しかし、Mastraの本番ビルドにおいては、この書き方がESMとCommonJSの互換性問題を引き起こします。

ビルドにおいては、以下の書き方にする必要があります:

import pkg from '@prisma/client'
const { PrismaClient } = pkg

なぜこの書き方が必要なのか:

  • 通常の書き方:named importを使用(import { PrismaClient }
  • ESM互換の書き方:default importを使用してから分割代入(import pkg
  • Mastraのビルドプロセスでは、default importの方が確実にCommonJSモジュールと互換性を保てる

4. ビルドプロセスの改善

なぜこんな複雑なビルドプロセスが必要なのか:

通常のNode.jsアプリケーションであれば、prisma generateを一度実行すれば済む話ですが、Mastraの場合は以下の特殊な事情があります:

  1. Mastraは独自のビルドディレクトリを使用mastra buildコマンドで.mastra/outputディレクトリにビルド結果を出力
  2. Prismaクライアントのパス解決問題:ビルド後の環境では、元のPrismaクライアントへのパスが正しく解決されない
  3. ビルド環境とランタイム環境の分離:ビルド時とランタイム時で異なる環境になるため、両方でPrismaクライアントが必要

これらの問題を解決するために、package.jsonのbuildスクリプトを以下のように修正します:

{
  "scripts": {
    "build": "mastra build && cp -r prisma .mastra/output/ && \\
             cd .mastra/output && \\
             pnpm install prisma@^6.11.1 && \\
             pnpm exec prisma generate"
  }
}

このスクリプトの処理内容:

  1. Mastraアプリケーションをビルド:通常のMastraビルドプロセス
  2. Prismaディレクトリを出力先にコピー:ビルド後の環境でもスキーマファイルが参照できるように
  3. 出力先でPrismaクライアントを生成:ランタイム環境で正しく動作するように

なぜビルド後にPrisma generateが必要なのか:

Mastraは独自のビルドシステムにより、.mastra/outputディレクトリでビルド結果を実行します。そのため、この場所でPrismaクライアントを生成する必要があります。

  • Mastraのランタイム環境.mastra/outputディレクトリが実際の実行環境
  • Prismaクライアントの参照:この環境でPrismaクライアントが正しく動作するよう生成が必要

この煩雑なプロセスは、Mastraの独自ビルドシステムとPrismaクライアントの生成タイミングの不整合から生じる問題を解決するための必要な措置です。

他TIPS

Docker環境でのバイナリ互換性エラー

Docker環境(特にAlpine Linux)でバイナリ互換性エラーが発生した場合は、schema.prismaに以下を追加します:

// schema.prismaに追加
generator client {
  binaryTargets = ["native", "linux-musl-openssl-3.0.x"]
}

まとめ

MastraとPrismaを組み合わせた本番ビルドで発生するこの問題は、実際に遭遇してみると結構厄介な問題でした。

この問題は2つの大きな要因で発生します:

1. ESMとCommonJSの互換性問題

  • MastraがESMでビルドされる一方、PrismaがデフォルトでCommonJSで生成される
  • 異なるモジュールシステム間でのインポート処理の違いによりエラーが発生

2. MastraでのPrismaクライアントビルド問題

  • Mastraの独自ビルドシステム(.mastra/outputディレクトリ)での実行
  • ビルド後の環境でPrismaクライアントが正しく参照されない問題

解決のポイント:

  1. ESM互換のインポート方法import pkg from "@prisma/client"を使用
  2. 適切なビルドプロセス.mastra/outputディレクトリでのPrismaクライアント生成
  3. Prismaスキーマの最適化engineType = "binary"でESM互換性を向上

参考情報:

最初は何が原因かわからずに困ってしまいましたが、この記事で紹介した解決方法を段階的に実装することで、安定したMastraアプリケーションを構築できるようになりました。

同じような問題に遭遇している方の参考になれば幸いです。

picture
hanzochang - 半澤勇大
慶應義塾大学卒業後、Webプランナーとして勤務。 ナショナルクライアントのキャンペーンサイトの企画・演出を担当。 その後開発会社に創業メンバーとして参加。 Fintech案件や大手企業のDXプロジェクトに関わり、その後個人事業主として独立し、 2023年にWeb3に特化した開発会社として法人化しました。 現在はWeb3アプリ開発を中心にAI開発フローの整備を行っています。
また、趣味で2017年ごろより匿名アカウントでCryptoの調査等を行い、 ブロックチェーンメディアやSNSでビットコイン論文等の図解等を発信していました。
X (Twitter)

お問い合わせはこちらから

ご希望に応じて職務経歴書や過去のポートフォリオを提出可能ですので、必要な方はお申し付けください。
また内容とによっては返信ができない場合や、お時間をいただく場合がございます。あらかじめご了承ください。