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/',
+ },
+})