[PR #138] [MERGED] feat: optimize barrel imports for RSC-incompatible packages #342

Closed
opened 2026-05-06 12:39:19 +02:00 by BreizhHardware · 0 comments

📋 Pull Request Information

Original PR: https://github.com/cloudflare/vinext/pull/138
Author: @gentritbiba
Created: 2/26/2026
Status: Merged
Merged: 3/21/2026
Merged by: @james-elicx

Base: mainHead: feat/optimize-package-imports


📝 Commits (10+)

  • 8584d7a feat: add vinext:optimize-imports plugin for barrel import rewriting
  • 670812f fix: add missing packages to DEFAULT_OPTIMIZE_PACKAGES
  • 2bb4f9e Merge upstream/main and address review feedback
  • e662891 Merge origin/main into feat/optimize-package-imports
  • 922ff5e fix: address bonk review — entryPathCache, buildStart init, Windows path fix, trailing semicolons, fixture-based transform tests
  • 347cc19 fix: correct bySource grouping for mixed namespace+named imports, clear barrelCaches on rebuild
  • a90df2c fix: resolve relative barrel re-export paths to absolute, emit default imports for default re-exports
  • 507911c refactor: extract barrel optimization to plugins/optimize-imports.ts, add Windows path fix and react-server TODO
  • 901d4df fix(optimize-imports): address sixth-pass review comments
  • ed65085 fix(optimize-imports): remove EnvironmentPluginContext cast, expand subpkgOrigin comment

📊 Changes

6 files changed (+1888 additions, -6 deletions)

View changed files

📝 README.md (+7 -6)
📝 packages/vinext/src/config/next-config.ts (+10 -0)
📝 packages/vinext/src/index.ts (+10 -0)
packages/vinext/src/plugins/optimize-imports.ts (+922 -0)
📝 tests/next-config.test.ts (+1 -0)
tests/optimize-imports.test.ts (+938 -0)

📄 Description

Summary

  • Adds vinext:optimize-imports Vite plugin that rewrites barrel imports into direct sub-module imports on the server
  • Prevents RSC crashes caused by eager evaluation of barrel re-exports that call React.createContext() at module top-level
  • Parses barrel entry files to build export maps, handling all re-export patterns (export * as X, export { A, B }, export { default as X }, import * as X; export { X })
  • Uses Vite's own resolver via resolveId hook for pnpm strict hoisting compatibility
  • Only applies on server environments (RSC/SSR) — client uses Vite's dep optimizer
  • Respects experimental.optimizePackageImports from next.config with sensible defaults matching Next.js
  • Lazy-initialized Set<string> for O(1) package lookups

Closes #100
Closes #137

Test plan

  • 19 new unit tests covering plugin existence, guard clauses, all barrel export patterns, caching, aliased exports, mixed exports, and edge cases (syntax errors, unresolvable packages)
  • All 2030 existing tests pass
  • Manual verification with shadcn reproduction repo — page renders without React.createContext crash
  • Lint clean (oxlint) and type check clean (tsgo)

🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.

## 📋 Pull Request Information **Original PR:** https://github.com/cloudflare/vinext/pull/138 **Author:** [@gentritbiba](https://github.com/gentritbiba) **Created:** 2/26/2026 **Status:** ✅ Merged **Merged:** 3/21/2026 **Merged by:** [@james-elicx](https://github.com/james-elicx) **Base:** `main` ← **Head:** `feat/optimize-package-imports` --- ### 📝 Commits (10+) - [`8584d7a`](https://github.com/cloudflare/vinext/commit/8584d7a34aa6b36648fd0a843e154e8632f1219b) feat: add vinext:optimize-imports plugin for barrel import rewriting - [`670812f`](https://github.com/cloudflare/vinext/commit/670812fbdfca3b65ffe22ca4110b7aec282abc40) fix: add missing packages to DEFAULT_OPTIMIZE_PACKAGES - [`2bb4f9e`](https://github.com/cloudflare/vinext/commit/2bb4f9ecab3ba5e358b0087350388581f4091526) Merge upstream/main and address review feedback - [`e662891`](https://github.com/cloudflare/vinext/commit/e662891c6965b02da07677b7b09e036989a9433b) Merge origin/main into feat/optimize-package-imports - [`922ff5e`](https://github.com/cloudflare/vinext/commit/922ff5e0a53cd13e21df49b40846aee8431f55a1) fix: address bonk review — entryPathCache, buildStart init, Windows path fix, trailing semicolons, fixture-based transform tests - [`347cc19`](https://github.com/cloudflare/vinext/commit/347cc1965dae1539430348e821a6aa802d81d7c1) fix: correct bySource grouping for mixed namespace+named imports, clear barrelCaches on rebuild - [`a90df2c`](https://github.com/cloudflare/vinext/commit/a90df2c2a1ab2a6afd8ccad3bdd8fa11aa6e020f) fix: resolve relative barrel re-export paths to absolute, emit default imports for default re-exports - [`507911c`](https://github.com/cloudflare/vinext/commit/507911cb61d7cc71a95eb734f293df52ffde7ad0) refactor: extract barrel optimization to plugins/optimize-imports.ts, add Windows path fix and react-server TODO - [`901d4df`](https://github.com/cloudflare/vinext/commit/901d4df281ddc068f51d692805aba276556606bd) fix(optimize-imports): address sixth-pass review comments - [`ed65085`](https://github.com/cloudflare/vinext/commit/ed650859ec29354322190ed0ec8303f31bf8d6cf) fix(optimize-imports): remove EnvironmentPluginContext cast, expand subpkgOrigin comment ### 📊 Changes **6 files changed** (+1888 additions, -6 deletions) <details> <summary>View changed files</summary> 📝 `README.md` (+7 -6) 📝 `packages/vinext/src/config/next-config.ts` (+10 -0) 📝 `packages/vinext/src/index.ts` (+10 -0) ➕ `packages/vinext/src/plugins/optimize-imports.ts` (+922 -0) 📝 `tests/next-config.test.ts` (+1 -0) ➕ `tests/optimize-imports.test.ts` (+938 -0) </details> ### 📄 Description ## Summary - Adds `vinext:optimize-imports` Vite plugin that rewrites barrel imports into direct sub-module imports on the server - Prevents RSC crashes caused by eager evaluation of barrel re-exports that call `React.createContext()` at module top-level - Parses barrel entry files to build export maps, handling all re-export patterns (`export * as X`, `export { A, B }`, `export { default as X }`, `import * as X; export { X }`) - Uses Vite's own resolver via `resolveId` hook for pnpm strict hoisting compatibility - Only applies on server environments (RSC/SSR) — client uses Vite's dep optimizer - Respects `experimental.optimizePackageImports` from `next.config` with sensible defaults matching Next.js - Lazy-initialized `Set<string>` for O(1) package lookups Closes #100 Closes #137 ## Test plan - [x] 19 new unit tests covering plugin existence, guard clauses, all barrel export patterns, caching, aliased exports, mixed exports, and edge cases (syntax errors, unresolvable packages) - [x] All 2030 existing tests pass - [x] Manual verification with shadcn reproduction repo — page renders without `React.createContext` crash - [x] Lint clean (oxlint) and type check clean (tsgo) --- <sub>🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.</sub>
BreizhHardware 2026-05-06 12:39:19 +02:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
starred/vinext#342
No description provided.