From 22051828d94057b98518e6761505d08d70b2c525 Mon Sep 17 00:00:00 2001 From: Alec Larson <1925840+aleclarson@users.noreply.github.com> Date: Mon, 11 Oct 2021 20:13:54 -0400 Subject: [PATCH] fix: respect "sideEffects: true" in package.json We can assume a package has side effects in this case. This is basically a way to force Rollup to always include the package when imported. --- packages/vite/src/node/packages.ts | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/packages/vite/src/node/packages.ts b/packages/vite/src/node/packages.ts index 8b769020a05853..80f226261eccea 100644 --- a/packages/vite/src/node/packages.ts +++ b/packages/vite/src/node/packages.ts @@ -94,13 +94,19 @@ 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)) { - hasSideEffects = createFilter(sideEffects, null, { resolve: pkgDir }) + const filter = createFilter(sideEffects, null, { resolve: pkgDir }) + hasSideEffects = (id) => filter(id) && 'no-treeshake' } else { + // Statically analyze each module for side effects. hasSideEffects = () => true }