diff --git a/packages/vite/src/node/utils.ts b/packages/vite/src/node/utils.ts
index 8d52dc2bfe1e53..4840cc413eb378 100644
--- a/packages/vite/src/node/utils.ts
+++ b/packages/vite/src/node/utils.ts
@@ -37,7 +37,10 @@ export function unwrapId(id: string): string {
}
export const flattenId = (id: string): string =>
- id.replace(/(\s*>\s*)/g, '__').replace(/[\/\.:]/g, '_')
+ id
+ .replace(/[\/:]/g, '_')
+ .replace(/[\.]/g, '__')
+ .replace(/(\s*>\s*)/g, '___')
export const normalizeId = (id: string): string =>
id.replace(/(\s*>\s*)/g, ' > ')
diff --git a/playground/optimize-deps/__tests__/optimize-deps.spec.ts b/playground/optimize-deps/__tests__/optimize-deps.spec.ts
index bf4fee61e4e74c..cc712fbbdc4a09 100644
--- a/playground/optimize-deps/__tests__/optimize-deps.spec.ts
+++ b/playground/optimize-deps/__tests__/optimize-deps.spec.ts
@@ -121,6 +121,11 @@ test('variable names are reused in different scripts', async () => {
expect(await page.textContent('.reused-variable-names')).toBe('reused')
})
+test('flatten id should generate correctly', async () => {
+ expect(await page.textContent('.clonedeep-slash')).toBe('clonedeep-slash')
+ expect(await page.textContent('.clonedeep-dot')).toBe('clonedeep-dot')
+})
+
test.runIf(isServe)('error on builtin modules usage', () => {
expect(browserLogs).toEqual(
expect.arrayContaining([
diff --git a/playground/optimize-deps/index.html b/playground/optimize-deps/index.html
index 39d76fd83d0609..b96620902c1eca 100644
--- a/playground/optimize-deps/index.html
+++ b/playground/optimize-deps/index.html
@@ -74,6 +74,10 @@
Alias with colon
Reused variable names
This should show reused:
+Flatten Id
+
+
+
+
+
diff --git a/playground/optimize-deps/package.json b/playground/optimize-deps/package.json
index 4673bbf16d9cc5..d8302ff0e23cc7 100644
--- a/playground/optimize-deps/package.json
+++ b/playground/optimize-deps/package.json
@@ -31,7 +31,9 @@
"resolve-linked": "workspace:0.0.0",
"url": "^0.11.0",
"vue": "^3.2.37",
- "vuex": "^4.0.2"
+ "vuex": "^4.0.2",
+ "lodash": "^4.17.21",
+ "lodash.clonedeep": "^4.5.0"
},
"devDependencies": {
"@vitejs/plugin-vue": "workspace:*"
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 60c13ef3e463de..f57f9baab70ffa 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -586,7 +586,9 @@ importers:
dep-with-builtin-module-cjs: file:./dep-with-builtin-module-cjs
dep-with-builtin-module-esm: file:./dep-with-builtin-module-esm
dep-with-dynamic-import: file:./dep-with-dynamic-import
+ lodash: ^4.17.21
lodash-es: ^4.17.21
+ lodash.clonedeep: ^4.5.0
nested-exclude: file:./nested-exclude
phoenix: ^1.6.10
react: ^17.0.2
@@ -610,7 +612,9 @@ importers:
dep-with-builtin-module-cjs: file:playground/optimize-deps/dep-with-builtin-module-cjs
dep-with-builtin-module-esm: file:playground/optimize-deps/dep-with-builtin-module-esm
dep-with-dynamic-import: file:playground/optimize-deps/dep-with-dynamic-import
+ lodash: 4.17.21
lodash-es: 4.17.21
+ lodash.clonedeep: 4.5.0
nested-exclude: file:playground/optimize-deps/nested-exclude
phoenix: 1.6.10
react: 17.0.2
@@ -5849,6 +5853,10 @@ packages:
resolution: {integrity: sha1-soqmKIorn8ZRA1x3EfZathkDMaY=}
dev: true
+ /lodash.clonedeep/4.5.0:
+ resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==}
+ dev: false
+
/lodash.defaults/4.2.0:
resolution: {integrity: sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=}
dev: true