diff --git a/packages/uni-cli-shared/src/json/mp/jsonFile.ts b/packages/uni-cli-shared/src/json/mp/jsonFile.ts index e9cc34f875cca2ddf555660b53220cd9b7eed6b8..a532e83e21be154f39b4ec5ac294a7484b985080 100644 --- a/packages/uni-cli-shared/src/json/mp/jsonFile.ts +++ b/packages/uni-cli-shared/src/json/mp/jsonFile.ts @@ -127,7 +127,11 @@ export function isMiniProgramUsingComponent( componentsDir?: string } ) { - return findMiniProgramUsingComponents(options).includes(name) + return !!findMiniProgramUsingComponents(options)[name] +} + +interface MiniProgramComponents { + [name: string]: 'plugin' | 'component' } export function findMiniProgramUsingComponents({ @@ -138,15 +142,13 @@ export function findMiniProgramUsingComponents({ filename: string inputDir: string componentsDir?: string -}) { - if (!componentsDir) { - return [] - } +}): MiniProgramComponents { const globalUsingComponents = appJsonCache && appJsonCache.usingComponents - const miniProgramComponents: string[] = [] + const miniProgramComponents: MiniProgramComponents = {} if (globalUsingComponents) { - miniProgramComponents.push( - ...findMiniProgramUsingComponent(globalUsingComponents, componentsDir) + extend( + miniProgramComponents, + findMiniProgramUsingComponent(globalUsingComponents, componentsDir) ) } @@ -154,8 +156,9 @@ export function findMiniProgramUsingComponents({ removeExt(normalizeMiniProgramFilename(filename, inputDir)) ) if (jsonFile?.usingComponents) { - miniProgramComponents.push( - ...findMiniProgramUsingComponent(jsonFile.usingComponents, componentsDir) + extend( + miniProgramComponents, + findMiniProgramUsingComponent(jsonFile.usingComponents, componentsDir) ) } return miniProgramComponents @@ -163,10 +166,18 @@ export function findMiniProgramUsingComponents({ function findMiniProgramUsingComponent( usingComponents: Record, - componentsDir: string + componentsDir?: string ) { - return Object.keys(usingComponents).filter((name) => { - const path = usingComponents[name] - return path.includes(componentsDir + '/') - }) + return Object.keys(usingComponents).reduce( + (res, name) => { + const path = usingComponents[name] + if (componentsDir && path.includes(componentsDir + '/')) { + res[name] = 'component' + } else if (path.includes('plugin://')) { + res[name] = 'plugin' + } + return res + }, + {} + ) } diff --git a/packages/uni-mp-compiler/__tests__/component.spec.ts b/packages/uni-mp-compiler/__tests__/component.spec.ts index 642bf44ba7a9e1a1c15543180d1a30b5d83ebbbb..69091bd3506471d3c5532ee6143f4c474dd2a366 100644 --- a/packages/uni-mp-compiler/__tests__/component.spec.ts +++ b/packages/uni-mp-compiler/__tests__/component.spec.ts @@ -120,13 +120,14 @@ describe('compiler: transform component', () => { addMiniProgramPageJson(filename, { usingComponents: { 'van-button': 'wxcomponents/button/index', + wxparser: 'plugin://wxparserPlugin/wxparser', }, }) assert( - ``, - ``, + ``, + ``, `(_ctx, _cache) => { - return { a: _p({ customStyle: 'background-color: unset;', closeOnClickOverlay: true }) } + return { a: _ctx.richText, b: _p({ customStyle: 'background-color: unset;', closeOnClickOverlay: true }) } }`, { filename, diff --git a/packages/uni-mp-compiler/src/transform.ts b/packages/uni-mp-compiler/src/transform.ts index f6d8bb8ac70494e206ab407942dc4551fbdfdde4..a62800f8c540ccc7e07422bc52dc4e24752631c6 100644 --- a/packages/uni-mp-compiler/src/transform.ts +++ b/packages/uni-mp-compiler/src/transform.ts @@ -123,7 +123,7 @@ export interface TransformContext addVIfScope(initScope: CodegenVIfScopeInit): CodegenVIfScope addVForScope(initScope: CodegenVForScopeInit): CodegenVForScope cache(exp: T, isVNode?: boolean): CacheExpression | T - isMiniProgramComponent(name: string): boolean + isMiniProgramComponent(name: string): 'plugin' | 'component' | undefined } export function isRootScope(scope: CodegenScope): scope is CodegenRootScope { @@ -474,7 +474,7 @@ export function createTransformContext( return createCacheExpression(context.cached++, exp, isVNode) }, isMiniProgramComponent(name) { - return miniProgramComponents.includes(name) + return miniProgramComponents[name] }, } diff --git a/packages/uni-mp-compiler/src/transforms/transformComponent.ts b/packages/uni-mp-compiler/src/transforms/transformComponent.ts index ec713aded89b9114b1dc879f2569db5611dd03ce..a3cefbb737eb6c6620500936f16450b7b6b3e5f7 100644 --- a/packages/uni-mp-compiler/src/transforms/transformComponent.ts +++ b/packages/uni-mp-compiler/src/transforms/transformComponent.ts @@ -149,6 +149,10 @@ export function rewriteBinding( context: TransformContext ) { const isMiniProgramComponent = context.isMiniProgramComponent(tag) + if (isMiniProgramComponent === 'plugin') { + // 因无法介入插件类型组件内部实现,故保留原始属性 + return + } const createObjectProperty = isMiniProgramComponent ? (name: string, value: Expression) =>