From 565ca33a97f19daab120d60f096dac86353943e3 Mon Sep 17 00:00:00 2001 From: qiang Date: Fri, 9 Sep 2022 14:54:52 +0800 Subject: [PATCH] fix(mp): __sfc_main.components = Object.assign... #3748 --- .../__tests__/components.spec.js | 16 +++++++++++++++- .../lib/babel/scoped-component-traverse.js | 7 ++++++- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/packages/webpack-uni-mp-loader/__tests__/components.spec.js b/packages/webpack-uni-mp-loader/__tests__/components.spec.js index e1c563dd0..4bbcf16d8 100644 --- a/packages/webpack-uni-mp-loader/__tests__/components.spec.js +++ b/packages/webpack-uni-mp-loader/__tests__/components.spec.js @@ -163,6 +163,20 @@ global['__wxVueOptions'] = { } ]) + assertCodegen(` + import CustomButton from './custom-button.vue' + const __sfc_main = {} + __sfc_main.components = Object.assign({ + 'custom-button': CustomButton + }, __sfc_main.components) + export default __sfc_main + `, + [{ + name: 'custom-button', + value: 'CustomButton', + source: './custom-button.vue' + }]) + assertCodegen( `import myButton from '@/components/my-button/my-button.vue'; export default { @@ -311,4 +325,4 @@ global['__wxVueOptions'] = { source: '@/components/tab-nvue/mediaList.vue' }], false) }) -}) +}) diff --git a/packages/webpack-uni-mp-loader/lib/babel/scoped-component-traverse.js b/packages/webpack-uni-mp-loader/lib/babel/scoped-component-traverse.js index c47c1f222..80afcec6f 100644 --- a/packages/webpack-uni-mp-loader/lib/babel/scoped-component-traverse.js +++ b/packages/webpack-uni-mp-loader/lib/babel/scoped-component-traverse.js @@ -83,10 +83,15 @@ function handleIdentifier ({ if (t.isVariableDeclarator(declaration)) { identifier = declaration.id declaration = declaration.init - } else if (t.isExpressionStatement(declaration)) { + } else if (t.isExpressionStatement(declaration) && t.isAssignmentExpression(declaration.expression)) { identifier = declaration.expression.left declaration = declaration.expression.right } + // __sfc_main.components = Object.assign({CustomButton}, __sfc_main.components); + if (t.isMemberExpression(identifier) && identifier.object.name === name && identifier.property.name === 'components' && t.isCallExpression(declaration) && declaration.arguments.length === 2 && t.isObjectExpression(declaration.arguments[0])) { + handleComponentsObjectExpression(declaration.arguments[0], path, state, true) + return + } if (identifier.name === name) { if (t.isCallExpression(declaration) && t.isMemberExpression(declaration.callee) && -- GitLab