fix(preview): fix preview vue-repl unsupport jsx bug (#343)

This commit is contained in:
chilingling 2024-03-22 16:25:51 +08:00 committed by GitHub
parent 13db22af27
commit d0241a9972
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 21 additions and 53 deletions

View File

@ -35,29 +35,6 @@ const EmptyEditor = defineComponent({
}
})
const importNames = [
'createVNode',
'Fragment',
'resolveComponent',
'withDirectives',
'vShow',
'vModelSelect',
'vModelText',
'vModelCheckbox',
'vModelRadio',
'vModelText',
'vModelDynamic',
'resolveDirective',
'mergeProps',
'createTextVNode',
'isVNode'
]
const importRegexps = importNames.map((name) => ({
regexp: new RegExp(`_${name}`, 'g'),
replace: `vue.${name}`
}))
export default {
components: {
Repl
@ -67,35 +44,6 @@ export default {
const editorComponent = computed(() => (debugSwitch?.value ? Monaco : EmptyEditor))
const store = new ReplStore()
const compiler = store.compiler
const compileScript = compiler.compileScript
// repl script vue jsx
store.compiler = {
...compiler,
compileScript(...args) {
// repl script
const compiledScript = compileScript(...args)
// vue jsx
const script = transformSync(compiledScript.content, {
babelrc: false,
plugins: [vueJsx],
sourceMaps: false,
configFile: false
})
// vue jsx import
let code = script.code.replace(/import \{.+\} from "vue";/, '')
// 使 vue vue vue
importRegexps.forEach((regexp) => {
code = code.replace(regexp.regexp, regexp.replace)
})
compiledScript.content = code
return compiledScript
}
}
const sfcOptions = {
script: {
// scirpt setup import { * } from "vue"
@ -168,7 +116,27 @@ export default {
panelName = 'Main.vue'
}
newFiles[panelName] = panelValue
const newPanelValue = panelValue.replace(/<script\s*setup\s*>([\s\S]*)<\/script>/, (match, p1) => {
if (!p1) {
// eslint-disable-next-line no-useless-escape
return '<script setup><\/script>'
}
const transformedScript = transformSync(p1, {
babelrc: false,
plugins: [[vueJsx, { pragma: 'h' }]],
sourceMaps: false,
configFile: false
})
const res = `<script setup>${transformedScript.code}`
// eslint-disable-next-line no-useless-escape
const endTag = '<\/script>'
return `${res}${endTag}`
})
newFiles[panelName] = newPanelValue
}
const appJsCode = processAppJsCode(newFiles['app.js'], queryParams.styles)