Skip to content

Commit c4bac9c

Browse files
authored
fix: handle Vue 3.6+ vapor runtime imports correctly (#357)
close #356 - Use `https://cdn.jsdelivr.net/npm/vue@3.6.x/dist/vue.runtime-with-vapor.esm-browser.js` as the runtime import. - Use `createVaporApp` or `createVaporSSRApp` when vapor mode is supported and `App.vue` is a vapor component.
1 parent a93c800 commit c4bac9c

File tree

2 files changed

+37
-12
lines changed

2 files changed

+37
-12
lines changed

src/import-map.ts

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,15 @@
11
import { computed, version as currentVersion, ref } from 'vue'
22

3+
export function getVersions(version: string): number[] {
4+
return version.split('.').map((v) => parseInt(v, 10))
5+
}
6+
7+
export function isVaporSupported(version: string): boolean{
8+
const [major, minor] = getVersions(version)
9+
// vapor mode is supported in v3.6+
10+
return major > 3 || (major === 3 && minor >= 6)
11+
}
12+
313
export function useVueImportMap(
414
defaults: {
515
runtimeDev?: string | (() => string)
@@ -15,15 +25,21 @@ export function useVueImportMap(
1525

1626
const productionMode = ref(false)
1727
const vueVersion = ref<string | null>(defaults.vueVersion || null)
28+
29+
function getVueURL() {
30+
const version = vueVersion.value || currentVersion
31+
return isVaporSupported(version)
32+
? `https://cdn.jsdelivr.net/npm/vue@${version}/dist/vue.runtime-with-vapor.esm-browser${productionMode.value ? `.prod` : ``}.js`
33+
: `https://cdn.jsdelivr.net/npm/@vue/runtime-dom@${version}/dist/runtime-dom.esm-browser${productionMode.value ? `.prod` : ``}.js`
34+
}
35+
1836
const importMap = computed<ImportMap>(() => {
1937
const vue =
2038
(!vueVersion.value &&
2139
normalizeDefaults(
2240
productionMode.value ? defaults.runtimeProd : defaults.runtimeDev,
2341
)) ||
24-
`https://cdn.jsdelivr.net/npm/@vue/runtime-dom@${
25-
vueVersion.value || currentVersion
26-
}/dist/runtime-dom.esm-browser${productionMode.value ? `.prod` : ``}.js`
42+
getVueURL()
2743

2844
const serverRenderer =
2945
(!vueVersion.value && normalizeDefaults(defaults.serverRenderer)) ||

src/output/Sandbox.vue

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import { PreviewProxy } from './PreviewProxy'
1616
import { compileModulesForPreview } from './moduleCompiler'
1717
import type { Store } from '../store'
1818
import { injectKeyProps } from '../types'
19+
import { getVersions, isVaporSupported } from '../import-map'
1920
2021
export interface SandboxProps {
2122
store: Store
@@ -202,9 +203,7 @@ async function updatePreview() {
202203
203204
let isSSR = props.ssr
204205
if (store.value.vueVersion) {
205-
const [major, minor, patch] = store.value.vueVersion
206-
.split('.')
207-
.map((v) => parseInt(v, 10))
206+
const [major, minor, patch] = getVersions(store.value.vueVersion)
208207
if (major === 3 && (minor < 2 || (minor === 2 && patch < 27))) {
209208
alert(
210209
`The selected version of Vue (${store.value.vueVersion}) does not support in-browser SSR.` +
@@ -214,6 +213,10 @@ async function updatePreview() {
214213
}
215214
}
216215
216+
const vaporSupported = isVaporSupported(
217+
store.value.vueVersion || store.value.compiler?.version
218+
)
219+
217220
try {
218221
const { mainFile } = store.value
219222
@@ -228,10 +231,11 @@ async function updatePreview() {
228231
`const __modules__ = {};`,
229232
...ssrModules,
230233
`import { renderToString as _renderToString } from 'vue/server-renderer'
231-
import { createSSRApp as _createApp } from 'vue'
234+
import { createSSRApp as _createApp ${vaporSupported ? ', createVaporSSRApp as _createVaporApp' : ''} } from 'vue'
232235
const AppComponent = __modules__["${mainFile}"].default
233236
AppComponent.name = 'Repl'
234-
const app = _createApp(AppComponent)
237+
const vaporSupported = ${vaporSupported}
238+
const app = (vaporSupported && AppComponent.__vapor ? _createVaporApp : _createApp)(AppComponent)
235239
if (!app.config.hasOwnProperty('unwrapInjectedRef')) {
236240
app.config.unwrapInjectedRef = true
237241
}
@@ -297,14 +301,19 @@ async function updatePreview() {
297301
// if main file is a vue file, mount it.
298302
if (mainFile.endsWith('.vue')) {
299303
codeToEval.push(
300-
`import { ${
301-
isSSR ? `createSSRApp` : `createApp`
302-
} as _createApp } from "vue"
304+
`import { ${isSSR ? `createSSRApp` : `createApp`} as _createApp ${
305+
vaporSupported
306+
? `, ${
307+
isSSR ? 'createVaporSSRApp' : 'createVaporApp'
308+
} as _createVaporApp`
309+
: ''
310+
} } from "vue"
303311
${previewOptions.value?.customCode?.importCode || ''}
304312
const _mount = () => {
305313
const AppComponent = __modules__["${mainFile}"].default
306314
AppComponent.name = 'Repl'
307-
const app = window.__app__ = _createApp(AppComponent)
315+
const vaporSupported = ${vaporSupported}
316+
const app = window.__app__ = (vaporSupported && AppComponent.__vapor ? _createVaporApp : _createApp)(AppComponent)
308317
if (!app.config.hasOwnProperty('unwrapInjectedRef')) {
309318
app.config.unwrapInjectedRef = true
310319
}

0 commit comments

Comments
 (0)