diff --git a/packages/uni-cli-shared/src/vite/utils/ast.ts b/packages/uni-cli-shared/src/vite/utils/ast.ts
index 9fb0b2023a576b901901d914e6aefd9754eb74d2..4c4c5984269d77286a865c3c51c6876dcea8cf57 100644
--- a/packages/uni-cli-shared/src/vite/utils/ast.ts
+++ b/packages/uni-cli-shared/src/vite/utils/ast.ts
@@ -17,6 +17,7 @@ import {
ElementNode,
DirectiveNode,
SimpleExpressionNode,
+ AttributeNode,
} from '@vue/compiler-core'
import { parse } from '@vue/compiler-dom'
@@ -98,6 +99,10 @@ export function isElementNode(node: Node): node is ElementNode {
return node.type === NodeTypes.ELEMENT
}
+export function isAttributeNode(node: Node): node is AttributeNode {
+ return node.type === NodeTypes.ATTRIBUTE
+}
+
export function isDirectiveNode(node: Node): node is DirectiveNode {
return node.type === NodeTypes.DIRECTIVE
}
diff --git a/packages/uni-mp-compiler/__tests__/class.spec.ts b/packages/uni-mp-compiler/__tests__/class.spec.ts
index 8496345f34846e5dda8c3c27833edd2277a26125..434d8713881fba7f73af75b897188ff7222bf3d4 100644
--- a/packages/uni-mp-compiler/__tests__/class.spec.ts
+++ b/packages/uni-mp-compiler/__tests__/class.spec.ts
@@ -21,6 +21,15 @@ describe('compiler: transform class', () => {
``,
`(_ctx, _cache) => {
return {}
+}`
+ )
+ assert(
+ ``,
+ ``,
+ `(_ctx, _cache) => {
+ return {}
}`
)
})
diff --git a/packages/uni-mp-compiler/__tests__/component.spec.ts b/packages/uni-mp-compiler/__tests__/component.spec.ts
index 69091bd3506471d3c5532ee6143f4c474dd2a366..d16f84699adec18f7207f93756ba8c5ea2b0a5df 100644
--- a/packages/uni-mp-compiler/__tests__/component.spec.ts
+++ b/packages/uni-mp-compiler/__tests__/component.spec.ts
@@ -100,8 +100,8 @@ describe('compiler: transform component', () => {
})
test(`component with props`, () => {
assert(
- ``,
- ``,
+ ``,
+ ``,
`(_ctx, _cache) => {
return { a: _ctx.b, b: _ctx.d, c: _n(_ctx.f), d: _s(_ctx.h), e: _o(_ctx.i), f: _ctx.o, g: _ctx.r, h: _ctx.t, i: _o($event => _ctx.j = $event), j: _o($event => _ctx.k = $event), k: _p({ ['prop-a']: 'l', ['prop-b']: _ctx.m, first: _ctx.j, last: _ctx.k }) }
}`
diff --git a/packages/uni-mp-compiler/__tests__/style.spec.ts b/packages/uni-mp-compiler/__tests__/style.spec.ts
index ab96b519b87fcc590b2ad21a7df1b38d53040c50..3c70dd3fbea2baa0b65f7a13fb1c25c100b98678 100644
--- a/packages/uni-mp-compiler/__tests__/style.spec.ts
+++ b/packages/uni-mp-compiler/__tests__/style.spec.ts
@@ -4,14 +4,24 @@ describe('compiler: transform style', () => {
test(`static style`, () => {
assert(
``,
- ``,
+ ``,
`(_ctx, _cache) => {
return {}
}`
)
assert(
``,
- ``,
+ ``,
+ `(_ctx, _cache) => {
+ return {}
+}`
+ )
+ assert(
+ ``,
+ ``,
`(_ctx, _cache) => {
return {}
}`
@@ -36,14 +46,14 @@ describe('compiler: transform style', () => {
test('v-bind:style basic + style ', () => {
assert(
``,
- ``,
+ ``,
`(_ctx, _cache) => {
return { a: _s(_ctx.foo) }
}`
)
assert(
``,
- ``,
+ ``,
`(_ctx, _cache) => {
return { a: _s(_ctx.foo) }
}`
diff --git a/packages/uni-mp-compiler/src/compile.ts b/packages/uni-mp-compiler/src/compile.ts
index 3806b098fdea328a466d07b5d8af80904b90129d..27e75829de035282260113ca5a11a496e907734e 100644
--- a/packages/uni-mp-compiler/src/compile.ts
+++ b/packages/uni-mp-compiler/src/compile.ts
@@ -18,6 +18,7 @@ import { transformSlot } from './transforms/vSlot'
import { transformRoot } from './transforms/transformRoot'
import { transformTag } from './transforms/transformTag'
import { transformHtml } from './transforms/vHtml'
+import { transformAttr } from './transforms/transformAttr'
export type TransformPreset = [
NodeTransform[],
@@ -34,6 +35,7 @@ export function getBaseTransformPreset({
// order is important
const nodeTransforms = [
transformRoot,
+ transformAttr,
transformTag,
transformHtml,
transformIf,
diff --git a/packages/uni-mp-compiler/src/transforms/transformAttr.ts b/packages/uni-mp-compiler/src/transforms/transformAttr.ts
new file mode 100644
index 0000000000000000000000000000000000000000..dacea2f758beef57f970b5ea7e208e45d329ed64
--- /dev/null
+++ b/packages/uni-mp-compiler/src/transforms/transformAttr.ts
@@ -0,0 +1,20 @@
+import { isAttributeNode, isElementNode } from '@dcloudio/uni-cli-shared'
+import { parseStringStyle, stringifyStyle } from '@vue/shared'
+import { NodeTransform } from '../transform'
+
+export const transformAttr: NodeTransform = (node, _) => {
+ if (!isElementNode(node)) {
+ return
+ }
+ node.props.forEach((prop) => {
+ if (isAttributeNode(prop) && prop.value) {
+ switch (prop.name) {
+ case 'style':
+ prop.value.content = stringifyStyle(
+ parseStringStyle(prop.value.content)
+ ).slice(0, -1) // 移除最后一个分号,省点大小吧
+ break
+ }
+ }
+ })
+}