You have spent four hours meticulously tuning your bundle size with manualChunks, trimming kilobytes off your vendor chunks. The local build passes. You push to production, only to be greeted by a “Maximum call stack size exceeded” error in CI or, worse, a silent “white screen of death” at runtime. It is a visceral frustration known only to those managing large-scale Vite, Nuxt, or SvelteKit architectures.
In a natural build environment, the bundler “flows” like water through the module graph, automatically finding the most efficient topological sort order. Your use of manualChunks is an attempt to build a dam to redirect that flow for the sake of better cacheability or performance. But when this dam is poorly configured, it does not just redirect the water; it creates stagnant, toxic whirlpools—Circular Triggers—that destabilize the entire application.
Modern web application integrity relies on the deterministic behavior of the build pipeline, yet the very abstractions that provide developer velocity in Vite and Rollup simultaneously introduce complex, non-linear failure modes. While manualChunks offers surgical precision for performance, it frequently severs the topological arteries of the module graph.
This investigation moves beyond general optimization guides into the forensic pathology of the module graph. We will deconstruct high-severity edge cases—specifically those manifesting as runtime initialization crashes or execution deadlocks—to establish a causal link between specific configuration patterns and system instability. By examining the mechanisms of circular triggers, entry point pollution, and CI-specific non-determinism, we provide the architectural diagnostic needed to stabilize your production pipeline.
The Anatomy of a Broken Build: Why manualChunks Fails
To understand why a build fails, one must first accept that a modern frontend project is not a collection of files, but a complex graph theory problem. In this model, every file serves as a node, and every import statement functions as a directed edge.
Under standard conditions, Rollup—the engine powering Vite’s build process—acts as a mathematical arbiter. It traverses this graph using a graph coloring algorithm to identify Strongly Connected Components (SCCs). These SCCs are subsets of nodes where every node is reachable from every other node within that same subset. By identifying these components, the bundler can guarantee that dependencies are grouped to ensure synchronous availability during execution.
The conflict arises when manualChunks intervenes in this automated process. This is the heart of the Jigsaw Graph Paradox: the bundler is attempting to solve the puzzle based on how the pieces naturally fit, but manualChunks forces specific pieces into pre-defined boxes. You are mandating a rigid assignment of nodes to chunks, which frequently overrides the topological sort order required for safe execution.
The Graph Coloring Paradox: Why Structure Collapses
When you manually override the bundler’s heuristic assumptions, you risk disrupting the internal logic that prevents execution deadlocks. Rollup’s default behavior is to merge modules that share dependencies into common chunks to preserve the integrity of the module graph. By forcing a split, you introduce “illegal” edges that the execution environment cannot resolve.
The Deadlock Mechanism
The most pathological state occurs when manual intervention creates a cross-chunk circular dependency. This isn’t a simple coding error; it is a structural “toxic whirlpool” created by the following sequence:
- Node Assignment: Module A is explicitly assigned to Chunk X.
- The Outbound Edge: Module A imports Module B, which your configuration has assigned to Chunk Y.
- The Fatal Return: Module B transitively imports Module C, which the configuration pulls back into Chunk X.
In a natural, unconstrained build, Rollup would recognize this cycle and co-locate these modules within a single chunk to maintain a valid topological sort. By forcing them apart, you create a state where Chunk X cannot fully initialize without Chunk Y, but Chunk Y is waiting on a module trapped inside Chunk X.
This disruption of the graph’s natural flow doesn’t just lead to larger bundles; it creates a non-linear failure mode where the build may succeed in a local environment but fail in CI due to subtle differences in how the graph is traversed and colored across different file systems or Node.js versions.
The “Circular Trigger”: Solving the `ReferenceError` at Runtime
If you are currently staring at a blank white screen and a ReferenceError: [Variable] is not defined in your production console, you aren’t dealing with a simple coding mistake. You have encountered the Circular Trigger—a high-severity architectural failure that occurs when your manual chunking strategy inadvertently creates a “stagnant whirlpool” in your module graph.
This failure mode is particularly insidious because it often bypasses local development checks, only manifesting during the minification and chunking phases of a production build. It represents a state where the module resolution logic has collapsed into a recursive loop, leaving your application in a Temporal Dead Zone (TDZ).
The Forensic Trace: Anatomy of a Trigger
The “Circular Trigger” isn’t a random occurrence; it follows a specific, repeatable path discovered during forensic analysis of failed Rollup builds. When you force modules into specific chunks, you create a dependency chain that eventually bites its own tail.
- The Entry Point: Your
main.jsorindex.htmlinitiates the load. - The Dependency: The entry point imports a third-party library (like React or a UI kit).
- The Interop: Because these libraries often use CommonJS, Vite/Rollup injects
commonjsHelpersto bridge the gap to ESM. - The Manual Chunk: Your configuration forces these helpers or the library into a “vendor” or “common” chunk.
- The Fatal Loop: That manual chunk—to resolve a shared utility—transitively pulls in a module that requires the environment already be initialized by the Entry Point.
The “commonjsHelpers” Debris
In our core analogy, if manualChunks is the dam, then commonjsHelpers is the debris that gets caught in the spillway. Rollup uses these helpers to handle module.exports and require logic. When you implement a manual chunking strategy, Rollup often tries to be “helpful” by hoisting or grouping these helpers into a shared chunk to avoid duplication.
However, if that shared chunk inadvertently pulls in a module that expects the main entry point to be fully executed, you create an execution deadlock. The entry point is waiting for the manual chunk to initialize, but the manual chunk cannot finish because it is waiting for a variable that only exists once the entry point is done. The result? A ReferenceError at runtime or a Maximum call stack size exceeded error during the build phase as the bundler tries to resolve the infinite recursion.
Diagnostic Steps: Visualizing the Whirlpool
To solve this, you must stop guessing and start measuring. You need to see the “looping” arrows that are strangling your execution flow.
- Rollup Plugin Visualizer: Generate a network diagram of your chunks. Look for “Common” or “Vendor” chunks that have unexpected back-references to your application’s entry logic.
- Vite Plugin Inspect: This is the most powerful tool for “on-the-scene” forensics. It allows you to see the transformed state of every module. Search for
commonjsHelpersand track which chunk they have been assigned to. - The Dependency Trace: If you see a “ReferenceError,” check the stack trace. If the error points to a line inside a
commonjs-sharedutility, you have confirmed a Circular Trigger.
You are not looking for a syntax error; you are looking for a topological sort failure. The bundler has lost its ability to determine which file should run first. By identifying exactly where the commonjsHelpers are being hoisted, you can begin to dismantle the “dam” and restore a natural flow to your module graph.
Maximum Call Stack Size Exceeded: Debugging Build-Time Hangs
The most unnerving failure in a Vite or Rollup pipeline isn’t an error message—it is silence. You trigger a production build, the progress bar reaches “transforming…” or “rendering chunks,” and then the process simply stops. Minutes pass. The fans on your machine spin up, but there is no output. Eventually, after ten or fifteen minutes of terminal stasis, the process collapses with a Maximum call stack size exceeded error.
This is not a traditional memory leak. It is a pathological recursion within Rollup’s Module Analysis Phase.
Symptoms vs. Root Cause
| Symptom | Root Cause |
|---|---|
| Build Hang: Process stalls at “transforming” or “rendering chunks” for 10+ minutes. | Infinite Loop: The bundler is trapped in a recursive cycle attempting to assign modules to chunks. |
| Local Success / CI Failure: The build passes on a MacBook but crashes in GitHub Actions. | Stack Depth Limits: CI containers often have lower stack size limits or different Node.js memory defaults. |
Stack Overflow: Maximum call stack size exceeded without a specific file reference. | Constraint Conflict: manualChunks is forcing a split that violates the graph’s topological requirements. |
The Mechanics of the Crash
In a standard build, Rollup is remarkably resilient. When it encounters a circular dependency, it usually issues a warning and proceeds by merging the offending modules. However, when you introduce manualChunks, you transition from a standard warning to a Pathological Circular Trigger.
The crash occurs because manualChunks imposes a rigid constraint on the bundler’s graph coloring algorithm. If Module A and Module B have a high-frequency circular dependency, and your configuration forces them into separate chunks, the bundler enters a recursive loop. It attempts to find an “optimal” split point that satisfies your manualChunks rule while maintaining a valid execution order. Because the cycle is unbreakable, the algorithm calls itself infinitely, deeper and deeper, until the Node.js stack limit is hit.
The “Stagnant Whirlpool” Vacuum
In our core analogy, if the manual chunking is a dam, then this infinite recursion is the water spinning so fast and deep it creates a vacuum that collapses the entire system. The bundler logic is effectively trying to “un-circulate” a circular graph by moving modules back and forth between chunks, never reaching a deterministic failure state until the hardware gives up.
The CI Factor: Why It “Works on My Machine”
Architects often lose hours debugging these hangs because they are non-deterministic across environments. A local development machine with 32GB of RAM and a high default stack size may barely squeeze through the module analysis phase. However, a containerized CI environment (like a standard GitHub Actions runner) has much tighter constraints. Slight differences in Node.js versions between your local environment and your build agent can also change how the recursion depth is managed, turning a “slow build” on your laptop into a “hard crash” in production.
This “Ghost Bug” profile is the hallmark of a manualChunks conflict. If your build is hanging without a line number to guide you, the problem isn’t your code—it’s the impossible puzzle you’ve asked the bundler to solve.
Entry Point Pollution: When “Lazy” Chunks Become Eager
One of the most confounding experiences for a build engineer is performing a forensic examination of the network waterfall and discovering that a 500KB library, explicitly isolated into a “lazy” manual chunk, is being fetched immediately on the homepage. This is Entry Point Pollution. It is the moment your architectural boundaries dissolve, and what was intended to be a deferred, background load is “promoted” to a critical, eager dependency.
The Shared Ancestry Trap
The root of this pollution is rarely a blatant import error; it is usually a Shared Ancestry Trap. This occurs when your main entry point and your manual chunk share even a single, minuscule dependency—perhaps a utility as trivial as is-object.js or a shared constant file.
In the Jigsaw Graph Paradox, forcing a specific piece (like a heavy fabric.js instance) into a manual “box” can inadvertently drag an entire table’s worth of dependencies with it if the “glue”—the shared transitive dependencies—is too strong. In older versions of Vite and Rollup, the bundling algorithm often favored “merging up” to ensure synchronous availability. To satisfy the requirement that both the entry point and the manual chunk have access to that shared utility, the bundler would effectively merge the manual chunk’s graph into the entry point’s eager execution path.
Intended Behavior vs. Forensic Reality
| Aspect | Intended (Lazy) Behavior | Forensic (Eager) Reality |
|---|---|---|
| Network Priority | Low/Idle (Fetched on route change) | High (Blocks DOMContentLoaded) |
| Bundle Logic | Isolated “Island” of code | “Leaked” into the Main Entry Point |
| Execution | Environment-ready (DOM/Auth active) | Pre-mature (Triggers runtime crashes) |
The Stability Hazard: Environment Mismatch
Entry point pollution is more than a performance tax; it is a stability hazard. When a manual chunk is promoted to eager loading, it often executes in an environment it wasn’t designed for. If your admin-dashboard.js chunk expects a fully hydrated DOM or an authenticated global state, but it gets pulled into the login.js entry point due to a shared utility, it will trigger immediate runtime failures.
The Silent Killer: Top-Level Await (TLA) Deadlocks
The most severe manifestation of this pollution occurs with Top-Level Await (TLA). Imagine your entry point contains a TLA call, such as await initDatabase(). This pauses the execution of the entire module graph until the promise resolves. If that entry point has polluted a manual chunk that transitively depends back on the entry point’s exports, you create a silent deadlock in the browser. The browser cannot finish the entry point because it’s waiting on the chunk, and the chunk cannot finish because it is waiting for the entry point’s TLA to resolve. The result is an application that simply never boots, with no error in the console.
The Solution: output.onlyExplicitManualChunks
Architectural relief arrived with Vite v5 (Rollup 4.x). The introduction of the output.onlyExplicitManualChunks flag serves as the primary defense against this leakage. By enabling this, you instruct the bundler to stop its “helpful” merging of transitive dependencies. It forces the bundler to keep manual chunks strictly isolated, ensuring that shared utilities are either duplicated or moved to a separate “shared” chunk, rather than dragging heavy libraries into the eager entry point. This restoration of the topological sort order is the first step in reclaiming a deterministic, high-performance build.
Non-Deterministic “Ghost” Bugs: Local vs. CI Environment Failures
Few experiences in DevOps are as maddening as the “Ghost Bug”—the build that passes perfectly on a developer’s local machine but collapses into a Maximum call stack size exceeded or ReferenceError within the sterile environment of a CI container. When your GitHub Action or Jenkins pipeline turns red while your local terminal remains green, you aren’t witnessing a random glitch. You are seeing the Path Separator Paradox and Case-Sensitivity Collisions in action.
The Path Separator Paradox
The core of the issue lies in how your manualChunks function perceives the “shape” of your module graph. In the Jigsaw Graph Paradox, the OS effectively changes the edges of your puzzle pieces. If you are developing on Windows, the module IDs passed to manualChunks use backslashes (\\). A developer might write a regex or string match like src\\components\\vendor to group specific libraries.
When that same code runs in a Linux-based CI environment, the paths switch to forward slashes (/). The regex fails to match, the manual chunk is never created, and the modules are left to the default bundling logic. This often results in the “stagnant whirlpools” mentioned earlier; without the intended manual grouping, the bundler’s attempt to resolve a complex graph can trigger a recursive loop that hits the stack limit.
Case-Sensitivity Collisions
Further complicating this is the divergence in file system sensitivity. macOS and Windows are generally case-insensitive, while Linux is strictly case-sensitive. If your manualChunks logic targets a folder named Components/ but the file system or an import statement uses components/, your local build will resolve it without complaint.
In CI, the logic will silently ignore the files. This leads to “chunk leakage,” where heavy dependencies intended for an isolated chunk are instead “promoted” into the main entry point, potentially causing the very execution deadlocks and ReferenceErrors we’ve identified as critical failure modes.
Local vs. CI Forensic Comparison
| Feature | Local (Windows/macOS) | CI (Linux/Docker) | Impact on manualChunks |
|---|---|---|---|
| Path Separator | \\ (Windows) or / (macOS) | Strictly / | Regex/String mismatches. |
| Case Sensitivity | Insensitive (usually) | Strictly Sensitive | Target folders are missed/ignored. |
| Root Directory | C:\\Users\\Name\\Projects | /home/runner/work/repo | Absolute path resolution diverges. |
| Stack Size | High (Node.js default) | Low (Container constraints) | Recursion crashes CI, not Local. |
Environment-Agnostic Logic
To stabilize your pipeline, you must move toward path normalization. Relying on hardcoded path strings or environment-specific regex is an architectural liability.
- Use
id.includes(): Instead of matching the full path, check for the presence of specific package names or directory markers that are consistent across environments. - Normalize Paths: Use a package like
slashor Node’s built-inpath.posixto ensure that regardless of the host OS, yourmanualChunksfunction sees forward slashes. - Lower-case Comparisons: Force module IDs to lower-case within your matching logic to avoid case-sensitivity traps.
By enforcing environment-agnostic logic, you ensure that the module graph is partitioned identically regardless of where the build is triggered, turning “Ghost Bugs” into deterministic, solvable problems.
The Hidden Impact: CSS Chunking and Cascade Reversal
While the logic of manualChunks is typically discussed in terms of JavaScript execution, the most visible—and visual—collapses often occur in the global CSS cascade. In the Jigsaw Graph Paradox, moving the JS “pieces” into manual boxes also moves the CSS “colors” attached to them. Because Vite derives its CSS ordering directly from the JavaScript module graph, any manual intervention that partitions that graph risks an Order Inversion that turns a polished UI into a “Specificity War.”
The Cascade Collapse: Why Ordering Breaks
In a standard Vite build, the sequence of your CSS is deterministic: it follows the depth-first traversal of your JS imports. If your entry point imports reset.css before App.jsx, and App.jsx imports Button.jsx (which contains Button.css), the bundler ensures the reset styles precede the component styles. This preserves the natural cascade.
However, when manualChunks is invoked, the associated CSS is aggregated into files tied strictly to those specific chunks. If you isolate a heavy component library into a vendor chunk while leaving your base.css or reset.css in the main entry point, you are no longer in control of the sequence. As documented in Vite Issues #20995 and #6375, manualChunks can fail to respect the original import order, leading to a state where the “Component” styles are loaded by the browser before the “Base” styles.
The “Production-Only” Ghost
The most forensic challenge of this failure mode is its invisibility during development. This is not a “simple” bug; it is a structural discrepancy between the Dev and Production environments.
| Feature | Dev Mode (HMR) | Production Build (Bundled) |
|---|---|---|
| Injection Method | Styles are injected via JS as individual <style> tags. | Styles are extracted into static .css files. |
| Order Mechanism | Last-in, last-out based on module load time. | Fixed order based on chunk aggregation logic. |
| Visibility | Cascade usually appears “correct” due to HMR updates. | Cascade reversal is permanent and “baked-in.” |
In Dev Mode, styles are often injected dynamically into the DOM. If you change a component, Vite’s Hot Module Replacement (HMR) re-injects that specific style tag at the end of the <head>, masking any underlying ordering issues. In Production, however, these styles are concatenated. If the “Jigsaw” pieces have been boxed incorrectly, the reset.css may end up placed after your Button.css in the final CSS file. Suddenly, your buttons lose their specific padding or border-radius because the global reset has taken precedence—a pathological state that is nearly impossible to debug via standard DevTools without a forensic understanding of the build graph.
The Specificity War
When the cascade is reversed, developers often instinctively reach for !important or higher-specificity selectors to “fix” the UI. This is a tactical error that ignores the architectural root cause. The issue isn’t that your CSS is weak; it’s that your topological sort order has collapsed. By forcing modules into separate chunks, you have severed the “topological arteries” that previously guaranteed that global styles would load first. Stabilizing the UI requires dismantling the manual chunking logic that caused the inversion, rather than adding more weight to the style sheets themselves.
Forensic Synthesis: The Architect’s Action Plan for Vite 5+
The transition from Vite 4 to Vite 5 marks more than a version bump; it is a shift from aggressive, heuristic-based optimization to defensive architecture. To resolve the “Jigsaw Graph” Paradox, we must stop treating the module graph as a puzzle to be forced together and start treating it as a system of isolated, immutable boundaries. By utilizing onlyExplicitManualChunks, you are finally giving your module “pieces” locked boxes that prevent unwanted “glue” (transitive dependencies and commonjsHelpers) from seeping in and destabilizing the topological sort order.
The Architect’s Quick-Fix Checklist
| Action | Technical Implementation | Goal |
|---|---|---|
| Enforce Isolation | Set output.onlyExplicitManualChunks: true | Prevent “eager” promotion and circular triggers. |
| Normalize Paths | Use id.includes() with path.sep or slash | Eliminate OS-specific “Ghost Bugs” in CI. |
| Bucket Strategically | Group heavy libs; leave glue to the bundler | Maximize cacheability without breaking the graph. |
| Audit the Pipeline | Integrate madge and visualizer in CI | Ensure a deterministic, loop-free build. |
The “Silver Bullet”: Defensive Configuration
The introduction of output.onlyExplicitManualChunks in Vite 5 (Rollup 4.x) is the primary architectural defense against the “stagnant whirlpools” of the past. In previous versions, Rollup would “helpfully” pull shared dependencies into your manual chunks to reduce duplication. While well-intentioned, this frequently severed topological arteries.
By setting this flag to true, you instruct the bundler to strictly include only the modules you explicitly name in your logic. Everything else—including the problematic commonjsHelpers—is left to Rollup’s default, safe internal algorithm.
// vite.config.js
import { defineConfig } from 'vite';
import path from 'path';
export default defineConfig({
build: {
rollupOptions: {
output: {
// THE SILVER BULLET: Prevents implicit transitive promotion
onlyExplicitManualChunks: true,
manualChunks(id) {
// DEFENSIVE PATHING: Normalize for Linux/Windows compatibility
const normalizedId = id.split(path.sep).join('/');
// STRATEGIC AGGREGATION: The "Library Bucket"
if (normalizedId.includes('node_modules/three')) {
return 'vendor-visuals';
}
if (normalizedId.includes('node_modules/fabric')) {
return 'vendor-editor';
}
// LEAVE THE GLUE: Return nothing for utilities/commonjsHelpers
// This allows Rollup to manage the "topological arteries" safely.
}
}
}
}
});Strategic Aggregation: The “Library Bucket”
Architects must resist the urge to chunk every small utility. The goal is Strategic Aggregation. Heavy, stable dependencies like three.js or fabric.js are ideal candidates for manual chunking because their internal graphs are self-contained. Conversely, “glue code”—shared utility folders, internal constants, and interop helpers—should never be manually chunked. By leaving these to the bundler, you allow Rollup to find the most efficient, loop-free split points, preventing the “ReferenceError” and “Maximum call stack” crashes that haunt manual configurations.
The Verification Loop: Mandatory CI Hardening
A build that passes on a MacBook is not a verified build. To achieve system instability prevention, your CI pipeline must enforce a forensic audit on every commit:
- Detection: Use
rollup-plugin-visualizerto generate a metadata file. Your CI should fail if the “main” entry point size increases by more than 10% unexpectedly, signaling an “eager” promotion leak. - Structural Integrity: Run
madge --circular src/main.js. If a circular dependency is detected in the source or the chunked output, the build must be rejected before it reaches a container. - Environmental Validation: Execute the build within a Linux-based Docker container. This is the only way to catch Path Separator Paradoxes and case-sensitivity collisions before they hit production.
The Architect’s Mandate
Dismantle the overly complex manualChunks functions that attempt to micromanage every kilobyte. Standardize on environment-agnostic path normalization. Shift your focus from “maximum optimization” to deterministic reliability. In the Vite 5 era, a stable, slightly larger bundle is infinitely more valuable than a “perfectly” chunked application that fails silently in the middle of a production release.
Summary
Modern web application integrity depends on deterministic build pipelines. However, the widespread use of manualChunks in Vite and Rollup has introduced a state of systemic instability that breaks this determinism. This is the Jigsaw Graph Paradox: while a standard build flows naturally like water through a module graph, manual intervention attempts to force modules into rigid boxes. This boxing often severs critical topological arteries, creating stagnant whirlpools—Circular Triggers—that cause the entire architecture to collapse under the weight of its own dependencies.
We are no longer dealing with simple optimization warnings. The transition from Rollup 3.x to the 4.x/5.x engine has fundamentally changed how the module graph is analyzed, turning previously silent irregularities into “stop-the-world” failures. The forensic signatures of this collapse are unmistakable: a Maximum call stack size exceeded error that halts the build phase or a catastrophic ReferenceError during runtime initialization that leaves users with a non-functional “white screen of death.”
Key Forensic Findings
- Pathological Recursion:
manualChunksmandates a rigid assignment of nodes that forces the bundler’s graph-coloring algorithm into an infinite loop while searching for a valid split point. - The commonjsHelpers Trap: Injected interop logic frequently gets caught in manual “dams,” leading to circular triggers that violate the Temporal Dead Zone (TDZ).
- Environmental Non-Determinism: OS-level path discrepancies and case-sensitivity collisions create “Ghost Bugs” where builds pass on a developer’s local machine but fail within the strict confines of a Linux-based CI container.
- Entry Point Pollution: Shared ancestry between the entry point and manual chunks can “promote” heavy, lazy-loaded libraries to the critical path, potentially causing deadlocks in environments utilizing Top-Level Await (TLA).
This briefing deconstructs these pathological states where heuristic assumptions collapse. The objective is to move beyond “trial-and-error” configuration and toward a defensive architecture. By leveraging the onlyExplicitManualChunks flag in Vite 5, architects can dismantle these toxic whirlpools and reclaim a deterministic, immutable build pipeline.
Edge Cases Q&A
manualChunks logic is creating a pathological recursion. Local machines with high memory and default stack sizes often “brute force” through the loop. CI containers (GitHub Actions, etc.) have lower ceilings, causing the Maximum call stack size exceeded crash. await and has polluted a manual chunk that transitively references the entry point’s exports, you’ve created a circular wait state. The browser halts execution indefinitely. manualChunks severs the topological order. In production, your reset.css can be bundled after your component styles, “melting” the UI. This is invisible in Dev because HMR injects styles dynamically. \\ while Linux/CI uses /. If your manualChunks regex isn’t path-agnostic (e.g., using path.sep or id.includes), the chunking logic fails silently in CI, triggering default (and often circular) fallback behavior. onlyExplicitManualChunks: true. In Vite 5+, this flag prevents Rollup from automatically dragging interop “debris” into your manual buckets. It isolates your manual chunks to only what you explicitly defined, leaving the “glue” to be managed safely by the bundler. Related Citations & References
- STreactjs – Cannot access 'React' before initialization while using rollup manualChunks with vitejs? – Stack Overflow
- GIUsing manualChunks breaks code-splitting · Issue #12209 · vitejs/vite · GitHub
- GIPotential bug with manual chunk splitting · nuxt nuxt · Discussion #19742 · GitHub
- GIMaximum call stack size exceeded on use `manualChunks` · Issue #2906 · vitejs/vite · GitHub
- GI[nuxt] [request error] [unhandled] [500] Maximum call stack size exceeded · Issue #19837 · nuxt/nuxt · GitHub
- GIScripts set in manualChunks are loaded directly in front page, instead to be lazy loaded when needed · Issue #5189 · vitejs/vite · GitHub
- GIrollup/CHANGELOG.md at master · rollup/rollup · GitHub
- GIIncorrect chunking when code has top-level await · Issue #4708 · rollup/rollup · GitHub
- SVDetail of sveltejs/kit#14571 | Svelte Changelog
- BLvite /rollup manualChunks
- GIsvelte.config.js version changes cause most client chunks to generate a new hash despite no other changes · Issue #12260 · sveltejs/kit · GitHub
- GIPls respect order of `import` if css output by `manualChunks` on build · Issue #20995 · vitejs/vite · GitHub
- GIincorrect CSS order after build when manualChunk is used · Issue #6375 · vitejs/vite · GitHub
- STjavascript – Bundle JS and CSS into single file with Vite – Stack Overflow
- STjavascript – Why are manual chunks empty in Vue with Vite + Rollup – Stack Overflow




