Rollupビルドの外部依存設定に `@rails/activestorage` を追加

basecamp/lexxy

@rails/activestorage を devDependencies へ移動したことで発生していたRollupのビルド失敗を、external 設定の追加によって解消しました。

背景

@rails/activestorage が devDependencies へ移動したことで、Rollupがバンドル時にこのパッケージをチャンク分割しようとするようになりました。しかし rollup.config.mjs では出力先として output.dir ではなく output.file が指定されており、Rollupがコード分割(chunking)を試みると「output.file 使用時はチャンク分割できない」というエラーでビルドが失敗する状態になっていました。

NPM公開用の設定ファイル rollup.config.npm.mjs では、同パッケージはすでに external に列挙されていたため問題はありませんでした。今回の変更はアセットビルド用の設定ファイルへ同様の設定を追加することで、両設定の整合性を取るものです。

技術的な変更

rollup.config.mjsexternal フィールドを追加し、@rails/activestorage をバンドル対象から除外するよう指示しました。

変更前:

export default [
  {
    // ...
    plugins: [
      nodeResolve(),
      commonjs(),
    ]
  }
]

変更後:

export default [
  {
    // ...
    external: [
      "@rails/activestorage"
    ],
    plugins: [
      nodeResolve(),
      commonjs(),
    ]
  }
]

あわせて rollup.config.npm.mjs では、文字列リテラルのクォートがシングルクォートからダブルクォートに統一されました。@rails/activestorage の記述も同様にダブルクォートへ揃えており、機能的な変更は含まれていません。

この設定変更を受け、ビルド成果物である lexxy.jslexxy.min.js およびそれぞれの圧縮済みファイル(.br.gz)が再生成されています。

設計判断

external による除外 という最小限のアプローチが採用されました。

output.file から output.dir へ変更してコード分割を許容する方法も技術的には取り得ますが、それは出力構造全体への影響を伴います。今回は @rails/activestorage をバンドルに含める必要がそもそもない(利用側の環境に存在する前提の依存関係である)ため、external で除外することが最も適切な対処です。rollup.config.npm.mjs でも同パッケージが external に列挙されていたことが、この判断の根拠を裏付けています。

まとめ

output.file 指定時のRollupの制約と external 設定の関係を突いた、ピンポイントかつ低リスクな修正です。devDependencies への移動という依存関係の変更がビルド設定に波及するケースとして、Rollupを使うプロジェクトでの参考になる変更といえます。

記事メタデータ

Generated by:
Claude Sonnet 4.6 for DiffDaily
LLM Trace:
b760c4ec

この記事はAIによって自動生成されています。内容の正確性については、必ずソースコードやPRを確認してください。

品質レビュー結果

Review Status:
承認済み
Review Count:
1回
Reviewed by:
Gemini 2.5 Pro for DiffDaily

Review Criteria:

記事構成 ✓ PASS

Title, Context, Technical Detailの存在と明確さ

リード文(総論)、背景・技術詳細・設計判断(各論)、まとめ(結論)という「総論→各論→結論」の構成が記事全体で明確に適用されており、非常に理解しやすい構造です。

カスタムMarkdown構文 ✓ PASS

シンタックスハイライト・GitHubリンク記法の正確性

ファイル名付きシンタックスハイライト(`javascript:rollup.config.mjs`)およびGitHubのPRリンク記法が正しく使用されています。

対象読者への適合性 ✓ PASS

エンジニア向けの適切な技術レベルと表現

Rollupのビルド設定という専門的なトピックを扱っており、前提知識を持つエンジニアという対象読者に適した技術レベルと語彙で記述されています。

パラグラフ・ライティング ✓ PASS

トピックセンテンス・1段落1トピック・段落長

各セクションが総論→各論の構成になっており、各段落がトピックセンテンスで始まるなど、パラグラフ・ライティングの原則が徹底されています。これにより、非常に高い可読性が確保されています。

Diff内容との照合 ✓ PASS

コードブロックとDiff内容の一致

`rollup.config.mjs`への`external`プロパティの追加、および`rollup.config.npm.mjs`でのクォート統一という変更点を、提供されたDiffと完全に一致する形で正確に引用・説明できています。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

`Rollup`, `devDependencies`, `external`, `chunking`など、フロントエンドのビルドプロセスに関する技術用語が文脈に応じて正確に使用されています。

説明の技術的正確性 ✓ PASS

技術的主張の正確性と論理性

「`output.file`指定時はチャンク分割できない」というRollupの制約と、それがビルド失敗の原因であったという説明は技術的に正確であり、PR Descriptionの内容とも一致しています。

事実の突合 ✓ PASS

PR情報による主張の裏付け(ハルシネーション検出)

記事内のすべての主張は、PRのDescriptionやDiffの内容によって裏付けられています。特に「設計判断」セクションは、PRの文脈から代替案を考察し、採用されたアプローチの妥当性を論理的に説明しており、ハルシネーションは見られません。

数値・固有名詞の確認 ✓ PASS

PR番号・コミットID・バージョン等の正確性

PR番号(#813)やファイル名(`rollup.config.mjs`など)、パッケージ名(`@rails/activestorage`)などの固有名詞はすべて正確です。

タイトル・説明との一致 ✓ PASS

記事タイトル・説明とPR内容の一致

PRのタイトル「Fix build」を、具体的な修正内容を示す「Rollupビルドの外部依存設定に `@rails/activestorage` を追加」という、より分かりやすいタイトルに適切に具体化できています。

外部知識の正確性 ✓ PASS

PRに記載のない外部知識(LTS、サポート状況など)の不使用

記事はPRで提供された情報に限定されており、バージョンのサポート状況やリリース予定といった、PRに記載のない外部知識の追記は見られません。

時間表現の正確性 ✓ PASS

時間表現がPR情報と一致しているか

「`devDependencies`へ移動した」「すでに列挙されていた」など、変更の背景や時間的な前後関係を示す表現がPRの文脈と一致しており、正確です。