diff --git a/packages/playground/preload/__tests__/preload.spec.ts b/packages/playground/preload/__tests__/preload.spec.ts
new file mode 100644
index 00000000000000..eaee5e306cd7c5
--- /dev/null
+++ b/packages/playground/preload/__tests__/preload.spec.ts
@@ -0,0 +1,14 @@
+import { isBuild } from '../../testUtils'
+
+test('should have no 404s', () => {
+ browserLogs.forEach((msg) => {
+ expect(msg).not.toMatch('404')
+ })
+})
+
+if (isBuild) {
+ test('dynamic import', async () => {
+ let appHtml = await page.content()
+ expect(appHtml).toMatch('This is home page.')
+ })
+}
diff --git a/packages/playground/preload/index.html b/packages/playground/preload/index.html
new file mode 100644
index 00000000000000..affed21f9791cf
--- /dev/null
+++ b/packages/playground/preload/index.html
@@ -0,0 +1,8 @@
+
+
diff --git a/packages/playground/preload/package.json b/packages/playground/preload/package.json
new file mode 100644
index 00000000000000..5f0ff00cb9f527
--- /dev/null
+++ b/packages/playground/preload/package.json
@@ -0,0 +1,19 @@
+{
+ "name": "test-preload",
+ "private": true,
+ "version": "0.0.0",
+ "scripts": {
+ "dev": "vite",
+ "build": "vite build",
+ "debug": "node --inspect-brk ../../vite/bin/vite",
+ "serve": "vite preview"
+ },
+ "dependencies": {
+ "vue": "^3.0.8",
+ "vue-router": "^4.0.6"
+ },
+ "devDependencies": {
+ "@vitejs/plugin-vue": "^1.0.0",
+ "@vue/compiler-sfc": "^3.0.8"
+ }
+}
diff --git a/packages/playground/preload/router.js b/packages/playground/preload/router.js
new file mode 100644
index 00000000000000..a02628099bf264
--- /dev/null
+++ b/packages/playground/preload/router.js
@@ -0,0 +1,16 @@
+import { createRouter, createWebHashHistory } from 'vue-router'
+import Home from './src/components/Home.vue'
+
+const routes = [
+ { path: '/', name: 'Home', component: Home },
+ {
+ path: '/about',
+ name: 'About',
+ component: () => import('./src/components/About.vue')
+ } // Lazy load route component
+]
+
+export default createRouter({
+ routes,
+ history: createWebHashHistory()
+})
diff --git a/packages/playground/preload/src/App.vue b/packages/playground/preload/src/App.vue
new file mode 100644
index 00000000000000..f0550400dc4759
--- /dev/null
+++ b/packages/playground/preload/src/App.vue
@@ -0,0 +1,6 @@
+
+
+
+
+
diff --git a/packages/playground/preload/src/components/About.vue b/packages/playground/preload/src/components/About.vue
new file mode 100644
index 00000000000000..0721c7e53eb584
--- /dev/null
+++ b/packages/playground/preload/src/components/About.vue
@@ -0,0 +1,10 @@
+
+
+ This is about page.
+
+ Go to Home page
+
+
+
+
diff --git a/packages/playground/preload/src/components/Home.vue b/packages/playground/preload/src/components/Home.vue
new file mode 100644
index 00000000000000..94d8850c47d28a
--- /dev/null
+++ b/packages/playground/preload/src/components/Home.vue
@@ -0,0 +1,10 @@
+
+
+ This is home page.
+
+ Go to About page
+
+
+
+
diff --git a/packages/playground/preload/vite.config.js b/packages/playground/preload/vite.config.js
new file mode 100644
index 00000000000000..96fb82f51ed349
--- /dev/null
+++ b/packages/playground/preload/vite.config.js
@@ -0,0 +1,15 @@
+const vuePlugin = require('@vitejs/plugin-vue')
+
+module.exports = {
+ plugins: [vuePlugin()],
+ build: {
+ terserOptions: {
+ format: {
+ beautify: true
+ },
+ compress: {
+ passes: 3
+ }
+ }
+ }
+}
diff --git a/packages/vite/src/node/plugins/importAnalysisBuild.ts b/packages/vite/src/node/plugins/importAnalysisBuild.ts
index 98aecac489f838..9672c5446bb5b0 100644
--- a/packages/vite/src/node/plugins/importAnalysisBuild.ts
+++ b/packages/vite/src/node/plugins/importAnalysisBuild.ts
@@ -26,7 +26,7 @@ const preloadMarkerRE = new RegExp(`"${preloadMarker}"`, 'g')
*/
function preload(baseModule: () => Promise<{}>, deps?: string[]) {
// @ts-ignore
- if (!__VITE_IS_MODERN__ || !deps) {
+ if (!__VITE_IS_MODERN__ || !deps || deps.length === 0) {
return baseModule()
}
@@ -262,7 +262,12 @@ export function buildImportAnalysisPlugin(config: ResolvedConfig): Plugin {
addDeps(normalizedFile)
}
- const markPos = code.indexOf(preloadMarker, end)
+ let markPos = code.indexOf(preloadMarker, end)
+ // fix issue #3051
+ if (markPos === -1 && imports.length === 1) {
+ markPos = code.indexOf(preloadMarker)
+ }
+
if (markPos > 0) {
s.overwrite(
markPos - 1,
@@ -271,7 +276,7 @@ export function buildImportAnalysisPlugin(config: ResolvedConfig): Plugin {
// preload when there are actual other deps.
deps.size > 1
? `[${[...deps].map((d) => JSON.stringify(d)).join(',')}]`
- : `void 0`
+ : `[]`
)
}
}