Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
pnpm monorepo で ビルドいらずの パッケージ参照を実現する
Search
offich
May 12, 2026
Programming
0
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
pnpm monorepo で ビルドいらずの パッケージ参照を実現する
offich
May 12, 2026
More Decks by offich
See All by offich
Firebase Dynamic Link が非推奨になったのでふりかえる
offich
0
820
Nuxt 3 移行に向けてがんばっています
offich
0
2.7k
Other Decks in Programming
See All in Programming
PostgreSQL 18で考えるUUID主キー
kazuhiro1982
0
460
Lean は証明の正しさを確認するためだけのツールって思ってませんか?
inoueasei
1
150
AI時代のPHPer生存戦略 ~「言語、もうなんでもよくない?」に本気で向き合う~
vivion
0
250
進化を続けるGo toolsの現在地 / The Current State of Ever-Evolving Go Tools
hond0413
0
150
テーブルをDELETEした
yuzneri
0
140
JAWS-UG横浜 #102 AWSサ終供養LT会 成仏できない AWS サービスたち 〜本日、三体供養します〜
maroon1st
0
330
Detecting Compromised CI with eBPF and Cilium Tetragon
lizrice
0
160
仕様駆動開発の消費期限
watany
16
7k
改善しないと、タスクが回らない。 “てんこ盛りポジション” を引き継いだ情シスの、入社3ヶ月の業務改善録
krm963
0
260
S3 を使うアプリケーションをローカル完結で動かすことに全力を注いでみた / Running S3 Apps Offline
contour_gara
0
370
komatsuna「分散システムにおけるバグ分析手法」
komatsunaqa
0
240
ソフトウェア設計に溶けるインフラ ― AWS CDK のインフラ認識論
konokenj
3
760
Featured
See All Featured
Color Theory Basics | Prateek | Gurzu
gurzu
0
410
Prompt Engineering for Job Search
mfonobong
0
400
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
3
1.1k
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
2
250
VelocityConf: Rendering Performance Case Studies
addyosmani
333
25k
Designing for Timeless Needs
cassininazir
1
430
WCS-LA-2024
lcolladotor
0
790
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
330
30 Presentation Tips
portentint
PRO
1
360
Automating Front-end Workflow
addyosmani
1370
210k
HDC tutorial
michielstock
2
780
Transcript
pnpm monorepo で ビルドいらずの パッケージ参照を実現する Custom Condition という選択肢 1
自己紹介 offich 時期によって Flutter か Web の開発をやっています 一児のパパ 趣味はカラオケと居酒屋巡り 2
今日話すこと monorepo でコンポーネントライブラリを変更するたびにビルドが必要になる問題 package.json の Custom Condition を使ってビルドを不要にする方法 Astro(SSR あり)での設定の注意点
3
背景:monorepo でよくある問題 コンポーネントカタログサイトがコンポーネントライブラリに依存している packages/ component-lib/ ← React コンポーネント群 catalog-site/ ←
Astro コンポーネントカタログサイト カタログサイトの package.json : { "dependencies": { "@myorg/component-lib": "workspace:*" } } 4
問題:開発のたびにビルドが必要 コンポーネントライブラリが dist/ を publish ターゲットにしているため component-lib/ src/ ← TypeScript
ソース dist/ ← ビルド成果物(.mjs / .cjs / .d.mts) カタログサイトの Vite が解決するのは dist/ の成果物 コンポーネントライブラリを変更 ↓ pnpm --filter component-lib build ← 毎回これが必要 ↓ カタログサイトで変更が反映される 開発体験が悪い 5
解決策:Custom Condition Node.js / Vite の 条件付きエクスポート(Conditional Exports) の仕組みを使う package.json
の exports フィールドにカスタムの条件を追加し、 開発時だけ TypeScript ソースを直接参照 させる コンポーネントライブラリを変更 ↓ 即座に反映される (ビルド不要) 6
コンポーネントライブラリ側の設定 @lib/source という条件が有効なときだけ ./src/index.ts を返す packages/component-lib/package.json { "exports": { ".":
{ "@lib/source": "./src/index.ts", // ← カスタムコンディション "types": { "import": "./dist/index.d.mts", "require": "./dist/index.d.cts" }, "import": "./dist/index.mjs", // 通常はビルド成果物 "require": "./dist/index.cjs" } } } 7
注意:条件の順番が重要 カスタムコンディションは exports 内で一番上に配置すること Node.js / Vite は条件を上から順に評価し、最初にマッチしたものを使う { "exports":
{ ".": { "@lib/source": "./src/index.ts", // 一番上に置く "import": "./dist/index.mjs", // 下にあるので @lib/source が優先される "default": "./dist/index.mjs" } } } import れる や types より下に置くと先にマッチしてしまい、カスタムコンディションが無視さ 8
カタログサイト側の設定 packages/catalog-site/astro.config.mjs const resolve = process.env.NODE_ENV === "development" ? {
conditions: ["@lib/source"] } // ← 開発時のみ有効化 : undefined; export default defineConfig({ vite: { resolve: resolve, ssr: { noExternal: ["@myorg/component-lib"], resolve: resolve, }, }, }); 9
動作の仕組み import { Button } from "@myorg/component-lib"; 開発時( NODE_ENV=development )
Vite が exports を解決 → conditions に "@lib/source" が含まれる → "./src/index.ts" を返す → ビルド不要でソース直参照 本番ビルド時( NODE_ENV=production ) Vite が exports を解決 → conditions に "@lib/source" が含まれない → "./dist/index.mjs" を返す → 通常のビルド成果物を参照 10
SSR(Astro)での注意点 Astro は SSR を持つため、Client / Server 両側 で条件を設定する必要がある vite:
{ // クライアントサイドバンドル向け resolve: { conditions: ["@lib/source"] }, ssr: { // サーバーサイドバンドル向け noExternal: ["@myorg/component-lib"], // ← これも必要 resolve: { conditions: ["@lib/source"] }, }, } を指定しないと SSR バンドル時にコンポーネントライブラリが外部扱いされ、 カスタムコンディションが無視される noExternal 11
Custom Condition のメリット・デメリット 内容 ビルド不要で即座にソース変更が反映 HMR が正しく動作する 本番ビルドは従来と変わらない Vite /
バンドラ側での設定が必要 TS ソースをそのまま食わせるため、消費側が TS に対応している必要がある カスタム条件名の命名を慣習として統一する必要がある 12
代替手法との比較 手法 Custom Condition exports["."]=src/ に直接向け る vite-plugin-turbo-resolve 等 tsconfig
paths 毎回 build ビルド不 設定コス 備考 要 ト 低 今日の話 本番も src 参照になってしま 低 う 中 追加依存が増える 中 バンドラによっては動かない なし 開発体験が辛い 13
まとめ 1. package.json の exports に カスタムコンディション を追加 "@lib/source": "./src/index.ts"
2. 開発時のみ Vite に条件を渡す conditions: ["@lib/source"]; 3. Astro(SSR あり)は ssr.noExternal + ssr.resolve.conditions も設定 ビルドいらずで TypeScript ソースを直参照、開発体験が大きく改善 14
ありがとうございました コンポーネントライブラリ × コンポーネントカタログサイト 15