From 93f3efa08a306099a3bb9cc81c8d7173fbbe1cae Mon Sep 17 00:00:00 2001 From: patak Date: Fri, 7 Apr 2023 17:21:23 +0200 Subject: [PATCH 1/2] fix: ignore sideEffects for scripts imported from html --- packages/vite/src/node/plugins/resolve.ts | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/packages/vite/src/node/plugins/resolve.ts b/packages/vite/src/node/plugins/resolve.ts index 626b5909644700..7c1a8fcaade112 100644 --- a/packages/vite/src/node/plugins/resolve.ts +++ b/packages/vite/src/node/plugins/resolve.ts @@ -260,19 +260,24 @@ export function resolvePlugin(resolveOptions: InternalResolveOptions): Plugin { } if ((res = tryFsResolve(fsPath, options))) { - const resPkg = findNearestPackageData( - path.dirname(res), - options.packageCache, - ) res = ensureVersionQuery(res, id, options, depsOptimizer) debug?.(`[relative] ${colors.cyan(id)} -> ${colors.dim(res)}`) - return resPkg - ? { + // If this isn't a script imported from a .html file, include side effects + // hints so the non-used code is properly tree-shaken during build time. + if (!importer?.endsWith('.html')) { + const resPkg = findNearestPackageData( + path.dirname(res), + options.packageCache, + ) + if (resPkg) { + return { id: res, moduleSideEffects: resPkg.hasSideEffects(res), } - : res + } + } + return res } } From 8ec9bb5a70ad67d39b1163c779e6a327d027e451 Mon Sep 17 00:00:00 2001 From: patak Date: Fri, 7 Apr 2023 19:25:49 +0200 Subject: [PATCH 2/2] test: add test for sideEffects false --- playground/html/__tests__/html.spec.ts | 10 ++++++++++ playground/html/side-effects/index.html | 2 ++ playground/html/side-effects/package.json | 6 ++++++ playground/html/side-effects/sideEffects.js | 1 + playground/html/vite.config.js | 1 + 5 files changed, 20 insertions(+) create mode 100644 playground/html/side-effects/index.html create mode 100644 playground/html/side-effects/package.json create mode 100644 playground/html/side-effects/sideEffects.js diff --git a/playground/html/__tests__/html.spec.ts b/playground/html/__tests__/html.spec.ts index 39294f5510aa17..144fcfe1d0003a 100644 --- a/playground/html/__tests__/html.spec.ts +++ b/playground/html/__tests__/html.spec.ts @@ -293,3 +293,13 @@ describe('importmap', () => { ) }) }) + +describe('side-effects', () => { + beforeAll(async () => { + await page.goto(viteTestUrl + '/side-effects/') + }) + + test('console.log is not tree-shaken', async () => { + expect(browserLogs).toContain('message from sideEffects script') + }) +}) diff --git a/playground/html/side-effects/index.html b/playground/html/side-effects/index.html new file mode 100644 index 00000000000000..cca7443bd8eedb --- /dev/null +++ b/playground/html/side-effects/index.html @@ -0,0 +1,2 @@ +

sideEffects false

+ diff --git a/playground/html/side-effects/package.json b/playground/html/side-effects/package.json new file mode 100644 index 00000000000000..72a1449164f79b --- /dev/null +++ b/playground/html/side-effects/package.json @@ -0,0 +1,6 @@ +{ + "name": "@vitejs/test-html-side-effects", + "private": true, + "version": "0.0.0", + "sideEffects": false +} diff --git a/playground/html/side-effects/sideEffects.js b/playground/html/side-effects/sideEffects.js new file mode 100644 index 00000000000000..6bfb77c68206c0 --- /dev/null +++ b/playground/html/side-effects/sideEffects.js @@ -0,0 +1 @@ +console.log('message from sideEffects script') diff --git a/playground/html/vite.config.js b/playground/html/vite.config.js index e6301ec5ebf4dd..c03421c16045b0 100644 --- a/playground/html/vite.config.js +++ b/playground/html/vite.config.js @@ -28,6 +28,7 @@ export default defineConfig({ valid: resolve(__dirname, 'valid.html'), importmapOrder: resolve(__dirname, 'importmapOrder.html'), env: resolve(__dirname, 'env.html'), + sideEffects: resolve(__dirname, 'side-effects/index.html'), }, }, },