Skip to content

Commit 5d49fb9

Browse files
authored
Merge pull request #1310 from Meituan-Dianping/feature/platform-opt
smartprograme support
2 parents 5b3b9d2 + 33efe34 commit 5d49fb9

File tree

20 files changed

+1710
-13
lines changed

20 files changed

+1710
-13
lines changed

packages/mpvue-template-compiler/build.js

Lines changed: 870 additions & 2 deletions
Large diffs are not rendered by default.

packages/mpvue/index.js

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5505,6 +5505,8 @@ function diffData (vm, data) {
55055505
// }
55065506
// }
55075507

5508+
var KEY_SEP = '_';
5509+
55085510
function getVmData (vm) {
55095511
// 确保当前 vm 所有数据被同步
55105512
var dataKeys = [].concat(
@@ -5533,12 +5535,12 @@ function getParentComKey (vm, res) {
55335535
}
55345536

55355537
function formatVmData (vm) {
5536-
var $p = getParentComKey(vm).join(',');
5537-
var $k = $p + ($p ? ',' : '') + getComKey(vm);
5538+
var $p = getParentComKey(vm).join(KEY_SEP);
5539+
var $k = $p + ($p ? KEY_SEP : '') + getComKey(vm);
55385540

55395541
// getVmData 这儿获取当前组件内的所有数据,包含 props、computed 的数据
55405542
// 改动 vue.runtime 所获的的核心能力
5541-
var data = Object.assign(getVmData(vm), { $k: $k, $kk: ($k + ","), $p: $p });
5543+
var data = Object.assign(getVmData(vm), { $k: $k, $kk: ("" + $k + KEY_SEP), $p: $p });
55425544
var key = '$root.' + $k;
55435545
var res = {};
55445546
res[key] = data;
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
// babel-plugin-transform-object-to-ternary-operator.js
2+
3+
import * as t from 'babel-types'
4+
import generate from 'babel-generator'
5+
import template from 'babel-template'
6+
import { hyphenate } from 'shared/util'
7+
8+
function getStrByNode (node, onlyStr = false) {
9+
if (onlyStr) {
10+
return node.value || node.name || ''
11+
}
12+
return node.type === 'StringLiteral' ? node : t.stringLiteral(node.name || '')
13+
}
14+
15+
// 把 { key: value } 转换成 [ value ? 'key' : '' ]
16+
const objectVisitor = {
17+
ObjectExpression: function (path) {
18+
const elements = path.node.properties.map(propertyItem => {
19+
return t.conditionalExpression(propertyItem.value, getStrByNode(propertyItem.key), t.stringLiteral(''))
20+
})
21+
path.replaceWith(t.arrayExpression(elements))
22+
}
23+
}
24+
25+
export function transformObjectToTernaryOperator (babel) {
26+
return { visitor: objectVisitor }
27+
}
28+
29+
// 把 { key: value } 转换成 'key:' + value + ';'
30+
const objectToStringVisitor = {
31+
ObjectExpression: function (path) {
32+
const expression = path.node.properties.map(propertyItem => {
33+
const keyStr = getStrByNode(propertyItem.key, true)
34+
const key = keyStr ? hyphenate(keyStr) : keyStr
35+
const { code: val } = generate(t.ExpressionStatement(propertyItem.value))
36+
return `'${key}:' + (${val.slice(0, -1)}) + ';'`
37+
}).join('+')
38+
39+
const p = template(expression)({})
40+
path.replaceWith(p.expression)
41+
}
42+
}
43+
export function transformObjectToString (babel) {
44+
return { visitor: objectToStringVisitor }
45+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
export default {
2+
'if': 's-if',
3+
'v-for': 's-for',
4+
'alias': 's-for-item',
5+
'iterator1': 's-for-index',
6+
'key': 's-key'
7+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export default {
2+
virtualTag: ['slot', 'template', 'block']
3+
}
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
// type:
2+
// 0, 默认值, 拼接 ${name}={{ ${content} }}
3+
// 1, 拼接 ${name}
4+
// 2, 拼接 ${map[key]}={{ '${content}' }}
5+
// 3, 拼接 {{ ${content} }}
6+
// 4, 拼接为空字符串
7+
// 5, 不需要在wxml上表现出来,可直接清除
8+
9+
const noSupport = {
10+
type: 4,
11+
check: (k, v, errors) => {
12+
errors(`不支持此指令: ${k}="${v}"`)
13+
return false
14+
}
15+
}
16+
export default {
17+
'v-if': {
18+
name: 's-if',
19+
type: 2
20+
},
21+
'v-else-if': {
22+
name: 's-elif',
23+
type: 2
24+
},
25+
'v-else': {
26+
name: 'w-else',
27+
type: 1
28+
},
29+
'v-text': {
30+
name: '',
31+
type: 1
32+
},
33+
'v-html': {
34+
name: '',
35+
type: 1
36+
},
37+
'v-on': {
38+
name: '',
39+
map: {
40+
click: 'tap',
41+
touchstart: 'touchstart',
42+
touchmove: 'touchmove',
43+
touchcancel: 'touchcancel',
44+
touchend: 'touchend',
45+
tap: 'tap',
46+
longtap: 'longtap',
47+
input: 'input',
48+
change: 'change',
49+
submit: 'submit',
50+
blur: 'blur',
51+
focus: 'focus',
52+
reset: 'reset',
53+
confirm: 'confirm',
54+
columnchange: 'columnchange',
55+
linechange: 'linechange',
56+
error: 'error',
57+
scrolltoupper: 'scrolltoupper',
58+
scrolltolower: 'scrolltolower',
59+
scroll: 'scroll',
60+
load: 'load'
61+
},
62+
type: 2
63+
},
64+
'v-bind': {
65+
name: '',
66+
map: {
67+
'href': 'url'
68+
},
69+
type: 3
70+
},
71+
'href': {
72+
name: 'url',
73+
type: 2
74+
},
75+
'v-pre': noSupport,
76+
'v-cloak': noSupport,
77+
'v-once': {
78+
name: '',
79+
type: 5
80+
}
81+
}
Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
1+
export default {
2+
'br': 'view',
3+
'hr': 'view',
4+
5+
'p': 'view',
6+
'h1': 'view',
7+
'h2': 'view',
8+
'h3': 'view',
9+
'h4': 'view',
10+
'h5': 'view',
11+
'h6': 'view',
12+
'abbr': 'view',
13+
'address': 'view',
14+
'b': 'view',
15+
'bdi': 'view',
16+
'bdo': 'view',
17+
'blockquote': 'view',
18+
'cite': 'view',
19+
'code': 'view',
20+
'del': 'view',
21+
'ins': 'view',
22+
'dfn': 'view',
23+
'em': 'view',
24+
'strong': 'view',
25+
'samp': 'view',
26+
'kbd': 'view',
27+
'var': 'view',
28+
'i': 'view',
29+
'mark': 'view',
30+
'pre': 'view',
31+
'q': 'view',
32+
'ruby': 'view',
33+
'rp': 'view',
34+
'rt': 'view',
35+
's': 'view',
36+
'small': 'view',
37+
'sub': 'view',
38+
'sup': 'view',
39+
'time': 'view',
40+
'u': 'view',
41+
'wbr': 'view',
42+
43+
// 表单元素
44+
'form': 'form',
45+
'input': 'input',
46+
'textarea': 'textarea',
47+
'button': 'button',
48+
'select': 'picker',
49+
'option': 'view',
50+
'optgroup': 'view',
51+
'label': 'label',
52+
'fieldset': 'view',
53+
'datalist': 'picker',
54+
'legend': 'view',
55+
'output': 'view',
56+
57+
// 框架
58+
'iframe': 'view',
59+
// 图像
60+
'img': 'image',
61+
'canvas': 'canvas',
62+
'figure': 'view',
63+
'figcaption': 'view',
64+
65+
// 音视频
66+
'audio': 'audio',
67+
'source': 'audio',
68+
'video': 'video',
69+
'track': 'video',
70+
// 链接
71+
'a': 'navigator',
72+
'nav': 'view',
73+
'link': 'navigator',
74+
// 列表
75+
'ul': 'view',
76+
'ol': 'view',
77+
'li': 'view',
78+
'dl': 'view',
79+
'dt': 'view',
80+
'dd': 'view',
81+
'menu': 'view',
82+
'command': 'view',
83+
84+
// 表格table
85+
'table': 'view',
86+
'caption': 'view',
87+
'th': 'view',
88+
'td': 'view',
89+
'tr': 'view',
90+
'thead': 'view',
91+
'tbody': 'view',
92+
'tfoot': 'view',
93+
'col': 'view',
94+
'colgroup': 'view',
95+
96+
// 样式 节
97+
'div': 'view',
98+
'main': 'view',
99+
'span': 'label',
100+
'header': 'view',
101+
'footer': 'view',
102+
'section': 'view',
103+
'article': 'view',
104+
'aside': 'view',
105+
'details': 'view',
106+
'dialog': 'view',
107+
'summary': 'view',
108+
109+
'progress': 'progress',
110+
'meter': 'progress', // todo
111+
'head': 'view', // todo
112+
'meta': 'view', // todo
113+
'base': 'text', // todo
114+
// 'map': 'image', // TODO不是很恰当
115+
'area': 'navigator', // j结合map使用
116+
117+
'script': 'view',
118+
'noscript': 'view',
119+
'embed': 'view',
120+
'object': 'view',
121+
'param': 'view',
122+
123+
// https://mp.weixin.qq.com/debug/wxadoc/dev/component/
124+
// [...document.querySelectorAll('.markdown-section tbody td:first-child')].map(v => v.textContent).join(',\n')
125+
'view': 'view',
126+
'scroll-view': 'scroll-view',
127+
'swiper': 'swiper',
128+
'icon': 'icon',
129+
'text': 'text',
130+
// 'progress': 'progress',
131+
// 'button': 'button',
132+
// 'form': 'form',
133+
// 'input': 'input',
134+
'checkbox': 'checkbox',
135+
'radio': 'radio',
136+
'picker': 'picker',
137+
'picker-view': 'picker-view',
138+
'slider': 'slider',
139+
'switch': 'switch',
140+
// 'label': 'label',
141+
'navigator': 'navigator',
142+
// 'audio': 'audio',
143+
'image': 'image',
144+
// 'video': 'video',
145+
'map': 'map',
146+
// 'canvas': 'canvas',
147+
'contact-button': 'contact-button',
148+
'block': 'block'
149+
}

0 commit comments

Comments
 (0)