diff --git a/packages/plugin-legacy/src/index.ts b/packages/plugin-legacy/src/index.ts index 5c20c22bc..9e1e8f134 100644 --- a/packages/plugin-legacy/src/index.ts +++ b/packages/plugin-legacy/src/index.ts @@ -265,7 +265,7 @@ function viteLegacyPlugin(options: Options = {}): Plugin[] { } // legacy bundle - if (legacyPolyfills.size) { + if (options.polyfills !== false) { // check if the target needs Promise polyfill because SystemJS relies on it // https://github.com/systemjs/systemjs#ie11-support await detectPolyfills( @@ -273,7 +273,9 @@ function viteLegacyPlugin(options: Options = {}): Plugin[] { targets, legacyPolyfills, ) + } + if (legacyPolyfills.size || !options.externalSystemJS) { isDebug && console.log( `[@vitejs/plugin-legacy] legacy polyfills:`, diff --git a/playground/legacy/__tests__/no-polyfills-no-systemjs/no-polyfills-no-systemjs.spec.ts b/playground/legacy/__tests__/no-polyfills-no-systemjs/no-polyfills-no-systemjs.spec.ts new file mode 100644 index 000000000..609c45c07 --- /dev/null +++ b/playground/legacy/__tests__/no-polyfills-no-systemjs/no-polyfills-no-systemjs.spec.ts @@ -0,0 +1,16 @@ +import { expect, test } from 'vitest' +import { isBuild, page, untilUpdated, viteTestUrl } from '~utils' + +test.runIf(isBuild)('includes only a single script tag', async () => { + await page.goto(viteTestUrl + '/no-polyfills-no-systemjs.html') + + await untilUpdated( + () => page.getAttribute('#vite-legacy-entry', 'data-src'), + /.\/assets\/index-legacy-(.+)\.js/, + true, + ) + + expect(await page.locator('script').count()).toBe(1) + expect(await page.locator('#vite-legacy-polyfill').count()).toBe(0) + expect(await page.locator('#vite-legacy-entry').count()).toBe(1) +}) diff --git a/playground/legacy/__tests__/no-polyfills/no-polyfills.spec.ts b/playground/legacy/__tests__/no-polyfills/no-polyfills.spec.ts new file mode 100644 index 000000000..9563c5698 --- /dev/null +++ b/playground/legacy/__tests__/no-polyfills/no-polyfills.spec.ts @@ -0,0 +1,20 @@ +import { test } from 'vitest' +import { isBuild, page, untilUpdated, viteTestUrl } from '~utils' + +test('should load and execute the JS file', async () => { + await page.goto(viteTestUrl + '/no-polyfills.html') + await untilUpdated(() => page.textContent('main'), '👋', true) +}) + +test.runIf(isBuild)('includes a script tag for SystemJS', async () => { + await untilUpdated( + () => page.getAttribute('#vite-legacy-polyfill', 'src'), + /.\/assets\/polyfills-legacy-(.+)\.js/, + true, + ) + await untilUpdated( + () => page.getAttribute('#vite-legacy-entry', 'data-src'), + /.\/assets\/index-legacy-(.+)\.js/, + true, + ) +}) diff --git a/playground/legacy/no-polyfills-no-systemjs.html b/playground/legacy/no-polyfills-no-systemjs.html new file mode 100644 index 000000000..878b86e50 --- /dev/null +++ b/playground/legacy/no-polyfills-no-systemjs.html @@ -0,0 +1,3 @@ + +
+ diff --git a/playground/legacy/no-polyfills-no-systemjs.js b/playground/legacy/no-polyfills-no-systemjs.js new file mode 100644 index 000000000..c806e6836 --- /dev/null +++ b/playground/legacy/no-polyfills-no-systemjs.js @@ -0,0 +1 @@ +document.querySelector('main').innerHTML = '👋' diff --git a/playground/legacy/no-polyfills.html b/playground/legacy/no-polyfills.html new file mode 100644 index 000000000..a91e47640 --- /dev/null +++ b/playground/legacy/no-polyfills.html @@ -0,0 +1,3 @@ + +
+ diff --git a/playground/legacy/no-polyfills.js b/playground/legacy/no-polyfills.js new file mode 100644 index 000000000..c806e6836 --- /dev/null +++ b/playground/legacy/no-polyfills.js @@ -0,0 +1 @@ +document.querySelector('main').innerHTML = '👋' diff --git a/playground/legacy/package.json b/playground/legacy/package.json index 08f56c845..f931a0a6c 100644 --- a/playground/legacy/package.json +++ b/playground/legacy/package.json @@ -8,6 +8,8 @@ "build": "vite build --debug legacy", "build:custom-filename": "vite --config ./vite.config-custom-filename.js build --debug legacy", "build:multiple-output": "vite --config ./vite.config-multiple-output.js build", + "build:no-polyfills": "vite --config ./vite.config-no-polyfills.js build", + "build:no-polyfills-no-systemjs": "vite --config ./vite.config-no-polyfills-no-systemjs.js build", "debug": "node --inspect-brk ../../packages/vite/bin/vite", "preview": "vite preview" }, diff --git a/playground/legacy/vite.config-no-polyfills-no-systemjs.js b/playground/legacy/vite.config-no-polyfills-no-systemjs.js new file mode 100644 index 000000000..6908a5298 --- /dev/null +++ b/playground/legacy/vite.config-no-polyfills-no-systemjs.js @@ -0,0 +1,30 @@ +import path from 'node:path' +import legacy from '@vitejs/plugin-legacy' +import { defineConfig } from 'vite' + +export default defineConfig({ + base: './', + plugins: [ + legacy({ + renderModernChunks: false, + polyfills: false, + externalSystemJS: true, + }), + { + name: 'remove crossorigin attribute', + transformIndexHtml: (html) => html.replaceAll('crossorigin', ''), + enforce: 'post', + }, + ], + + build: { + rollupOptions: { + input: { + index: path.resolve(__dirname, 'no-polyfills-no-systemjs.html'), + }, + }, + }, + testConfig: { + baseRoute: '/no-polyfills-no-systemjs/', + }, +}) diff --git a/playground/legacy/vite.config-no-polyfills.js b/playground/legacy/vite.config-no-polyfills.js new file mode 100644 index 000000000..7498e4d25 --- /dev/null +++ b/playground/legacy/vite.config-no-polyfills.js @@ -0,0 +1,29 @@ +import path from 'node:path' +import legacy from '@vitejs/plugin-legacy' +import { defineConfig } from 'vite' + +export default defineConfig({ + base: './', + plugins: [ + legacy({ + renderModernChunks: false, + polyfills: false, + }), + { + name: 'remove crossorigin attribute', + transformIndexHtml: (html) => html.replaceAll('crossorigin', ''), + enforce: 'post', + }, + ], + + build: { + rollupOptions: { + input: { + index: path.resolve(__dirname, 'no-polyfills.html'), + }, + }, + }, + testConfig: { + baseRoute: '/no-polyfills/', + }, +})