@mpxjs/webpack-plugin 2.9.0-beta.1 → 2.9.0-beta.2

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/index.js CHANGED
@@ -166,6 +166,7 @@ class MpxWebpackPlugin {
166
166
  }, options.nativeConfig)
167
167
  options.webConfig = options.webConfig || {}
168
168
  options.partialCompile = options.mode !== 'web' && options.partialCompile
169
+ options.asyncSubpackageRules = options.asyncSubpackageRules || null
169
170
  options.retryRequireAsync = options.retryRequireAsync || false
170
171
  options.enableAliRequireAsync = options.enableAliRequireAsync || false
171
172
  this.options = options
@@ -633,6 +634,7 @@ class MpxWebpackPlugin {
633
634
  filename
634
635
  })
635
636
  },
637
+ asyncSubpackageRules: this.options.asyncSubpackageRules,
636
638
  pathHash: (resourcePath) => {
637
639
  if (this.options.pathHashMode === 'relative' && this.options.projectRoot) {
638
640
  return hash(path.relative(this.options.projectRoot, resourcePath))
@@ -1042,13 +1044,22 @@ class MpxWebpackPlugin {
1042
1044
  let request = expr.arguments[0].value
1043
1045
  const range = expr.arguments[0].range
1044
1046
  const context = parser.state.module.context
1045
- const { queryObj } = parseRequest(request)
1046
- if (queryObj.root) {
1047
+ const { queryObj, resourcePath } = parseRequest(request)
1048
+ let tarRoot = queryObj.root
1049
+ if (!tarRoot && mpx.asyncSubpackageRules) {
1050
+ for (const item of mpx.asyncSubpackageRules) {
1051
+ if (matchCondition(resourcePath, item)) {
1052
+ tarRoot = item.root
1053
+ break
1054
+ }
1055
+ }
1056
+ }
1057
+ if (tarRoot) {
1047
1058
  // 删除root query
1048
- request = addQuery(request, {}, false, ['root'])
1059
+ if (queryObj.root) request = addQuery(request, {}, false, ['root'])
1049
1060
  // 目前仅wx和ali支持require.async,ali需要开启enableAliRequireAsync,其余平台使用CommonJsAsyncDependency进行模拟抹平
1050
1061
  if (mpx.enableRequireAsync) {
1051
- const dep = new DynamicEntryDependency(request, 'export', '', queryObj.root, '', context, range, {
1062
+ const dep = new DynamicEntryDependency(request, 'export', '', tarRoot, '', context, range, {
1052
1063
  isRequireAsync: true,
1053
1064
  retryRequireAsync: !!this.options.retryRequireAsync
1054
1065
  })
@@ -6,6 +6,7 @@ const parseRequest = require('../utils/parse-request')
6
6
  const addQuery = require('../utils/add-query')
7
7
  const loaderUtils = require('loader-utils')
8
8
  const resolve = require('../utils/resolve')
9
+ const { matchCondition } = require('../utils/match-condition')
9
10
 
10
11
  module.exports = function createJSONHelper ({ loaderContext, emitWarning, customGetDynamicEntry }) {
11
12
  const mpx = loaderContext.getMpx()
@@ -17,6 +18,7 @@ module.exports = function createJSONHelper ({ loaderContext, emitWarning, custom
17
18
  const getOutputPath = mpx.getOutputPath
18
19
  const mode = mpx.mode
19
20
  const enableRequireAsync = mpx.enableRequireAsync
21
+ const asyncSubpackageRules = mpx.asyncSubpackageRules
20
22
 
21
23
  const isUrlRequest = r => isUrlRequestRaw(r, root, externals)
22
24
  const urlToRequest = r => loaderUtils.urlToRequest(r)
@@ -45,17 +47,27 @@ module.exports = function createJSONHelper ({ loaderContext, emitWarning, custom
45
47
  if (resolveMode === 'native') {
46
48
  component = urlToRequest(component)
47
49
  }
48
-
49
50
  resolve(context, component, loaderContext, (err, resource, info) => {
50
51
  if (err) return callback(err)
51
52
  const { resourcePath, queryObj } = parseRequest(resource)
52
-
53
+ let placeholder = null
53
54
  if (queryObj.root) {
54
55
  // 删除root query
55
56
  resource = addQuery(resource, {}, false, ['root'])
56
57
  // 目前只有微信支持分包异步化
57
- if (enableRequireAsync) tarRoot = queryObj.root
58
+ if (enableRequireAsync) {
59
+ tarRoot = queryObj.root
60
+ }
61
+ } else if (!queryObj.root && asyncSubpackageRules && enableRequireAsync) {
62
+ for (const item of asyncSubpackageRules) {
63
+ if (matchCondition(resourcePath, item)) {
64
+ tarRoot = item.root
65
+ placeholder = item.placeholder
66
+ break
67
+ }
68
+ }
58
69
  }
70
+
59
71
  const parsed = path.parse(resourcePath)
60
72
  const ext = parsed.ext
61
73
  const resourceName = path.join(parsed.dir, parsed.name)
@@ -84,7 +96,7 @@ module.exports = function createJSONHelper ({ loaderContext, emitWarning, custom
84
96
  }
85
97
 
86
98
  const entry = getDynamicEntry(resource, 'component', outputPath, tarRoot, relativePath)
87
- callback(null, entry)
99
+ callback(null, entry, tarRoot, placeholder)
88
100
  })
89
101
  }
90
102
 
@@ -38,6 +38,7 @@ module.exports = function (content) {
38
38
  const globalSrcMode = mpx.srcMode
39
39
  const localSrcMode = queryObj.mode
40
40
  const srcMode = localSrcMode || globalSrcMode
41
+ const projectRoot = mpx.projectRoot
41
42
 
42
43
  const isApp = !(pagesMap[resourcePath] || componentsMap[resourcePath])
43
44
  const publicPath = this._compilation.outputOptions.publicPath || ''
@@ -55,6 +56,25 @@ module.exports = function (content) {
55
56
  )
56
57
  }
57
58
 
59
+ const fillInComponentPlaceholder = (name, placeholder, placeholderEntry) => {
60
+ const componentPlaceholder = json.componentPlaceholder || {}
61
+ if (componentPlaceholder[name]) return
62
+ componentPlaceholder[name] = placeholder
63
+ json.componentPlaceholder = componentPlaceholder
64
+ if (placeholderEntry && !json.usingComponents[placeholder]) json.usingComponents[placeholder] = placeholderEntry
65
+ }
66
+ const normalizePlaceholder = (placeholder) => {
67
+ if (typeof placeholder === 'string') {
68
+ placeholder = {
69
+ name: placeholder
70
+ }
71
+ }
72
+ if (!placeholder.name) {
73
+ emitError('The asyncSubpackageRules configuration format of @mpxjs/webpack-plugin a is incorrect')
74
+ }
75
+ return placeholder
76
+ }
77
+
58
78
  const {
59
79
  isUrlRequest,
60
80
  urlToRequest,
@@ -142,22 +162,6 @@ module.exports = function (content) {
142
162
  }
143
163
  }
144
164
 
145
- // 校验异步组件占位符 componentPlaceholder 不为空
146
- if (mpx.enableRequireAsync) {
147
- const { usingComponents, componentPlaceholder = {} } = json
148
- if (usingComponents) {
149
- for (const compName in usingComponents) {
150
- const compPath = usingComponents[compName]
151
- if (!/\?root=/g.test(compPath)) continue
152
- const compPlaceholder = componentPlaceholder[compName]
153
- if (!compPlaceholder) {
154
- const errMsg = `componentPlaceholder of "${compName}" doesn't exist! \n\r`
155
- emitError(errMsg)
156
- }
157
- }
158
- }
159
- }
160
-
161
165
  // 快应用补全json配置,必填项
162
166
  if (mode === 'qa' && isApp) {
163
167
  const defaultConf = {
@@ -204,14 +208,36 @@ module.exports = function (content) {
204
208
  const processComponents = (components, context, callback) => {
205
209
  if (components) {
206
210
  async.eachOf(components, (component, name, callback) => {
207
- processComponent(component, context, { relativePath }, (err, entry) => {
211
+ processComponent(component, context, { relativePath }, (err, entry, root, placeholder) => {
208
212
  if (err === RESOLVE_IGNORED_ERR) {
209
213
  delete components[name]
210
214
  return callback()
211
215
  }
212
216
  if (err) return callback(err)
213
217
  components[name] = entry
214
- callback()
218
+ if (root) {
219
+ if (placeholder) {
220
+ placeholder = normalizePlaceholder(placeholder)
221
+ if (placeholder.resource) {
222
+ processComponent(placeholder.resource, projectRoot, { relativePath }, (err, entry) => {
223
+ if (err) return callback(err)
224
+ fillInComponentPlaceholder(name, placeholder.name, entry)
225
+ callback()
226
+ })
227
+ } else {
228
+ fillInComponentPlaceholder(name, placeholder.name)
229
+ callback()
230
+ }
231
+ } else {
232
+ if (!json.componentPlaceholder || !json.componentPlaceholder[name]) {
233
+ const errMsg = `componentPlaceholder of "${name}" doesn't exist! \n\r`
234
+ emitError(errMsg)
235
+ }
236
+ callback()
237
+ }
238
+ } else {
239
+ callback()
240
+ }
215
241
  })
216
242
  }, callback)
217
243
  } else {
@@ -120,8 +120,3 @@ html, body, .app {
120
120
  font-family "weui"
121
121
  src url('data:application/octet-stream;base64,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') format('truetype')
122
122
  }
123
-
124
- .mpx-root-view {
125
- display: inline
126
- line-height: normal
127
- }
@@ -113,7 +113,7 @@
113
113
  },
114
114
  watch: {
115
115
  scrollIntoView (val) {
116
- this.bs && this.bs.scrollToElement('#' + val, this.scrollWithAnimation ? 200 : 0)
116
+ this.scrollToView(val, this.scrollWithAnimation ? 200 : 0)
117
117
  },
118
118
  _scrollTop (val) {
119
119
  this.bs && this.bs.scrollTo(this.bs.x, -val, this.scrollWithAnimation ? 200 : 0)
@@ -201,9 +201,7 @@
201
201
  leading: true,
202
202
  trailing: false
203
203
  }))
204
- if (this.scrollIntoView) {
205
- this.bs.scrollToElement('#' + this.scrollIntoView)
206
- }
204
+ if (this.scrollIntoView) this.scrollToView(this.scrollIntoView)
207
205
  // 若开启自定义下拉刷新 或 开启 scroll-view 增强特性
208
206
  if (this.refresherEnabled || this.enhanced) {
209
207
  const actionsHandlerHooks = this.bs.scroller.actionsHandler.hooks
@@ -258,6 +256,12 @@
258
256
  }
259
257
  }
260
258
  },
259
+ scrollToView (id, duration = 0) {
260
+ if (!id) return
261
+ id = '#' + id
262
+ if (!document.querySelector(id)) return // 不存在元素时阻断,直接调用better-scroll的方法会报错
263
+ this.bs?.scrollToElement(id, duration)
264
+ },
261
265
  initLayerComputed () {
262
266
  const wrapper = this.$refs.wrapper
263
267
  const wrapperWidth = wrapper.offsetWidth
@@ -3,7 +3,19 @@ import { isBrowser } from './env'
3
3
  import transRpxStyle from './transRpxStyle'
4
4
  import animation from './animation'
5
5
 
6
- export default function processComponentOption ({ option, ctorType, outputPath, pageConfig, componentsMap, componentGenerics, genericsInfo, mixin, hasApp }) {
6
+ export default function processComponentOption (
7
+ {
8
+ option,
9
+ ctorType,
10
+ outputPath,
11
+ pageConfig,
12
+ componentsMap,
13
+ componentGenerics,
14
+ genericsInfo,
15
+ mixin,
16
+ hasApp
17
+ }
18
+ ) {
7
19
  // 局部注册页面和组件中依赖的组件
8
20
  for (const componentName in componentsMap) {
9
21
  if (hasOwn(componentsMap, componentName)) {
@@ -128,6 +140,7 @@ function createApp ({ componentsMap, Vue, pagesMap, firstPage, VueRouter, App, t
128
140
  global.__mpxRouter.stack = []
129
141
  global.__mpxRouter.needCache = null
130
142
  global.__mpxRouter.needRemove = []
143
+ global.__mpxRouter.eventChannelMap = {}
131
144
  // 处理reLaunch中传递的url并非首页时的replace逻辑
132
145
  global.__mpxRouter.beforeEach(function (to, from, next) {
133
146
  let action = global.__mpxRouter.__mpxAction
@@ -166,24 +179,15 @@ function createApp ({ componentsMap, Vue, pagesMap, firstPage, VueRouter, App, t
166
179
  })
167
180
  }
168
181
  } else {
169
- let methods = ''
170
- switch (action.type) {
171
- case 'to':
172
- methods = 'navigateTo'
173
- break
174
- case 'redirect':
175
- methods = 'redirectTo'
176
- break
177
- case 'back':
178
- methods = 'navigateBack'
179
- break
180
- case 'reLaunch':
181
- methods = 'reLaunch'
182
- break
183
- default:
184
- methods = 'navigateTo'
182
+ const typeMethodMap = {
183
+ to: 'navigateTo',
184
+ redirect: 'redirectTo',
185
+ back: 'navigateBack',
186
+ switch: 'switchTab',
187
+ reLaunch: 'reLaunch'
185
188
  }
186
- throw new Error(`${methods}:fail page "${to.path}" is not found`)
189
+ const method = typeMethodMap[action.type]
190
+ throw new Error(`${method}:fail page "${to.path}" is not found`)
187
191
  }
188
192
  }
189
193
 
@@ -195,6 +199,7 @@ function createApp ({ componentsMap, Vue, pagesMap, firstPage, VueRouter, App, t
195
199
  case 'to':
196
200
  stack.push(insertItem)
197
201
  global.__mpxRouter.needCache = insertItem
202
+ if (action.eventChannel) global.__mpxRouter.eventChannelMap[to.path.slice(1)] = action.eventChannel
198
203
  break
199
204
  case 'back':
200
205
  global.__mpxRouter.needRemove = stack.splice(stack.length - action.delta, action.delta)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mpxjs/webpack-plugin",
3
- "version": "2.9.0-beta.1",
3
+ "version": "2.9.0-beta.2",
4
4
  "description": "mpx compile core",
5
5
  "keywords": [
6
6
  "mpx"
@@ -82,5 +82,5 @@
82
82
  "engines": {
83
83
  "node": ">=14.14.0"
84
84
  },
85
- "gitHead": "5e4b44c9b8132e9192cfd119f63196ecc6c4486c"
85
+ "gitHead": "2d61bab77c50eccb7470b9b9bd644e7bd6510467"
86
86
  }