@mpxjs/webpack-plugin 2.10.7-beta.9 → 2.10.8-beta.1

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.
Files changed (46) hide show
  1. package/lib/dependencies/RequireExternalDependency.js +61 -0
  2. package/lib/file-loader.js +3 -2
  3. package/lib/index.js +60 -15
  4. package/lib/json-compiler/index.js +1 -0
  5. package/lib/parser.js +1 -1
  6. package/lib/platform/json/wx/index.js +43 -25
  7. package/lib/platform/template/wx/component-config/fix-component-name.js +2 -2
  8. package/lib/platform/template/wx/component-config/index.js +2 -0
  9. package/lib/platform/template/wx/component-config/movable-view.js +10 -1
  10. package/lib/platform/template/wx/component-config/page-container.js +19 -0
  11. package/lib/platform/template/wx/component-config/unsupported.js +1 -1
  12. package/lib/platform/template/wx/index.js +2 -1
  13. package/lib/react/LoadAsyncChunkModule.js +74 -0
  14. package/lib/react/index.js +3 -1
  15. package/lib/react/processJSON.js +74 -13
  16. package/lib/react/processScript.js +6 -6
  17. package/lib/react/script-helper.js +100 -41
  18. package/lib/runtime/components/react/context.ts +2 -12
  19. package/lib/runtime/components/react/dist/context.js +1 -1
  20. package/lib/runtime/components/react/dist/getInnerListeners.js +1 -1
  21. package/lib/runtime/components/react/dist/mpx-async-suspense.jsx +135 -0
  22. package/lib/runtime/components/react/dist/mpx-movable-area.jsx +9 -63
  23. package/lib/runtime/components/react/dist/mpx-movable-view.jsx +58 -301
  24. package/lib/runtime/components/react/dist/mpx-page-container.jsx +255 -0
  25. package/lib/runtime/components/react/dist/mpx-swiper.jsx +30 -55
  26. package/lib/runtime/components/react/dist/mpx-web-view.jsx +14 -28
  27. package/lib/runtime/components/react/dist/useAnimationHooks.js +2 -87
  28. package/lib/runtime/components/react/getInnerListeners.ts +1 -1
  29. package/lib/runtime/components/react/mpx-async-suspense.tsx +180 -0
  30. package/lib/runtime/components/react/mpx-movable-area.tsx +11 -98
  31. package/lib/runtime/components/react/mpx-movable-view.tsx +60 -350
  32. package/lib/runtime/components/react/mpx-page-container.tsx +394 -0
  33. package/lib/runtime/components/react/mpx-swiper.tsx +29 -55
  34. package/lib/runtime/components/react/mpx-web-view.tsx +13 -33
  35. package/lib/runtime/components/react/types/global.d.ts +15 -0
  36. package/lib/runtime/components/react/useAnimationHooks.ts +2 -85
  37. package/lib/runtime/optionProcessorReact.d.ts +18 -0
  38. package/lib/runtime/optionProcessorReact.js +30 -0
  39. package/lib/script-setup-compiler/index.js +27 -5
  40. package/lib/template-compiler/compiler.js +27 -6
  41. package/lib/utils/dom-tag-config.js +18 -4
  42. package/lib/utils/trans-async-sub-rules.js +19 -0
  43. package/lib/web/script-helper.js +1 -1
  44. package/package.json +3 -3
  45. package/lib/runtime/components/react/AsyncContainer.tsx +0 -189
  46. package/lib/runtime/components/react/dist/AsyncContainer.jsx +0 -141
@@ -0,0 +1,180 @@
1
+ import { useState, ComponentType, useEffect, useCallback, useRef, ReactNode, createElement } from 'react'
2
+ import { View, Image, StyleSheet, Text, TouchableOpacity } from 'react-native'
3
+ import FastImage from '@d11/react-native-fast-image'
4
+
5
+ const asyncChunkMap = new Map()
6
+
7
+ const styles = StyleSheet.create({
8
+ container: {
9
+ flex: 1,
10
+ padding: 20,
11
+ backgroundColor: '#fff'
12
+ },
13
+ loadingImage: {
14
+ width: 100,
15
+ height: 100,
16
+ marginTop: 220,
17
+ alignSelf: 'center'
18
+ },
19
+ buttonText: {
20
+ color: '#fff',
21
+ fontSize: 16,
22
+ fontWeight: '500',
23
+ textAlign: 'center'
24
+ },
25
+ errorImage: {
26
+ marginTop: 80,
27
+ width: 220,
28
+ aspectRatio: 1,
29
+ alignSelf: 'center'
30
+ },
31
+ errorText: {
32
+ fontSize: 16,
33
+ textAlign: 'center',
34
+ color: '#333',
35
+ marginBottom: 20
36
+ },
37
+ retryButton: {
38
+ position: 'absolute',
39
+ bottom: 54,
40
+ left: 20,
41
+ right: 20,
42
+ backgroundColor: '#fff',
43
+ paddingVertical: 15,
44
+ borderRadius: 30,
45
+ marginTop: 40,
46
+ borderWidth: 1,
47
+ borderColor: '#FF5F00'
48
+ },
49
+ retryButtonText: {
50
+ color: '#FF5F00',
51
+ fontSize: 16,
52
+ fontWeight: '500',
53
+ textAlign: 'center'
54
+ }
55
+ })
56
+
57
+ interface DefaultFallbackProps {
58
+ onReload: () => void
59
+ }
60
+
61
+ const DefaultFallback = ({ onReload }: DefaultFallbackProps) => {
62
+ return (
63
+ <View style={styles.container}>
64
+ <Image
65
+ source={{
66
+ uri: 'https://dpubstatic.udache.com/static/dpubimg/Vak5mZvezPpKV5ZJI6P9b_drn-fallbak.png'
67
+ }}
68
+ style={styles.errorImage}
69
+ resizeMode="contain"
70
+ />
71
+ <Text style={styles.errorText}>网络出了点问题,请查看网络环境</Text>
72
+ <TouchableOpacity
73
+ style={styles.retryButton}
74
+ onPress={onReload}
75
+ activeOpacity={0.7}
76
+ >
77
+ <Text style={styles.retryButtonText}>点击重试</Text>
78
+ </TouchableOpacity>
79
+ </View>
80
+ )
81
+ }
82
+
83
+ const DefaultLoading = () => {
84
+ return (
85
+ <View style={styles.container}>
86
+ <FastImage
87
+ style={styles.loadingImage}
88
+ source={{
89
+ uri: 'https://dpubstatic.udache.com/static/dpubimg/439jiCVOtNOnEv9F2LaDs_loading.gif'
90
+ }}
91
+ resizeMode={FastImage.resizeMode.contain}
92
+ ></FastImage>
93
+ </View>
94
+ )
95
+ }
96
+
97
+ interface AsyncSuspenseProps {
98
+ type: 'component' | 'page'
99
+ chunkName: string
100
+ moduleId: string
101
+ innerProps: any,
102
+ loading?: ComponentType<unknown>
103
+ fallback?: ComponentType<unknown>
104
+ getChildren: () => Promise<ReactNode>
105
+ }
106
+
107
+ type ComponentStauts = 'pending' | 'error' | 'loaded'
108
+
109
+ const AsyncSuspense: React.FC<AsyncSuspenseProps> = ({
110
+ type,
111
+ innerProps,
112
+ chunkName,
113
+ moduleId,
114
+ loading,
115
+ fallback,
116
+ getChildren
117
+ }) => {
118
+ const [status, setStatus] = useState<ComponentStauts>('pending')
119
+ const chunkLoaded = asyncChunkMap.has(moduleId)
120
+ const loadChunkPromise = useRef<null | Promise<ReactNode>>(null)
121
+
122
+ const reloadPage = useCallback(() => {
123
+ setStatus('pending')
124
+ }, [])
125
+
126
+ useEffect(() => {
127
+ let cancelled = false
128
+ if (!chunkLoaded && status === 'pending') {
129
+ if (loadChunkPromise.current) {
130
+ loadChunkPromise
131
+ .current.then((res: ReactNode) => {
132
+ if (cancelled) return
133
+ asyncChunkMap.set(moduleId, res)
134
+ setStatus('loaded')
135
+ })
136
+ .catch((e) => {
137
+ if (cancelled) return
138
+ if (type === 'component') {
139
+ global.onLazyLoadError({
140
+ type: 'subpackage',
141
+ subpackage: [chunkName],
142
+ errMsg: `loadSubpackage: ${e.type}`
143
+ })
144
+ }
145
+ loadChunkPromise.current = null
146
+ setStatus('error')
147
+ })
148
+ }
149
+ }
150
+
151
+ return () => {
152
+ cancelled = true
153
+ }
154
+ }, [status])
155
+
156
+ if (chunkLoaded) {
157
+ const Comp = asyncChunkMap.get(moduleId)
158
+ return createElement(Comp, innerProps)
159
+ } else if (status === 'error') {
160
+ if (type === 'page') {
161
+ fallback = fallback || DefaultFallback
162
+ return createElement(fallback as ComponentType<DefaultFallbackProps>, { onReload: reloadPage })
163
+ } else {
164
+ return fallback ? createElement(fallback, innerProps) : null
165
+ }
166
+ } else {
167
+ if (!loadChunkPromise.current) {
168
+ loadChunkPromise.current = getChildren()
169
+ }
170
+ if (type === 'page') {
171
+ return createElement(loading || DefaultLoading)
172
+ } else {
173
+ return fallback ? createElement(fallback, innerProps) : null
174
+ }
175
+ }
176
+ }
177
+
178
+ AsyncSuspense.displayName = 'MpxAsyncSuspense'
179
+
180
+ export default AsyncSuspense
@@ -1,14 +1,12 @@
1
1
  /**
2
- * scale-area
2
+ * scale-area
3
3
  */
4
4
 
5
5
  import { View } from 'react-native'
6
- import { JSX, forwardRef, ReactNode, useRef, useMemo, useCallback, createElement } from 'react'
7
- import { GestureDetector, Gesture } from 'react-native-gesture-handler'
8
- import { useSharedValue } from 'react-native-reanimated'
6
+ import { JSX, forwardRef, ReactNode, useRef, useMemo, createElement } from 'react'
9
7
  import useNodesRef, { HandlerRef } from './useNodesRef'
10
8
  import useInnerProps from './getInnerListeners'
11
- import { MovableAreaContext, MovableAreaContextValue } from './context'
9
+ import { MovableAreaContext } from './context'
12
10
  import { useTransformStyle, wrapChildren, useLayout, extendObject } from './utils'
13
11
  import Portal from './mpx-portal'
14
12
 
@@ -17,7 +15,6 @@ interface MovableAreaProps {
17
15
  children: ReactNode
18
16
  width?: number
19
17
  height?: number
20
- 'scale-area'?: boolean
21
18
  'enable-offset'?: boolean
22
19
  'enable-var'?: boolean
23
20
  'external-var-context'?: Record<string, any>
@@ -26,21 +23,8 @@ interface MovableAreaProps {
26
23
  'parent-height'?: number
27
24
  }
28
25
 
29
- interface MovableViewCallbacks {
30
- onScale: (scaleInfo: {scale: number}) => void
31
- onScaleEnd?: () => void
32
- }
33
-
34
26
  const _MovableArea = forwardRef<HandlerRef<View, MovableAreaProps>, MovableAreaProps>((props: MovableAreaProps, ref): JSX.Element => {
35
- const {
36
- style = {},
37
- 'scale-area': scaleArea = false,
38
- 'enable-var': enableVar,
39
- 'external-var-context': externalVarContext,
40
- 'parent-font-size': parentFontSize,
41
- 'parent-width': parentWidth,
42
- 'parent-height': parentHeight
43
- } = props
27
+ const { style = {}, 'enable-var': enableVar, 'external-var-context': externalVarContext, 'parent-font-size': parentFontSize, 'parent-width': parentWidth, 'parent-height': parentHeight } = props
44
28
 
45
29
  const {
46
30
  hasSelfPercent,
@@ -52,67 +36,17 @@ const _MovableArea = forwardRef<HandlerRef<View, MovableAreaProps>, MovableAreaP
52
36
  setHeight
53
37
  } = useTransformStyle(style, { enableVar, externalVarContext, parentFontSize, parentWidth, parentHeight })
54
38
 
55
- const movableAreaRef = useRef(null)
56
- const movableViewsValue = useSharedValue<Record<string, MovableViewCallbacks>>({})
57
- useNodesRef(props, ref, movableAreaRef, {
39
+ const movableViewRef = useRef(null)
40
+ useNodesRef(props, ref, movableViewRef, {
58
41
  style: normalStyle
59
42
  })
60
43
 
61
- // 注册/注销 MovableView 的回调
62
- const registerMovableView = useCallback((id: string, callbacks: { onScale?: (scaleInfo: { scale: number }) => void; onScaleEnd?: () => void }) => {
63
- movableViewsValue.value = extendObject(movableViewsValue.value, { [id]: callbacks })
64
- }, [])
65
-
66
- const unregisterMovableView = useCallback((id: string) => {
67
- delete movableViewsValue.value[id]
68
- }, [])
69
-
70
- // 处理区域缩放手势
71
- const handleAreaScale = useCallback((scaleInfo: { scale: number }) => {
72
- 'worklet'
73
- if (scaleArea) {
74
- // 将缩放信息广播给所有注册的 MovableView
75
- Object.values(movableViewsValue.value).forEach((callbacks) => {
76
- callbacks.onScale && callbacks.onScale(scaleInfo)
77
- })
78
- }
79
- }, [scaleArea])
80
-
81
- // 处理区域缩放结束
82
- const handleAreaScaleEnd = useCallback(() => {
83
- 'worklet'
84
- if (scaleArea) {
85
- // 通知所有注册的 MovableView 缩放结束
86
- Object.values(movableViewsValue.value).forEach((callbacks) => {
87
- callbacks.onScaleEnd && callbacks.onScaleEnd()
88
- })
89
- }
90
- }, [scaleArea])
91
-
92
- const contextValue: MovableAreaContextValue = useMemo(() => ({
44
+ const contextValue = useMemo(() => ({
93
45
  height: normalStyle.height || 10,
94
- width: normalStyle.width || 10,
95
- scaleArea,
96
- registerMovableView,
97
- unregisterMovableView
98
- }), [normalStyle.width, normalStyle.height, scaleArea])
46
+ width: normalStyle.width || 10
47
+ }), [normalStyle.width, normalStyle.height])
99
48
 
100
- const { layoutRef, layoutStyle, layoutProps } = useLayout({ props, hasSelfPercent, setWidth, setHeight, nodeRef: movableAreaRef })
101
-
102
- // 创建缩放手势
103
- const scaleGesture = useMemo(() => {
104
- if (!scaleArea) return null
105
-
106
- return Gesture.Pinch()
107
- .onUpdate((e) => {
108
- 'worklet'
109
- handleAreaScale(e)
110
- })
111
- .onEnd(() => {
112
- 'worklet'
113
- handleAreaScaleEnd()
114
- })
115
- }, [scaleArea])
49
+ const { layoutRef, layoutStyle, layoutProps } = useLayout({ props, hasSelfPercent, setWidth, setHeight, nodeRef: movableViewRef })
116
50
 
117
51
  const innerProps = useInnerProps(
118
52
  extendObject(
@@ -121,7 +55,7 @@ const _MovableArea = forwardRef<HandlerRef<View, MovableAreaProps>, MovableAreaP
121
55
  layoutProps,
122
56
  {
123
57
  style: extendObject({ height: contextValue.height, width: contextValue.width }, normalStyle, layoutStyle),
124
- ref: movableAreaRef
58
+ ref: movableViewRef
125
59
  }
126
60
  ),
127
61
  [],
@@ -139,30 +73,9 @@ const _MovableArea = forwardRef<HandlerRef<View, MovableAreaProps>, MovableAreaP
139
73
  }
140
74
  )
141
75
  ))
142
-
143
- // 如果启用了 scale-area,包装一个 GestureDetector
144
- if (scaleArea && scaleGesture) {
145
- movableComponent = createElement(MovableAreaContext.Provider, { value: contextValue }, createElement(
146
- GestureDetector,
147
- { gesture: scaleGesture },
148
- createElement(
149
- View,
150
- innerProps,
151
- wrapChildren(
152
- props,
153
- {
154
- hasVarDec,
155
- varContext: varContextRef.current
156
- }
157
- )
158
- )
159
- ))
160
- }
161
-
162
76
  if (hasPositionFixed) {
163
77
  movableComponent = createElement(Portal, null, movableComponent)
164
78
  }
165
-
166
79
  return movableComponent
167
80
  })
168
81