diff --git a/packages/vite/src/node/__tests__/scan.spec.ts b/packages/vite/src/node/__tests__/scan.spec.ts index 28495709d02631..95f25c5a90db8e 100644 --- a/packages/vite/src/node/__tests__/scan.spec.ts +++ b/packages/vite/src/node/__tests__/scan.spec.ts @@ -1,4 +1,10 @@ -import { scriptRE, commentRE, importsRE } from '../optimizer/scan' +import { + scriptRE, + commentRE, + importsRE, + multilineCommentsRE, + singlelineCommentsRE +} from '../optimizer/scan' describe('optimizer-scan:script-test', () => { const scriptContent = `import { defineComponent } from 'vue' @@ -102,4 +108,16 @@ describe('optimizer-scan:script-test', () => { expect(importsRE.test(str)).toBe(false) }) }) + + test('script comments test', () => { + multilineCommentsRE.lastIndex = 0 + let ret = `/* + export default { } + */`.replace(multilineCommentsRE, '') + expect(ret).not.toContain('export default') + + singlelineCommentsRE.lastIndex = 0 + ret = `//export default { }`.replace(singlelineCommentsRE, '') + expect(ret).not.toContain('export default') + }) }) diff --git a/packages/vite/src/node/optimizer/scan.ts b/packages/vite/src/node/optimizer/scan.ts index 26ad02675e518a..83eb9e703195ba 100644 --- a/packages/vite/src/node/optimizer/scan.ts +++ b/packages/vite/src/node/optimizer/scan.ts @@ -40,7 +40,8 @@ const htmlTypesRE = /\.(html|vue|svelte)$/ export const importsRE = /(? @@ -235,6 +236,10 @@ function esbuildScanPlugin( js += content + '\n' } } + // empty singleline & multiline comments to avoid matching comments + const code = js + .replace(multilineCommentsRE, '/* */') + .replace(singlelineCommentsRE, '') if ( loader.startsWith('ts') && @@ -247,8 +252,6 @@ function esbuildScanPlugin( // the solution is to add `import 'x'` for every source to force // esbuild to keep crawling due to potential side effects. let m - // empty multiline comments to avoid matching commented out imports - const code = js.replace(multilineCommentsRE, '/* */') while ((m = importsRE.exec(code)) != null) { // This is necessary to avoid infinite loops with zero-width matches if (m.index === importsRE.lastIndex) { @@ -258,11 +261,11 @@ function esbuildScanPlugin( } } - if (!js.includes(`export default`)) { + if (!code.includes(`export default`)) { js += `\nexport default {}` } - if (js.includes('import.meta.glob')) { + if (code.includes('import.meta.glob')) { return { // transformGlob already transforms to js loader: 'js',