Skip to content

[Draft] Tree-shaking - do not merge#18441

Draft
RaananW wants to merge 109 commits into
BabylonJS:masterfrom
RaananW:freshTreeShakingRun
Draft

[Draft] Tree-shaking - do not merge#18441
RaananW wants to merge 109 commits into
BabylonJS:masterfrom
RaananW:freshTreeShakingRun

Conversation

@RaananW
Copy link
Copy Markdown
Member

@RaananW RaananW commented May 10, 2026

Tree-Shaking for @babylonjs/core

This PR introduces full tree-shaking support for @babylonjs/core. The goal is to allow bundlers (Webpack, Rollup, Vite, esbuild) to eliminate unused code from Babylon.js applications, significantly reducing bundle sizes.

Problem

Every source file in @babylonjs/core was marked as having side effects ("sideEffects": ["**/*"]), preventing bundlers from dropping unused modules. Over 900 files contained module-level side effects — RegisterClass() calls, prototype augmentations, ShaderStore writes, AddNodeConstructor calls, and static property assignments — that forced the entire package into every bundle.

Approach: Pure/Side-Effect Split

Files under packages/dev/core/src/ are split based on their side-effect profile:

  • Side-effect-free files stay as a single foo.ts — no split needed.
  • Files with side effects (RegisterClass, shader store writes, etc.) are split into two files:
    • foo.pure.ts — All logic. Imports only from other .pure.ts files. No side effects. Contains a RegisterFoo() function that encapsulates all side effects.
    • foo.ts — Thin wrapper that re-exports from .pure.ts and calls RegisterFoo().
  • Files that also augment other classes (prototype assignments, declare module) get a third file:
    • foo.types.tsdeclare module augmentations for TypeScript.

This is a fully backwards-compatible change. Existing imports from @babylonjs/core continue to work identically. Tree-shaking users can import from .pure paths to get only the code they use.

Implementation Phases

  1. Audit & tooling — Side-effect inventory script, bundle smoke tests, /*#__PURE__*/ annotations
  2. Mechanical splitsRegisterClass-only files (406 files), shader store files, prototype augmentation files
  3. Complex splits — Files with mixed side effects, static property assignments, factory patterns
  4. Pure barrels — Generated pure.ts barrel files alongside each index.ts
  5. CI enforcement — Manifest drift checks, pure barrel generation checks, bundle smoke tests, sideEffects field sync
  6. Bulk block registration helpers — Consolidate related registrations (e.g., all math blocks, all mesh blocks)
  7. Native engine fix — Re-export Native/Extensions barrel to ensure createCubeTexture is registered on NativeEngine

Key Stats

  • ~1,713 files changed
  • ~784 side-effect entries in package.json (down from ["**/*"])
  • ~1,784 files confirmed pure (no side effects)
  • All 3,070 unit tests pass
  • Bundle smoke tests confirm tree-shaking works (physics-v2 scene: -38.6% vs baseline)

Scripts Added

  • npm run audit:side-effects — Scan and report all side effects
  • npm run update:manifest — Regenerate the side-effects manifest
  • npm run generate:pure-barrels — Generate pure barrel files
  • npm run generate:side-effect-stubs — Generate missing side-effect stubs
  • npm run test:treeshaking — Bundle smoke tests (Webpack + Rollup)
  • npm run check:treeshaking — CI checks (manifest drift, pure barrels, bundle smoke)

RaananW added 30 commits March 3, 2026 18:55
…TreeShaking

# Conflicts:
#	eslint.config.mjs
#	packages/dev/core/src/Audio/audioSceneComponent.ts
#	packages/dev/core/src/Buffers/buffer.ts
#	packages/dev/core/src/Engines/WebGPU/webgpuShaderProcessorsWGSL.ts
#	packages/dev/core/src/Engines/WebGPU/webgpuTextureManager.ts
#	packages/dev/core/src/Engines/engine.ts
#	packages/dev/core/src/Engines/thinNativeEngine.ts
#	packages/dev/core/src/Engines/webgpuEngine.ts
#	packages/dev/core/src/FrameGraph/Node/nodeRenderGraph.ts
#	packages/dev/core/src/FrameGraph/Tasks/Rendering/csmShadowGeneratorTask.ts
#	packages/dev/core/src/Layers/glowLayer.ts
#	packages/dev/core/src/Layers/highlightLayer.ts
#	packages/dev/core/src/Layers/selectionOutlineLayer.ts
#	packages/dev/core/src/Lights/lightingVolume.ts
#	packages/dev/core/src/Loading/Plugins/babylonFileLoader.ts
#	packages/dev/core/src/Materials/GaussianSplatting/gaussianSplattingGpuPickingMaterialPlugin.ts
#	packages/dev/core/src/Materials/GaussianSplatting/gaussianSplattingMaterial.ts
#	packages/dev/core/src/Materials/GaussianSplatting/gaussianSplattingSolidColorMaterialPlugin.ts
#	packages/dev/core/src/Materials/Node/Blocks/Dual/fogBlock.ts
#	packages/dev/core/src/Materials/Node/Blocks/Dual/imageSourceBlock.ts
#	packages/dev/core/src/Materials/Node/Blocks/PBR/sheenBlock.ts
#	packages/dev/core/src/Materials/Node/Blocks/cloudBlock.ts
#	packages/dev/core/src/Materials/Node/Blocks/curveBlock.ts
#	packages/dev/core/src/Materials/Node/nodeMaterial.ts
#	packages/dev/core/src/Materials/PBR/openpbrMaterial.ts
#	packages/dev/core/src/Materials/PBR/pbrBaseMaterial.ts
#	packages/dev/core/src/Materials/Textures/Procedurals/proceduralTexture.ts
#	packages/dev/core/src/Materials/Textures/cubeTexture.ts
#	packages/dev/core/src/Materials/Textures/htmlElementTexture.ts
#	packages/dev/core/src/Materials/Textures/multiRenderTarget.ts
#	packages/dev/core/src/Materials/Textures/renderTargetTexture.ts
#	packages/dev/core/src/Materials/multiMaterial.ts
#	packages/dev/core/src/Materials/standardMaterial.ts
#	packages/dev/core/src/Maths/math.path.ts
#	packages/dev/core/src/Maths/math.vector.ts
#	packages/dev/core/src/Meshes/Builders/boxBuilder.ts
#	packages/dev/core/src/Meshes/Builders/cylinderBuilder.ts
#	packages/dev/core/src/Meshes/Builders/decalBuilder.ts
#	packages/dev/core/src/Meshes/Builders/latheBuilder.ts
#	packages/dev/core/src/Meshes/Builders/linesBuilder.ts
#	packages/dev/core/src/Meshes/Builders/polygonBuilder.ts
#	packages/dev/core/src/Meshes/Builders/polyhedronBuilder.ts
#	packages/dev/core/src/Meshes/Builders/ribbonBuilder.ts
#	packages/dev/core/src/Meshes/Builders/shapeBuilder.ts
#	packages/dev/core/src/Meshes/GaussianSplatting/gaussianSplattingMesh.ts
#	packages/dev/core/src/Meshes/GreasedLine/greasedLineMesh.ts
#	packages/dev/core/src/Meshes/GreasedLine/greasedLineRibbonMesh.ts
#	packages/dev/core/src/Meshes/Node/Blocks/Instances/instantiateOnFacesBlock.ts
#	packages/dev/core/src/Meshes/Node/Blocks/Instances/instantiateOnVolumeBlock.ts
#	packages/dev/core/src/Meshes/Node/Blocks/mappingBlock.ts
#	packages/dev/core/src/Meshes/abstractMesh.ts
#	packages/dev/core/src/Meshes/csg.ts
#	packages/dev/core/src/Meshes/groundMesh.ts
#	packages/dev/core/src/Meshes/mesh.ts
#	packages/dev/core/src/Meshes/mesh.vertexData.ts
#	packages/dev/core/src/Meshes/polygonMesh.ts
#	packages/dev/core/src/Meshes/trailMesh.ts
#	packages/dev/core/src/Misc/environmentTextureTools.ts
#	packages/dev/core/src/Misc/tools.ts
#	packages/dev/core/src/Particles/Node/Blocks/Update/updateNoiseBlock.ts
#	packages/dev/core/src/Particles/Node/Blocks/particleSourceTextureBlock.ts
#	packages/dev/core/src/Particles/Node/nodeParticleSystemSet.ts
#	packages/dev/core/src/Particles/computeShaderParticleSystem.ts
#	packages/dev/core/src/Particles/gpuParticleSystem.ts
#	packages/dev/core/src/Particles/particleSystem.ts
#	packages/dev/core/src/Particles/thinParticleSystem.ts
#	packages/dev/core/src/Particles/webgl2ParticleSystem.ts
#	packages/dev/core/src/Physics/v2/characterController.ts
#	packages/dev/core/src/PostProcesses/postProcess.ts
#	packages/dev/core/src/Probes/reflectionProbe.ts
#	packages/dev/core/src/Rendering/IBLShadows/iblShadowsRenderPipeline.ts
#	packages/dev/core/src/Rendering/depthRenderer.ts
#	packages/dev/core/src/Rendering/edgesRenderer.ts
#	packages/dev/core/src/Rendering/geometryBufferRenderer.ts
#	packages/dev/core/src/Rendering/thinDepthPeelingRenderer.ts
#	packages/dev/core/src/Sprites/spriteManager.ts
#	packages/dev/core/src/XR/features/WebXRAnchorSystem.ts
#	packages/dev/core/src/XR/features/WebXRHandTracking.ts
#	packages/dev/core/src/XR/features/WebXRNearInteraction.ts
#	packages/dev/core/src/XR/motionController/webXRMicrosoftMixedRealityController.ts
#	packages/dev/core/src/XR/motionController/webXROculusTouchMotionController.ts
#	packages/dev/core/src/scene.ts
Applied upstream bug fixes and improvements to the corresponding .pure.ts
files that were missed during the merge with upstream/master, because the
tree-shaking branch splits implementation into .pure.ts files while upstream
only has the original .ts files.

Changes include:
- 59 patches applied cleanly via git apply
- 4 patches applied via 3-way merge
- 13 conflict files resolved manually:
  - Gaussian Splatting import path fixes (4 files)
  - Empty augmentation-only files kept as-is (3 files)
  - Bug fixes ported: math.path, csg, polygonMesh, nodeParticleSystemSet,
    reflectionProbe, spriteManager, mesh.vertexData
  - Files with no upstream changes restored from branch (4 files)
  - Files where changes only affected .ts wrapper, not .pure.ts (2 files)
@bjsplat
Copy link
Copy Markdown
Collaborator

bjsplat commented May 13, 2026

Reviewer - this PR has made changes to one or more package.json files.

@bjsplat
Copy link
Copy Markdown
Collaborator

bjsplat commented May 13, 2026

Smart Filters Editor is available to test at:
https://sfe.babylonjs.com/?snapshot=refs/pull/18441/merge

@bjsplat
Copy link
Copy Markdown
Collaborator

bjsplat commented May 13, 2026

@bjsplat
Copy link
Copy Markdown
Collaborator

bjsplat commented May 13, 2026

@bjsplat
Copy link
Copy Markdown
Collaborator

bjsplat commented May 13, 2026

🟢 Memory Leak Test Results

13 passed, 0 leaked out of 13 scenarios

🟢 All memory leak tests passed — no leaks detected.

Passed Scenarios (13)
Scenario Package
Core Feature Stack @babylonjs/core
Core Rendering Materials Shadows Stack @babylonjs/core
Core Textures Render Targets PostProcess Stack @babylonjs/core
GUI Fullscreen UI Controls @babylonjs/gui
GUI Mesh ADT Controls @babylonjs/gui
Loaders Boombox Import @babylonjs/loaders
Loaders OBJ Direct Load @babylonjs/loaders
Loaders STL Direct Load @babylonjs/loaders
Materials Library Stack @babylonjs/materials
Serializers glTF Export @babylonjs/serializers
Serializers GLB Export @babylonjs/serializers
PostProcesses Digital Rain Stack @babylonjs/post-processes
Procedural Textures Stack @babylonjs/procedural-textures

@bjsplat
Copy link
Copy Markdown
Collaborator

bjsplat commented May 13, 2026

⚡ Performance Test Results

🟢 All performance tests passed — no regressions detected.

@bjsplat
Copy link
Copy Markdown
Collaborator

bjsplat commented May 13, 2026

@bjsplat
Copy link
Copy Markdown
Collaborator

bjsplat commented May 13, 2026

@bjsplat
Copy link
Copy Markdown
Collaborator

bjsplat commented May 13, 2026

Reviewer - this PR has made changes to one or more package.json files.

@bjsplat
Copy link
Copy Markdown
Collaborator

bjsplat commented May 13, 2026

Smart Filters Editor is available to test at:
https://sfe.babylonjs.com/?snapshot=refs/pull/18441/merge

@bjsplat
Copy link
Copy Markdown
Collaborator

bjsplat commented May 13, 2026

@bjsplat
Copy link
Copy Markdown
Collaborator

bjsplat commented May 13, 2026

@bjsplat
Copy link
Copy Markdown
Collaborator

bjsplat commented May 13, 2026

@bjsplat
Copy link
Copy Markdown
Collaborator

bjsplat commented May 13, 2026

@bjsplat
Copy link
Copy Markdown
Collaborator

bjsplat commented May 13, 2026

Reviewer - this PR has made changes to one or more package.json files.

@bjsplat
Copy link
Copy Markdown
Collaborator

bjsplat commented May 13, 2026

Smart Filters Editor is available to test at:
https://sfe.babylonjs.com/?snapshot=refs/pull/18441/merge

@bjsplat
Copy link
Copy Markdown
Collaborator

bjsplat commented May 13, 2026

@bjsplat
Copy link
Copy Markdown
Collaborator

bjsplat commented May 13, 2026

Reviewer - this PR has made changes to one or more package.json files.

@bjsplat
Copy link
Copy Markdown
Collaborator

bjsplat commented May 13, 2026

@bjsplat
Copy link
Copy Markdown
Collaborator

bjsplat commented May 13, 2026

Smart Filters Editor is available to test at:
https://sfe.babylonjs.com/?snapshot=refs/pull/18441/merge

@bjsplat
Copy link
Copy Markdown
Collaborator

bjsplat commented May 13, 2026

@bjsplat
Copy link
Copy Markdown
Collaborator

bjsplat commented May 13, 2026

@bjsplat
Copy link
Copy Markdown
Collaborator

bjsplat commented May 13, 2026

@bjsplat
Copy link
Copy Markdown
Collaborator

bjsplat commented May 13, 2026

🟢 Memory Leak Test Results

13 passed, 0 leaked out of 13 scenarios

🟢 All memory leak tests passed — no leaks detected.

Passed Scenarios (13)
Scenario Package
Core Feature Stack @babylonjs/core
Core Rendering Materials Shadows Stack @babylonjs/core
Core Textures Render Targets PostProcess Stack @babylonjs/core
GUI Fullscreen UI Controls @babylonjs/gui
GUI Mesh ADT Controls @babylonjs/gui
Loaders Boombox Import @babylonjs/loaders
Loaders OBJ Direct Load @babylonjs/loaders
Loaders STL Direct Load @babylonjs/loaders
Materials Library Stack @babylonjs/materials
Serializers glTF Export @babylonjs/serializers
Serializers GLB Export @babylonjs/serializers
PostProcesses Digital Rain Stack @babylonjs/post-processes
Procedural Textures Stack @babylonjs/procedural-textures

@bjsplat
Copy link
Copy Markdown
Collaborator

bjsplat commented May 13, 2026

@bjsplat
Copy link
Copy Markdown
Collaborator

bjsplat commented May 13, 2026

⚡ Performance Test Results

🟢 All performance tests passed — no regressions detected.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants