diff --git a/packages/vite/src/node/packages.ts b/packages/vite/src/node/packages.ts index 1451d18853729a..d3e13ac3e63b42 100644 --- a/packages/vite/src/node/packages.ts +++ b/packages/vite/src/node/packages.ts @@ -96,10 +96,14 @@ export function loadPackageData( const data = JSON.parse(fs.readFileSync(pkgPath, 'utf-8')) const pkgDir = path.dirname(pkgPath) + + // When the "sideEffects" field is defined, we can assume modules + // in the package are either side effect-free or not, which means + // Rollup doesn't have to statically analyze the AST. const { sideEffects } = data - let hasSideEffects: (id: string) => boolean + let hasSideEffects: (id: string) => boolean | 'no-treeshake' if (typeof sideEffects === 'boolean') { - hasSideEffects = () => sideEffects + hasSideEffects = () => sideEffects && 'no-treeshake' } else if (Array.isArray(sideEffects)) { const finalPackageSideEffects = sideEffects.map((sideEffect) => { /* @@ -113,10 +117,12 @@ export function loadPackageData( return `**/${sideEffect}` }) - hasSideEffects = createFilter(finalPackageSideEffects, null, { + const filter = createFilter(finalPackageSideEffects, null, { resolve: pkgDir, }) + hasSideEffects = (id) => filter(id) && 'no-treeshake' } else { + // Statically analyze each module for side effects. hasSideEffects = () => true }