できない.dev

Vite で「Rollup failed to resolve import」がビルドで消えない

本番ビルド(rollup)が import 先を解決できないと出る。
依存の未インストール・パス誤り・外部化漏れが主因で、install / パス修正 / rollupOptions.external で対処する。

公開: 更新:

実行例あり(2026-09-09 に実環境で検証)

要約

[vite]: Rollup failed to resolve import "X" from "..." は、本番ビルドを担う rollup が、指定された import 先を見つけられないときに出る。

開発サーバーは依存の事前バンドル(Vite 7 までは esbuild、Vite 8 からは Rolldown)が曖昧さを吸収することがあり、vite build で初めて顕在化するのが厄介なところ。
原因は「未インストール」「パス誤り」「外部化漏れ」のいずれかが大半。

Vite 8 はビルドも Rolldown に替わり、同じ原因で [vite]: Rolldown failed to resolve import "X" from "..." と出る。
メッセージが案内する外部化の設定名も build.rolldownOptions.external になる(Vite 8.3.2 で確認)。

実行例

node:20 の Vite 6 で未インストールのパッケージを import したままビルドすると、解決できなかった import 名と参照元ファイルがそのまま表示されてビルドが止まる。build.rollupOptions.external に並べれば同じコードでもビルドは通り、パッケージを入れ直せば依存を取り込んだ成果物が出力されて実行できる。

$ npx vite build
vite v6.4.3 building for production...
transforming...
✓ 1 modules transformed.
✗ Build failed in 17ms
error during build:
[vite]: Rollup failed to resolve import "lodash-es" from "/tmp/tmp.kYOMXaYIDr/src/main.js".
This is most likely unintended because it can break your application at runtime.
If you do want to externalize this module explicitly add it to
`build.rollupOptions.external`
    at viteLog (file:///tmp/tmp.kYOMXaYIDr/node_modules/vite/dist/node/chunks/dep-Dm0c1Wj2.js:46504:15)
    at onRollupLog (file:///tmp/tmp.kYOMXaYIDr/node_modules/vite/dist/node/chunks/dep-Dm0c1Wj2.js:46554:5)
    at onLog (file:///tmp/tmp.kYOMXaYIDr/node_modules/vite/dist/node/chunks/dep-Dm0c1Wj2.js:46202:7)
    at file:///tmp/tmp.kYOMXaYIDr/node_modules/rollup/dist/es/shared/node-entry.js:21274:32
    at Object.logger [as onLog] (file:///tmp/tmp.kYOMXaYIDr/node_modules/rollup/dist/es/shared/node-entry.js:23259:9)
    at ModuleLoader.handleInvalidResolvedId (file:///tmp/tmp.kYOMXaYIDr/node_modules/rollup/dist/es/shared/node-entry.js:22004:26)
    at file:///tmp/tmp.kYOMXaYIDr/node_modules/rollup/dist/es/shared/node-entry.js:21962:26
$ echo $?
1
$ npx vite build
vite v6.4.3 building for production...
transforming...
✓ 1 modules transformed.
rendering chunks...
computing gzip size...
dist/main.js  0.07 kB │ gzip: 0.09 kB
✓ built in 27ms
$ echo $?
0
$ npm install lodash-es --no-audit --no-fund --silent
$ npx vite build
vite v6.4.3 building for production...
transforming...
✓ 641 modules transformed.
rendering chunks...
computing gzip size...
dist/main.js  4.22 kB │ gzip: 1.41 kB
✓ built in 446ms
$ echo $?
0
$ node dist/main.js
[ [ 1, 2 ], [ 3, 4 ] ]

— 2026-09-09 時点の出力

検証環境

検証日
実行環境
node:20 Debian GNU/Linux 12 (bookworm)
バージョン
  • Node.js 20.20.2
  • npm 10.8.2
  • Python 3.11.2
  • Git 2.39.5

この記事の「実行例」は、上記の環境で実際にコマンドを実行して得られた出力をそのまま掲載しています。 再現手順はリポジトリの検証スクリプトとして管理し、定期的に再実行して出力を更新しています。

よくある原因

  1. 未インストール: import しているパッケージが node_modules に無い。
  2. パス・拡張子の誤り: 相対パスやエイリアスの綴り、拡張子が実ファイルと合っていない。
  3. 外部化漏れ: CDN などで外から供給する依存を external 指定していない。
  4. dev と build の差: dev では通っていたが、build の解決規則で落ちる。

解決策

1. 不足パッケージを入れる

npm install lodash-es

まずはメッセージの import 名を package.json と照らし、入れ忘れが無いか確認する。

2. 外部依存を external にする

// vite.config.js
export default {
  build: {
    rollupOptions: { external: ["some-cdn-lib"] },
  },
};

バンドルに含めず外部提供する依存は、external に列挙して rollup の解決対象から外す。

3. エイリアスとパスを合わせる

// vite.config.js
export default {
  resolve: { alias: { "@": "/src" } },
};

@/components/Foo のようなエイリアスを使うなら、resolve.alias の定義と実ディレクトリを一致させる。
相対 import は拡張子とファイル名の大文字小文字まで確認する。

この記事は役立ちましたか?