Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
pnpm monorepo で ビルドいらずの パッケージ参照を実現する
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
offich
May 12, 2026
Programming
14
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
仕様駆動開発による爆速プロダクト開発 / Bakusoku Spec Driven Development
kobakei
0
130
すこし踏み込む CancellationToken
htkym
2
880
MVNOの申込からeSIM開通までをiOSアプリでつなぐ- 本人確認・MNP・通信事業者基盤をまたぐ実装
satotakeshi
0
460
フロントエンドUIフレームワークのこれまでとこれから
ssssota
5
2.9k
iOS 27でニュースアプリはどう変わる!? 〜日経電子版の新機能対応と、開発事例から〜
lynnswap
1
12k
What We Talk About When We Talk About XP
m_seki
2
680
個人開発基盤をまるごとCloudflareに引っ越して爆速で総合的体験を向上させた話
tinykitten
0
200
Apple Intelligence を用いた個人情報誤送信防止、及びユーザーリクエスト体験の改善について
yukiny
0
120
手動確認はもう限界 〜XCUITestでCustom URL Schemeの遷移を起動種別ごとに自動テストする〜 / Testing Custom URL Schemes with XCUITest
otouto
0
330
スマート反転とウェブアクセシビリティ
camiha
0
210
市販E-Readerを乗っ取れ 〜Embedded Swiftで電子ペーパーガジェットを制御する〜
trickart
0
200
【高い買い物LT会】初任給で話題の国産フィジカルAIを買った話
akagami
PRO
0
170
Featured
See All Featured
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
3k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
2.1k
How to train your dragon (web standard)
notwaldorf
97
6.8k
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
830
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
250
Deep Space Network (abreviated)
tonyrice
0
320
A better future with KSS
kneath
240
18k
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
2k
GraphQLの誤解/rethinking-graphql
sonatard
75
12k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
23k
Prompt Engineering for Job Search
mfonobong
0
460
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
700
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