[Draft] Tree-shaking - do not merge#18441
Conversation
…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)
|
Reviewer - this PR has made changes to one or more package.json files. |
|
Smart Filters Editor is available to test at: |
🟢 Memory Leak Test Results13 passed, 0 leaked out of 13 scenarios 🟢 All memory leak tests passed — no leaks detected. Passed Scenarios (13)
|
⚡ Performance Test Results🟢 All performance tests passed — no regressions detected. |
|
WebGL2 visualization test reporter: |
|
Visualization tests for WebGPU |
|
Reviewer - this PR has made changes to one or more package.json files. |
|
Smart Filters Editor is available to test at: |
|
WebGL2 visualization test reporter: |
|
Visualization tests for WebGPU |
|
Reviewer - this PR has made changes to one or more package.json files. |
|
Smart Filters Editor is available to test at: |
|
Reviewer - this PR has made changes to one or more package.json files. |
|
Visualization tests for WebGPU |
|
Smart Filters Editor is available to test at: |
|
Visualization tests for WebGPU |
🟢 Memory Leak Test Results13 passed, 0 leaked out of 13 scenarios 🟢 All memory leak tests passed — no leaks detected. Passed Scenarios (13)
|
|
WebGL2 visualization test reporter: |
⚡ Performance Test Results🟢 All performance tests passed — no regressions detected. |
Tree-Shaking for
@babylonjs/coreThis 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/corewas marked as having side effects ("sideEffects": ["**/*"]), preventing bundlers from dropping unused modules. Over 900 files contained module-level side effects —RegisterClass()calls, prototype augmentations,ShaderStorewrites,AddNodeConstructorcalls, 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:foo.ts— no split needed.foo.pure.ts— All logic. Imports only from other.pure.tsfiles. No side effects. Contains aRegisterFoo()function that encapsulates all side effects.foo.ts— Thin wrapper that re-exports from.pure.tsand callsRegisterFoo().declare module) get a third file:foo.types.ts—declare moduleaugmentations for TypeScript.This is a fully backwards-compatible change. Existing imports from
@babylonjs/corecontinue to work identically. Tree-shaking users can import from.purepaths to get only the code they use.Implementation Phases
/*#__PURE__*/annotationsRegisterClass-only files (406 files), shader store files, prototype augmentation filespure.tsbarrel files alongside eachindex.tssideEffectsfield syncNative/Extensionsbarrel to ensurecreateCubeTextureis registered onNativeEngineKey Stats
package.json(down from["**/*"])Scripts Added
npm run audit:side-effects— Scan and report all side effectsnpm run update:manifest— Regenerate the side-effects manifestnpm run generate:pure-barrels— Generate pure barrel filesnpm run generate:side-effect-stubs— Generate missing side-effect stubsnpm run test:treeshaking— Bundle smoke tests (Webpack + Rollup)npm run check:treeshaking— CI checks (manifest drift, pure barrels, bundle smoke)