提交 ec468f85 编写于 作者: fxy060608's avatar fxy060608

fix(mp): disable descriptor cache (#3685)

上级 e7fd101c
......@@ -12,11 +12,7 @@ import {
AppJson,
resolveVueI18nRuntime,
} from '@dcloudio/uni-cli-shared'
import type {
SFCDescriptor,
SFCScriptBlock,
SFCScriptCompileOptions,
} from '@vue/compiler-sfc'
import type { CompilerOptions } from '@dcloudio/uni-mp-compiler'
import { uniOptions } from './uni'
......@@ -25,6 +21,10 @@ import { createConfigResolved } from './configResolved'
import { emitFile, getFilterFiles, getTemplateFiles } from './template'
import { getNVueCssPaths } from '../plugins/pagesJson'
import {
rewriteCompilerSfcParseOnce,
rewriteCompileScriptOnce,
} from './polyfill'
export interface UniMiniProgramPluginOptions {
cdn?: number
......@@ -107,7 +107,8 @@ export function uniMiniProgramPlugin(
let resolvedConfig: ResolvedConfig
rewriteCompileScript()
rewriteCompileScriptOnce()
rewriteCompilerSfcParseOnce()
return {
name: 'uni:mp',
......@@ -192,18 +193,3 @@ export function uniMiniProgramPlugin(
},
}
}
function rewriteCompileScript() {
const compiler = require(resolveBuiltIn('@vue/compiler-sfc'))
const { compileScript } = compiler
compiler.compileScript = (
sfc: SFCDescriptor,
options: SFCScriptCompileOptions
): SFCScriptBlock => {
if (options?.templateOptions?.compilerOptions) {
;(options.templateOptions.compilerOptions as any).bindingCssVars =
sfc.cssVars || []
}
return compileScript(sfc, options)
}
}
import { extend } from '@vue/shared'
import { once } from '@dcloudio/uni-shared'
import { resolveBuiltIn } from '@dcloudio/uni-cli-shared'
import {
SFCDescriptor,
SFCParseOptions,
SFCParseResult,
SFCScriptBlock,
SFCScriptCompileOptions,
} from '@vue/compiler-sfc'
export const rewriteCompileScriptOnce = once(rewriteCompileScript)
export const rewriteCompilerSfcParseOnce = once(rewriteCompilerSfcParse)
function rewriteCompileScript() {
const compiler = require(resolveBuiltIn('@vue/compiler-sfc'))
const { compileScript } = compiler
compiler.compileScript = (
sfc: SFCDescriptor,
options: SFCScriptCompileOptions
): SFCScriptBlock => {
if (options?.templateOptions?.compilerOptions) {
;(options.templateOptions.compilerOptions as any).bindingCssVars =
sfc.cssVars || []
}
return compileScript(sfc, options)
}
}
/**
* 重写 parse,解决相同内容被缓存,未触发 template 编译的问题
*/
function rewriteCompilerSfcParse() {
// @ts-ignore
const compilerSfc = require(resolveBuiltIn('@vue/compiler-sfc'))
const { parse } = compilerSfc
compilerSfc.parse = (
source: string,
options: SFCParseOptions
): SFCParseResult => {
const res = parse(source, options) as SFCParseResult
// template 中,先<view>hello</view>,然后修改为<view></view>,再恢复为<view>hello</view>,
// 此时因为 descriptor 被缓存,不会触发 compileTemplate,故 parse 时,每次生成一个全新的 descriptor
// https://github.com/vitejs/vite/blob/v2.9.13/packages/plugin-vue/src/script.ts#L44
// https://github.com/dcloudio/uni-app/issues/3685
res.descriptor = extend({}, res.descriptor)
return res
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册