@mpxjs/webpack-plugin 2.9.40 → 2.9.41
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/config.js +63 -97
- package/lib/dependencies/DynamicEntryDependency.js +13 -4
- package/lib/dependencies/{RecordVueContentDependency.js → RecordLoaderContentDependency.js} +5 -5
- package/lib/dependencies/ResolveDependency.js +2 -2
- package/lib/helpers.js +5 -1
- package/lib/index.js +59 -45
- package/lib/json-compiler/helper.js +6 -3
- package/lib/json-compiler/index.js +9 -7
- package/lib/loader.js +43 -97
- package/lib/native-loader.js +0 -1
- package/lib/platform/index.js +3 -0
- package/lib/platform/style/wx/index.js +414 -0
- package/lib/platform/template/wx/component-config/button.js +36 -0
- package/lib/platform/template/wx/component-config/image.js +15 -0
- package/lib/platform/template/wx/component-config/input.js +41 -0
- package/lib/platform/template/wx/component-config/scroll-view.js +27 -1
- package/lib/platform/template/wx/component-config/swiper-item.js +13 -1
- package/lib/platform/template/wx/component-config/swiper.js +25 -1
- package/lib/platform/template/wx/component-config/text.js +15 -0
- package/lib/platform/template/wx/component-config/textarea.js +39 -0
- package/lib/platform/template/wx/component-config/unsupported.js +18 -0
- package/lib/platform/template/wx/component-config/view.js +14 -0
- package/lib/platform/template/wx/index.js +88 -4
- package/lib/react/index.js +104 -0
- package/lib/react/processJSON.js +361 -0
- package/lib/react/processMainScript.js +21 -0
- package/lib/react/processScript.js +70 -0
- package/lib/react/processStyles.js +69 -0
- package/lib/react/processTemplate.js +152 -0
- package/lib/react/script-helper.js +133 -0
- package/lib/react/style-helper.js +91 -0
- package/lib/resolver/PackageEntryPlugin.js +1 -0
- package/lib/runtime/components/react/event.config.ts +32 -0
- package/lib/runtime/components/react/getInnerListeners.ts +289 -0
- package/lib/runtime/components/react/getInnerListeners.type.ts +68 -0
- package/lib/runtime/components/react/mpx-button.tsx +402 -0
- package/lib/runtime/components/react/mpx-image/index.tsx +351 -0
- package/lib/runtime/components/react/mpx-image/svg.tsx +21 -0
- package/lib/runtime/components/react/mpx-input.tsx +389 -0
- package/lib/runtime/components/react/mpx-scroll-view.tsx +412 -0
- package/lib/runtime/components/react/mpx-swiper/carouse.tsx +398 -0
- package/lib/runtime/components/react/mpx-swiper/index.tsx +68 -0
- package/lib/runtime/components/react/mpx-swiper/type.ts +69 -0
- package/lib/runtime/components/react/mpx-swiper-item.tsx +42 -0
- package/lib/runtime/components/react/mpx-text.tsx +106 -0
- package/lib/runtime/components/react/mpx-textarea.tsx +46 -0
- package/lib/runtime/components/react/mpx-view.tsx +397 -0
- package/lib/runtime/components/react/useNodesRef.ts +39 -0
- package/lib/runtime/components/react/utils.ts +92 -0
- package/lib/runtime/optionProcessorReact.d.ts +9 -0
- package/lib/runtime/optionProcessorReact.js +21 -0
- package/lib/runtime/stringify.wxs +10 -28
- package/lib/style-compiler/index.js +2 -1
- package/lib/template-compiler/compiler.js +280 -37
- package/lib/template-compiler/gen-node-react.js +95 -0
- package/lib/template-compiler/index.js +15 -24
- package/lib/utils/env.js +17 -0
- package/lib/utils/make-map.js +1 -1
- package/lib/utils/shallow-stringify.js +12 -12
- package/lib/web/index.js +123 -0
- package/lib/web/processJSON.js +3 -3
- package/lib/web/processMainScript.js +25 -23
- package/lib/web/processScript.js +12 -16
- package/lib/web/processTemplate.js +13 -12
- package/lib/web/script-helper.js +14 -22
- package/package.json +4 -3
|
@@ -14,8 +14,9 @@ const makeMap = require('../utils/make-map')
|
|
|
14
14
|
const { isNonPhrasingTag } = require('../utils/dom-tag-config')
|
|
15
15
|
const setBaseWxml = require('../runtime-render/base-wxml')
|
|
16
16
|
const { parseExp } = require('./parse-exps')
|
|
17
|
-
|
|
18
17
|
const shallowStringify = require('../utils/shallow-stringify')
|
|
18
|
+
const { isReact } = require('../utils/env')
|
|
19
|
+
|
|
19
20
|
const no = function () {
|
|
20
21
|
return false
|
|
21
22
|
}
|
|
@@ -37,6 +38,7 @@ const endTag = new RegExp(('^<\\/' + qnameCapture + '[^>]*>'))
|
|
|
37
38
|
const doctype = /^<!DOCTYPE [^>]+>/i
|
|
38
39
|
const comment = /^<!--/
|
|
39
40
|
const conditionalComment = /^<!\[/
|
|
41
|
+
const hoverClassReg = /^mpx-((cover-)?view|button|navigator)$/
|
|
40
42
|
let IS_REGEX_CAPTURING_BROKEN = false
|
|
41
43
|
'x'.replace(/x(.)?/g, function (m, g) {
|
|
42
44
|
IS_REGEX_CAPTURING_BROKEN = g === ''
|
|
@@ -77,11 +79,11 @@ function createASTElement (tag, attrs = [], parent = null) {
|
|
|
77
79
|
|
|
78
80
|
function isForbiddenTag (el) {
|
|
79
81
|
return (
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
82
|
+
el.tag === 'style' ||
|
|
83
|
+
(el.tag === 'script' && (
|
|
84
|
+
!el.attrsMap.type ||
|
|
85
|
+
el.attrsMap.type === 'text/javascript'
|
|
86
|
+
))
|
|
85
87
|
)
|
|
86
88
|
}
|
|
87
89
|
|
|
@@ -99,6 +101,7 @@ let moduleId
|
|
|
99
101
|
let isNative
|
|
100
102
|
let hasScoped
|
|
101
103
|
let hasVirtualHost
|
|
104
|
+
let runtimeCompile
|
|
102
105
|
let rulesRunner
|
|
103
106
|
let currentEl
|
|
104
107
|
let injectNodes = []
|
|
@@ -285,8 +288,8 @@ function parseHTML (html, options) {
|
|
|
285
288
|
endTagLength = endTag.length
|
|
286
289
|
if (!isPlainTextElement(stackedTag) && stackedTag !== 'noscript') {
|
|
287
290
|
text = text
|
|
288
|
-
|
|
289
|
-
|
|
291
|
+
.replace(/<!--([\s\S]*?)-->/g, '$1')
|
|
292
|
+
.replace(/<!\[CDATA\[([\s\S]*?)]]>/g, '$1')
|
|
290
293
|
}
|
|
291
294
|
if (shouldIgnoreFirstNewline(stackedTag, text)) {
|
|
292
295
|
text = text.slice(1)
|
|
@@ -425,7 +428,7 @@ function parseHTML (html, options) {
|
|
|
425
428
|
for (let i = stack.length - 1; i >= pos; i--) {
|
|
426
429
|
if ((i > pos || !tagName) && options.warn) {
|
|
427
430
|
options.warn(
|
|
428
|
-
|
|
431
|
+
('tag <' + (stack[i].tag) + '> has no matching end tag.')
|
|
429
432
|
)
|
|
430
433
|
}
|
|
431
434
|
if (options.end) {
|
|
@@ -616,6 +619,7 @@ function parse (template, options) {
|
|
|
616
619
|
hasVirtualHost = options.hasVirtualHost
|
|
617
620
|
filePath = options.filePath
|
|
618
621
|
i18n = options.i18n
|
|
622
|
+
runtimeCompile = options.runtimeCompile
|
|
619
623
|
platformGetTagNamespace = options.getTagNamespace || no
|
|
620
624
|
refId = 0
|
|
621
625
|
injectNodes = []
|
|
@@ -688,9 +692,9 @@ function parse (template, options) {
|
|
|
688
692
|
if (isForbiddenTag(element)) {
|
|
689
693
|
element.forbidden = true
|
|
690
694
|
warn$1(
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
695
|
+
'Templates should only be responsible for mapping the state to the ' +
|
|
696
|
+
'UI. Avoid placing tags with side-effects in your templates, such as ' +
|
|
697
|
+
'<' + tag + '>' + ', as they will not be parsed.'
|
|
694
698
|
)
|
|
695
699
|
}
|
|
696
700
|
|
|
@@ -747,7 +751,7 @@ function parse (template, options) {
|
|
|
747
751
|
parent: currentParent
|
|
748
752
|
}
|
|
749
753
|
children.push(el)
|
|
750
|
-
|
|
754
|
+
runtimeCompile ? processTextDynamic(el) : processText(el)
|
|
751
755
|
}
|
|
752
756
|
}
|
|
753
757
|
},
|
|
@@ -859,20 +863,21 @@ function modifyAttr (el, name, val) {
|
|
|
859
863
|
}
|
|
860
864
|
}
|
|
861
865
|
|
|
862
|
-
function postMoveBaseDirective (target, source,
|
|
866
|
+
function postMoveBaseDirective (target, source, isDelete = true) {
|
|
863
867
|
target.for = source.for
|
|
864
868
|
target.if = source.if
|
|
865
869
|
target.elseif = source.elseif
|
|
866
870
|
target.else = source.else
|
|
867
|
-
|
|
868
|
-
|
|
871
|
+
if (isReact(mode)) {
|
|
872
|
+
postProcessForReact(target)
|
|
873
|
+
postProcessIfReact(target)
|
|
874
|
+
} else if (runtimeCompile) {
|
|
869
875
|
postProcessForDynamic(target, config[mode])
|
|
870
876
|
postProcessIfDynamic(target, config[mode])
|
|
871
877
|
} else {
|
|
872
878
|
postProcessFor(target)
|
|
873
879
|
postProcessIf(target)
|
|
874
880
|
}
|
|
875
|
-
|
|
876
881
|
if (isDelete) {
|
|
877
882
|
delete source.for
|
|
878
883
|
delete source.if
|
|
@@ -1047,6 +1052,128 @@ function stringifyWithResolveComputed (modelValue) {
|
|
|
1047
1052
|
return result.join('+')
|
|
1048
1053
|
}
|
|
1049
1054
|
|
|
1055
|
+
function processStyleReact (el) {
|
|
1056
|
+
// process class/wx:class/style/wx:style/wx:show for react native
|
|
1057
|
+
const dynamicClass = getAndRemoveAttr(el, config[mode].directive.dynamicClass).val
|
|
1058
|
+
let staticClass = getAndRemoveAttr(el, 'class').val || ''
|
|
1059
|
+
staticClass = staticClass.replace(/\s+/g, ' ')
|
|
1060
|
+
|
|
1061
|
+
let staticHoverClass = ''
|
|
1062
|
+
if (hoverClassReg.test(el.tag)) {
|
|
1063
|
+
staticHoverClass = el.attrsMap['hover-class'] || ''
|
|
1064
|
+
staticHoverClass = staticHoverClass.replace(/\s+/g, ' ')
|
|
1065
|
+
}
|
|
1066
|
+
|
|
1067
|
+
const dynamicStyle = getAndRemoveAttr(el, config[mode].directive.dynamicStyle).val
|
|
1068
|
+
let staticStyle = getAndRemoveAttr(el, 'style').val || ''
|
|
1069
|
+
staticStyle = staticStyle.replace(/\s+/g, ' ')
|
|
1070
|
+
|
|
1071
|
+
const show = getAndRemoveAttr(el, config[mode].directive.show).val
|
|
1072
|
+
|
|
1073
|
+
if (dynamicClass || staticClass || dynamicStyle || staticStyle || show) {
|
|
1074
|
+
const staticClassExp = parseMustacheWithContext(staticClass).result
|
|
1075
|
+
const dynamicClassExp = parseMustacheWithContext(dynamicClass).result
|
|
1076
|
+
const staticStyleExp = parseMustacheWithContext(staticStyle).result
|
|
1077
|
+
const dynamicStyleExp = parseMustacheWithContext(dynamicStyle).result
|
|
1078
|
+
const showExp = parseMustacheWithContext(show).result
|
|
1079
|
+
|
|
1080
|
+
addAttrs(el, [{
|
|
1081
|
+
name: 'style',
|
|
1082
|
+
// runtime helper
|
|
1083
|
+
value: `{{this.__getStyle(${staticClassExp}, ${dynamicClassExp}, ${staticStyleExp}, ${dynamicStyleExp}, ${showExp})}}`
|
|
1084
|
+
}])
|
|
1085
|
+
}
|
|
1086
|
+
|
|
1087
|
+
if (staticHoverClass && staticHoverClass !== 'none') {
|
|
1088
|
+
const staticClassExp = parseMustacheWithContext(staticHoverClass).result
|
|
1089
|
+
addAttrs(el, [{
|
|
1090
|
+
name: 'hoverStyle',
|
|
1091
|
+
// runtime helper
|
|
1092
|
+
value: `{{this.__getStyle(${staticClassExp})}}`
|
|
1093
|
+
}])
|
|
1094
|
+
}
|
|
1095
|
+
}
|
|
1096
|
+
|
|
1097
|
+
function processEventReact (el, options, meta) {
|
|
1098
|
+
const eventConfigMap = {}
|
|
1099
|
+
el.attrsList.forEach(function ({ name, value }) {
|
|
1100
|
+
const parsedEvent = config[mode].event.parseEvent(name)
|
|
1101
|
+
if (parsedEvent) {
|
|
1102
|
+
const type = parsedEvent.eventName
|
|
1103
|
+
const parsedFunc = parseFuncStr(value)
|
|
1104
|
+
if (parsedFunc) {
|
|
1105
|
+
if (!eventConfigMap[type]) {
|
|
1106
|
+
eventConfigMap[type] = {
|
|
1107
|
+
configs: []
|
|
1108
|
+
}
|
|
1109
|
+
}
|
|
1110
|
+
eventConfigMap[type].configs.push(Object.assign({ name }, parsedFunc))
|
|
1111
|
+
}
|
|
1112
|
+
}
|
|
1113
|
+
})
|
|
1114
|
+
|
|
1115
|
+
let wrapper
|
|
1116
|
+
|
|
1117
|
+
for (const type in eventConfigMap) {
|
|
1118
|
+
let { configs } = eventConfigMap[type]
|
|
1119
|
+
|
|
1120
|
+
let resultName
|
|
1121
|
+
configs.forEach(({ name }) => {
|
|
1122
|
+
if (name) {
|
|
1123
|
+
// 清空原始事件绑定
|
|
1124
|
+
let has
|
|
1125
|
+
do {
|
|
1126
|
+
has = getAndRemoveAttr(el, name).has
|
|
1127
|
+
} while (has)
|
|
1128
|
+
|
|
1129
|
+
if (!resultName) {
|
|
1130
|
+
// 清除修饰符
|
|
1131
|
+
resultName = name.replace(/\..*/, '')
|
|
1132
|
+
}
|
|
1133
|
+
}
|
|
1134
|
+
})
|
|
1135
|
+
configs = configs.map((item) => {
|
|
1136
|
+
return item.expStr
|
|
1137
|
+
})
|
|
1138
|
+
const name = resultName || config[mode].event.getEvent(type)
|
|
1139
|
+
const value = `{{(e)=>this.__invoke(e, [${configs}])}}`
|
|
1140
|
+
addAttrs(el, [
|
|
1141
|
+
{
|
|
1142
|
+
name,
|
|
1143
|
+
value
|
|
1144
|
+
}
|
|
1145
|
+
])
|
|
1146
|
+
// 非button的情况下,press/longPress时间需要包裹TouchableWithoutFeedback进行响应,后续可支持配置
|
|
1147
|
+
// if ((type === 'press' || type === 'longPress') && el.tag !== 'mpx-button') {
|
|
1148
|
+
// if (!wrapper) {
|
|
1149
|
+
// wrapper = createASTElement('TouchableWithoutFeedback')
|
|
1150
|
+
// wrapper.isBuiltIn = true
|
|
1151
|
+
// processBuiltInComponents(wrapper, meta)
|
|
1152
|
+
// }
|
|
1153
|
+
// addAttrs(el, [
|
|
1154
|
+
// {
|
|
1155
|
+
// name,
|
|
1156
|
+
// value
|
|
1157
|
+
// }
|
|
1158
|
+
// ])
|
|
1159
|
+
// } else {
|
|
1160
|
+
// addAttrs(el, [
|
|
1161
|
+
// {
|
|
1162
|
+
// name,
|
|
1163
|
+
// value
|
|
1164
|
+
// }
|
|
1165
|
+
// ])
|
|
1166
|
+
// }
|
|
1167
|
+
}
|
|
1168
|
+
|
|
1169
|
+
if (wrapper) {
|
|
1170
|
+
replaceNode(el, wrapper, true)
|
|
1171
|
+
addChild(wrapper, el)
|
|
1172
|
+
processAttrs(wrapper, options)
|
|
1173
|
+
postMoveBaseDirective(wrapper, el)
|
|
1174
|
+
}
|
|
1175
|
+
}
|
|
1176
|
+
|
|
1050
1177
|
function processEvent (el, options) {
|
|
1051
1178
|
const eventConfigMap = {}
|
|
1052
1179
|
el.attrsList.forEach(function ({ name, value }) {
|
|
@@ -1057,7 +1184,7 @@ function processEvent (el, options) {
|
|
|
1057
1184
|
const modifiers = (parsedEvent.modifier || '').split('.')
|
|
1058
1185
|
const prefix = parsedEvent.prefix
|
|
1059
1186
|
// catch 场景下,下发的 eventconfig 里面包含特殊字符,用以运行时的判断
|
|
1060
|
-
const extraStr =
|
|
1187
|
+
const extraStr = runtimeCompile && prefix === 'catch' ? `, "__mpx_${prefix}"` : ''
|
|
1061
1188
|
const parsedFunc = parseFuncStr(value, extraStr)
|
|
1062
1189
|
if (parsedFunc) {
|
|
1063
1190
|
if (!eventConfigMap[type]) {
|
|
@@ -1178,6 +1305,14 @@ function processEvent (el, options) {
|
|
|
1178
1305
|
}
|
|
1179
1306
|
}
|
|
1180
1307
|
|
|
1308
|
+
function processSlotReact (el) {
|
|
1309
|
+
if (el.tag === 'slot') {
|
|
1310
|
+
el.slot = {
|
|
1311
|
+
name: getAndRemoveAttr(el, 'name').val
|
|
1312
|
+
}
|
|
1313
|
+
}
|
|
1314
|
+
}
|
|
1315
|
+
|
|
1181
1316
|
function wrapMustache (val) {
|
|
1182
1317
|
return val && !tagRE.test(val) ? `{{${val}}}` : val
|
|
1183
1318
|
}
|
|
@@ -1519,6 +1654,27 @@ function processFor (el) {
|
|
|
1519
1654
|
}
|
|
1520
1655
|
}
|
|
1521
1656
|
|
|
1657
|
+
function processRefReact (el, options, meta) {
|
|
1658
|
+
const val = getAndRemoveAttr(el, config[mode].directive.ref).val
|
|
1659
|
+
const type = isComponentNode(el, options) ? 'component' : 'node'
|
|
1660
|
+
if (val) {
|
|
1661
|
+
if (!meta.refs) {
|
|
1662
|
+
meta.refs = []
|
|
1663
|
+
}
|
|
1664
|
+
const all = !!forScopes.length
|
|
1665
|
+
meta.refs.push({
|
|
1666
|
+
key: val,
|
|
1667
|
+
all,
|
|
1668
|
+
type
|
|
1669
|
+
})
|
|
1670
|
+
|
|
1671
|
+
addAttrs(el, [{
|
|
1672
|
+
name: 'ref',
|
|
1673
|
+
value: `{{ this.__getRefVal('${val}') }}`
|
|
1674
|
+
}])
|
|
1675
|
+
}
|
|
1676
|
+
}
|
|
1677
|
+
|
|
1522
1678
|
function processRef (el, options, meta) {
|
|
1523
1679
|
const val = getAndRemoveAttr(el, config[mode].directive.ref).val
|
|
1524
1680
|
const type = isComponentNode(el, options) ? 'component' : 'node'
|
|
@@ -1659,6 +1815,19 @@ function postProcessFor (el) {
|
|
|
1659
1815
|
}
|
|
1660
1816
|
}
|
|
1661
1817
|
|
|
1818
|
+
function postProcessForReact (el) {
|
|
1819
|
+
if (el.for) {
|
|
1820
|
+
if (el.for.key) {
|
|
1821
|
+
addExp(el, `this.__getWxKey(${el.for.item || 'item'}, ${stringify(el.for.key)})`, false, 'key')
|
|
1822
|
+
addAttrs(el, [{
|
|
1823
|
+
name: 'key',
|
|
1824
|
+
value: el.for.key
|
|
1825
|
+
}])
|
|
1826
|
+
}
|
|
1827
|
+
popForScopes()
|
|
1828
|
+
}
|
|
1829
|
+
}
|
|
1830
|
+
|
|
1662
1831
|
function evalExp (exp) {
|
|
1663
1832
|
let result = { success: false }
|
|
1664
1833
|
try {
|
|
@@ -1735,7 +1904,35 @@ function postProcessIf (el) {
|
|
|
1735
1904
|
}
|
|
1736
1905
|
}
|
|
1737
1906
|
|
|
1738
|
-
function
|
|
1907
|
+
function addIfCondition (el, condition) {
|
|
1908
|
+
if (!el.ifConditions) {
|
|
1909
|
+
el.ifConditions = []
|
|
1910
|
+
}
|
|
1911
|
+
el.ifConditions.push(condition)
|
|
1912
|
+
}
|
|
1913
|
+
|
|
1914
|
+
function postProcessIfReact (el) {
|
|
1915
|
+
let prevNode
|
|
1916
|
+
if (el.if) {
|
|
1917
|
+
addIfCondition(el, {
|
|
1918
|
+
exp: el.if.exp,
|
|
1919
|
+
block: el
|
|
1920
|
+
})
|
|
1921
|
+
} else if (el.elseif || el.else) {
|
|
1922
|
+
prevNode = findPrevNode(el)
|
|
1923
|
+
if (prevNode && prevNode.if) {
|
|
1924
|
+
addIfCondition(prevNode, {
|
|
1925
|
+
exp: el.elseif && el.elseif.exp,
|
|
1926
|
+
block: el
|
|
1927
|
+
})
|
|
1928
|
+
removeNode(el, true)
|
|
1929
|
+
} else {
|
|
1930
|
+
warn$1(`wx:${el.elseif ? `elif="${el.elseif.raw}"` : 'else'} used on element [${el.tag}] without corresponding wx:if.`)
|
|
1931
|
+
}
|
|
1932
|
+
}
|
|
1933
|
+
}
|
|
1934
|
+
|
|
1935
|
+
function processText (el) {
|
|
1739
1936
|
if (el.type !== 3 || el.isComment) {
|
|
1740
1937
|
return
|
|
1741
1938
|
}
|
|
@@ -1744,6 +1941,19 @@ function processText (el, meta) {
|
|
|
1744
1941
|
addExp(el, parsed.result)
|
|
1745
1942
|
}
|
|
1746
1943
|
el.text = parsed.val
|
|
1944
|
+
if (isReact(mode)) {
|
|
1945
|
+
processWrapTextReact(el)
|
|
1946
|
+
}
|
|
1947
|
+
}
|
|
1948
|
+
|
|
1949
|
+
// RN中文字需被Text包裹
|
|
1950
|
+
function processWrapTextReact (el) {
|
|
1951
|
+
const parentTag = el.parent.tag
|
|
1952
|
+
if (parentTag !== 'mpx-text' && parentTag !== 'Text') {
|
|
1953
|
+
const wrapper = createASTElement('Text')
|
|
1954
|
+
replaceNode(el, wrapper, true)
|
|
1955
|
+
addChild(wrapper, el)
|
|
1956
|
+
}
|
|
1747
1957
|
}
|
|
1748
1958
|
|
|
1749
1959
|
// function injectComputed (el, meta, type, body) {
|
|
@@ -1759,13 +1969,11 @@ function processText (el, meta) {
|
|
|
1759
1969
|
// }])
|
|
1760
1970
|
// }
|
|
1761
1971
|
|
|
1762
|
-
function injectWxs (meta, module, src
|
|
1763
|
-
if (addWxsModule(meta, module, src)) {
|
|
1764
|
-
return
|
|
1765
|
-
}
|
|
1766
|
-
if (options && options.runtimeCompile) {
|
|
1972
|
+
function injectWxs (meta, module, src) {
|
|
1973
|
+
if (runtimeCompile || addWxsModule(meta, module, src)) {
|
|
1767
1974
|
return
|
|
1768
1975
|
}
|
|
1976
|
+
|
|
1769
1977
|
const wxsNode = createASTElement(config[mode].wxs.tag, [
|
|
1770
1978
|
{
|
|
1771
1979
|
name: config[mode].wxs.module,
|
|
@@ -1963,7 +2171,11 @@ function processBuiltInComponents (el, meta) {
|
|
|
1963
2171
|
}
|
|
1964
2172
|
const tag = el.tag
|
|
1965
2173
|
if (!meta.builtInComponentsMap[tag]) {
|
|
1966
|
-
|
|
2174
|
+
if (isReact(mode)) {
|
|
2175
|
+
meta.builtInComponentsMap[tag] = `${builtInComponentsPrefix}/react/${tag}`
|
|
2176
|
+
} else {
|
|
2177
|
+
meta.builtInComponentsMap[tag] = `${builtInComponentsPrefix}/${mode}/${tag}`
|
|
2178
|
+
}
|
|
1967
2179
|
}
|
|
1968
2180
|
}
|
|
1969
2181
|
}
|
|
@@ -2026,9 +2238,9 @@ function postProcessAliComponentRootView (el, options, meta) {
|
|
|
2026
2238
|
replaceNode(el, componentWrapView, true)
|
|
2027
2239
|
addChild(componentWrapView, el)
|
|
2028
2240
|
processAttrs(componentWrapView, options)
|
|
2029
|
-
postMoveBaseDirective(componentWrapView, el
|
|
2241
|
+
postMoveBaseDirective(componentWrapView, el)
|
|
2030
2242
|
|
|
2031
|
-
if (
|
|
2243
|
+
if (runtimeCompile) {
|
|
2032
2244
|
collectDynamicInfo(componentWrapView, options, meta)
|
|
2033
2245
|
postProcessAttrsDynamic(componentWrapView, config[mode])
|
|
2034
2246
|
}
|
|
@@ -2058,6 +2270,17 @@ function getVirtualHostRoot (options, meta) {
|
|
|
2058
2270
|
processElement(rootView, rootView, options, meta)
|
|
2059
2271
|
return rootView
|
|
2060
2272
|
}
|
|
2273
|
+
if (isReact(mode) && !hasVirtualHost) {
|
|
2274
|
+
const rootView = createASTElement('view', [
|
|
2275
|
+
{
|
|
2276
|
+
name: 'class',
|
|
2277
|
+
value: `${MPX_ROOT_VIEW} host-${moduleId}`
|
|
2278
|
+
}
|
|
2279
|
+
])
|
|
2280
|
+
rootView.isRoot = true
|
|
2281
|
+
processElement(rootView, rootView, options, meta)
|
|
2282
|
+
return rootView
|
|
2283
|
+
}
|
|
2061
2284
|
}
|
|
2062
2285
|
if (mode === 'web' && ctorType === 'page') {
|
|
2063
2286
|
return createASTElement('page')
|
|
@@ -2091,14 +2314,14 @@ function processShow (el, options, root) {
|
|
|
2091
2314
|
value: show
|
|
2092
2315
|
}])
|
|
2093
2316
|
} else {
|
|
2094
|
-
if (
|
|
2317
|
+
if (runtimeCompile) {
|
|
2095
2318
|
processShowStyleDynamic(el, show)
|
|
2096
2319
|
} else {
|
|
2097
2320
|
processShowStyle(el, show)
|
|
2098
2321
|
}
|
|
2099
2322
|
}
|
|
2100
2323
|
} else {
|
|
2101
|
-
if (
|
|
2324
|
+
if (runtimeCompile) {
|
|
2102
2325
|
processShowStyleDynamic(el, show)
|
|
2103
2326
|
} else {
|
|
2104
2327
|
processShowStyle(el, show)
|
|
@@ -2133,7 +2356,7 @@ function postProcessTemplate (el) {
|
|
|
2133
2356
|
}
|
|
2134
2357
|
}
|
|
2135
2358
|
|
|
2136
|
-
const isValidMode = makeMap('wx,ali,swan,tt,qq,web,qa,jd,dd,tenon,noMode')
|
|
2359
|
+
const isValidMode = makeMap('wx,ali,swan,tt,qq,web,qa,jd,dd,tenon,ios,android,noMode')
|
|
2137
2360
|
|
|
2138
2361
|
function isValidModeP (i) {
|
|
2139
2362
|
return isValidMode(i[0] === '_' ? i.slice(1) : i)
|
|
@@ -2241,7 +2464,7 @@ function processInjectWxs (el, meta, options) {
|
|
|
2241
2464
|
if (el.injectWxsProps && el.injectWxsProps.length) {
|
|
2242
2465
|
el.injectWxsProps.forEach((injectWxsProp) => {
|
|
2243
2466
|
const { injectWxsPath, injectWxsModuleName } = injectWxsProp
|
|
2244
|
-
injectWxs(meta, injectWxsModuleName, injectWxsPath
|
|
2467
|
+
injectWxs(meta, injectWxsModuleName, injectWxsPath)
|
|
2245
2468
|
})
|
|
2246
2469
|
}
|
|
2247
2470
|
}
|
|
@@ -2293,6 +2516,21 @@ function processElement (el, root, options, meta) {
|
|
|
2293
2516
|
return
|
|
2294
2517
|
}
|
|
2295
2518
|
|
|
2519
|
+
if (isReact(mode)) {
|
|
2520
|
+
// 收集内建组件
|
|
2521
|
+
processBuiltInComponents(el, meta)
|
|
2522
|
+
// 预处理代码维度条件编译
|
|
2523
|
+
processIf(el)
|
|
2524
|
+
processFor(el)
|
|
2525
|
+
processRefReact(el, options, meta)
|
|
2526
|
+
processStyleReact(el)
|
|
2527
|
+
processEventReact(el, options, meta)
|
|
2528
|
+
processComponentIs(el, options)
|
|
2529
|
+
processSlotReact(el)
|
|
2530
|
+
processAttrs(el, options)
|
|
2531
|
+
return
|
|
2532
|
+
}
|
|
2533
|
+
|
|
2296
2534
|
const pass = isNative || processTemplate(el) || processingTemplate
|
|
2297
2535
|
|
|
2298
2536
|
// 仅ali平台需要scoped模拟样式隔离
|
|
@@ -2307,7 +2545,7 @@ function processElement (el, root, options, meta) {
|
|
|
2307
2545
|
processIf(el)
|
|
2308
2546
|
processFor(el)
|
|
2309
2547
|
processRef(el, options, meta)
|
|
2310
|
-
if (
|
|
2548
|
+
if (runtimeCompile) {
|
|
2311
2549
|
processClassDynamic(el, meta)
|
|
2312
2550
|
processStyleDynamic(el, meta)
|
|
2313
2551
|
} else {
|
|
@@ -2334,16 +2572,21 @@ function closeElement (el, meta, options) {
|
|
|
2334
2572
|
postProcessIf(el)
|
|
2335
2573
|
return
|
|
2336
2574
|
}
|
|
2575
|
+
if (isReact(mode)) {
|
|
2576
|
+
postProcessForReact(el)
|
|
2577
|
+
postProcessIfReact(el)
|
|
2578
|
+
return
|
|
2579
|
+
}
|
|
2337
2580
|
const pass = isNative || postProcessTemplate(el) || processingTemplate
|
|
2338
2581
|
postProcessWxs(el, meta)
|
|
2339
2582
|
if (!pass) {
|
|
2340
2583
|
if (isComponentNode(el, options) && !hasVirtualHost && mode === 'ali') {
|
|
2341
2584
|
postProcessAliComponentRootView(el, options, meta)
|
|
2342
2585
|
}
|
|
2343
|
-
postProcessComponentIs(el
|
|
2586
|
+
postProcessComponentIs(el)
|
|
2344
2587
|
}
|
|
2345
2588
|
|
|
2346
|
-
if (
|
|
2589
|
+
if (runtimeCompile) {
|
|
2347
2590
|
postProcessForDynamic(el, config[mode])
|
|
2348
2591
|
postProcessIfDynamic(el, config[mode])
|
|
2349
2592
|
postProcessAttrsDynamic(el, config[mode])
|
|
@@ -2386,7 +2629,7 @@ function cloneAttrsList (attrsList) {
|
|
|
2386
2629
|
})
|
|
2387
2630
|
}
|
|
2388
2631
|
|
|
2389
|
-
function postProcessComponentIs (el
|
|
2632
|
+
function postProcessComponentIs (el) {
|
|
2390
2633
|
if (el.is && el.components) {
|
|
2391
2634
|
let tempNode
|
|
2392
2635
|
if (el.for || el.if || el.elseif || el.else) {
|
|
@@ -2395,7 +2638,7 @@ function postProcessComponentIs (el, options) {
|
|
|
2395
2638
|
tempNode = getTempNode()
|
|
2396
2639
|
}
|
|
2397
2640
|
replaceNode(el, tempNode, true)
|
|
2398
|
-
postMoveBaseDirective(tempNode, el
|
|
2641
|
+
postMoveBaseDirective(tempNode, el)
|
|
2399
2642
|
|
|
2400
2643
|
el.components.forEach(function (component) {
|
|
2401
2644
|
const newChild = createASTElement(component, cloneAttrsList(el.attrsList), tempNode)
|
|
@@ -2710,7 +2953,7 @@ function postProcessForDynamic (vnode) {
|
|
|
2710
2953
|
}
|
|
2711
2954
|
|
|
2712
2955
|
function postProcessAttrsDynamic (vnode, config) {
|
|
2713
|
-
const exps = vnode.exps
|
|
2956
|
+
const exps = (vnode.exps && vnode.exps.filter(v => v.attrName)) || []
|
|
2714
2957
|
const expsMap = Object.fromEntries(exps.map(v => ([v.attrName, v])))
|
|
2715
2958
|
const directives = Object.values(config.directive)
|
|
2716
2959
|
if (vnode.attrsList && vnode.attrsList.length) {
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
const isValidIdentifierStr = require('../utils/is-valid-identifier-str')
|
|
2
|
+
|
|
3
|
+
function genIf (node) {
|
|
4
|
+
node.ifProcessed = true
|
|
5
|
+
return genIfConditions(node.ifConditions.slice())
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
function genIfConditions (conditions) {
|
|
9
|
+
if (!conditions.length) return 'null'
|
|
10
|
+
const condition = conditions.shift()
|
|
11
|
+
if (condition.exp) {
|
|
12
|
+
return `(${condition.exp})?${genNode(condition.block)}:${genIfConditions(conditions)}`
|
|
13
|
+
} else {
|
|
14
|
+
return genNode(condition.block)
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function genFor (node) {
|
|
19
|
+
node.forProcessed = true
|
|
20
|
+
const index = node.for.index || 'index'
|
|
21
|
+
const item = node.for.item || 'item'
|
|
22
|
+
return `_i(${node.for.exp}, function(${item},${index}){return ${genNode(node)}})`
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const s = JSON.stringify
|
|
26
|
+
|
|
27
|
+
function mapAttrName (name) {
|
|
28
|
+
if (name === 'class') return 'className'
|
|
29
|
+
if (!isValidIdentifierStr(name)) return s(name)
|
|
30
|
+
return name
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function genNode (node) {
|
|
34
|
+
let exp = ''
|
|
35
|
+
if (node) {
|
|
36
|
+
if (node.type === 3) {
|
|
37
|
+
if (!node.isComment) {
|
|
38
|
+
if (node.exps) {
|
|
39
|
+
exp += `${node.exps[0].exp}`
|
|
40
|
+
} else {
|
|
41
|
+
exp += `${s(node.text)}`
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
if (node.type === 1) {
|
|
46
|
+
if (node.tag !== 'temp-node') {
|
|
47
|
+
if (node.for && !node.forProcessed) {
|
|
48
|
+
exp += genFor(node)
|
|
49
|
+
} else if (node.if && !node.ifProcessed) {
|
|
50
|
+
exp += genIf(node)
|
|
51
|
+
} else {
|
|
52
|
+
const attrExpMap = (node.exps || []).reduce((map, { exp, attrName }) => {
|
|
53
|
+
if (attrName) {
|
|
54
|
+
map[attrName] = exp
|
|
55
|
+
}
|
|
56
|
+
return map
|
|
57
|
+
}, {})
|
|
58
|
+
if (node.slot) {
|
|
59
|
+
const name = node.slot.name
|
|
60
|
+
exp += `__getSlot(${name ? s(name) : ''})`
|
|
61
|
+
} else {
|
|
62
|
+
exp += `createElement(${`getComponent(${node.is || s(node.tag)})`}`
|
|
63
|
+
if (node.isRoot) {
|
|
64
|
+
exp += `, Object.assign({}, rootProps, {style: [${attrExpMap.style}, rootProps.style]})`
|
|
65
|
+
} else if (node.attrsList.length) {
|
|
66
|
+
const attrs = []
|
|
67
|
+
node.attrsList && node.attrsList.forEach(({ name, value }) => {
|
|
68
|
+
const attrExp = attrExpMap[name] ? attrExpMap[name] : s(value)
|
|
69
|
+
attrs.push(`${mapAttrName(name)}: ${attrExp}`)
|
|
70
|
+
})
|
|
71
|
+
exp += `, { ${attrs.join(', ')} }`
|
|
72
|
+
} else {
|
|
73
|
+
exp += ', null'
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
if (!node.unary && node.children.length) {
|
|
77
|
+
exp += ','
|
|
78
|
+
node.children.forEach(function (child, index) {
|
|
79
|
+
exp += `${index === 0 ? '' : ','}${genNode(child)}`
|
|
80
|
+
})
|
|
81
|
+
}
|
|
82
|
+
exp += ')'
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
} else {
|
|
86
|
+
node.children.forEach(function (child, index) {
|
|
87
|
+
exp += `${index === 0 ? '' : ','}${genNode(child)}`
|
|
88
|
+
})
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return exp
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
module.exports = genNode
|