@mpxjs/webpack-plugin 2.8.41 → 2.8.43

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
@@ -167,6 +167,7 @@ class MpxWebpackPlugin {
167
167
  }, options.nativeConfig)
168
168
  options.webConfig = options.webConfig || {}
169
169
  options.partialCompile = options.mode !== 'web' && options.partialCompile
170
+ options.asyncSubpackageRules = options.asyncSubpackageRules || null
170
171
  options.retryRequireAsync = options.retryRequireAsync || false
171
172
  options.enableAliRequireAsync = options.enableAliRequireAsync || false
172
173
  this.options = options
@@ -622,6 +623,7 @@ class MpxWebpackPlugin {
622
623
  forceProxyEventRules: this.options.forceProxyEventRules,
623
624
  enableRequireAsync: this.options.mode === 'wx' || (this.options.mode === 'ali' && this.options.enableAliRequireAsync),
624
625
  partialCompile: this.options.partialCompile,
626
+ asyncSubpackageRules: this.options.asyncSubpackageRules,
625
627
  pathHash: (resourcePath) => {
626
628
  if (this.options.pathHashMode === 'relative' && this.options.projectRoot) {
627
629
  return hash(path.relative(this.options.projectRoot, resourcePath))
@@ -1026,13 +1028,22 @@ class MpxWebpackPlugin {
1026
1028
  let request = expr.arguments[0].value
1027
1029
  const range = expr.arguments[0].range
1028
1030
  const context = parser.state.module.context
1029
- const { queryObj } = parseRequest(request)
1030
- if (queryObj.root) {
1031
+ const { queryObj, resourcePath } = parseRequest(request)
1032
+ let tarRoot = queryObj.root
1033
+ if (!tarRoot && mpx.asyncSubpackageRules) {
1034
+ for (const item of mpx.asyncSubpackageRules) {
1035
+ if (matchCondition(resourcePath, item)) {
1036
+ tarRoot = item.root
1037
+ break
1038
+ }
1039
+ }
1040
+ }
1041
+ if (tarRoot) {
1031
1042
  // 删除root query
1032
- request = addQuery(request, {}, false, ['root'])
1043
+ if (queryObj.root) request = addQuery(request, {}, false, ['root'])
1033
1044
  // 目前仅wx和ali支持require.async,ali需要开启enableAliRequireAsync,其余平台使用CommonJsAsyncDependency进行模拟抹平
1034
1045
  if (mpx.enableRequireAsync) {
1035
- const dep = new DynamicEntryDependency(request, 'export', '', queryObj.root, '', context, range, {
1046
+ const dep = new DynamicEntryDependency(request, 'export', '', tarRoot, '', context, range, {
1036
1047
  isRequireAsync: true,
1037
1048
  retryRequireAsync: !!this.options.retryRequireAsync
1038
1049
  })
@@ -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 = {
@@ -177,14 +181,14 @@ module.exports = function (content) {
177
181
  type: 'json',
178
182
  waterfall: true,
179
183
  warn: emitWarning,
180
- error: emitError
184
+ error: emitError,
185
+ data: {
186
+ // polyfill global usingComponents & record globalComponents
187
+ globalComponents: mpx.usingComponents
188
+ }
181
189
  }
182
190
  if (!isApp) {
183
191
  rulesRunnerOptions.mainKey = pagesMap[resourcePath] ? 'page' : 'component'
184
- // polyfill global usingComponents
185
- rulesRunnerOptions.data = {
186
- globalComponents: mpx.usingComponents
187
- }
188
192
  }
189
193
 
190
194
  const rulesRunner = getRulesRunner(rulesRunnerOptions)
@@ -193,22 +197,47 @@ module.exports = function (content) {
193
197
  rulesRunner(json)
194
198
  }
195
199
 
196
- if (isApp && json.usingComponents) {
200
+ if (isApp) {
201
+ Object.assign(mpx.usingComponents, json.usingComponents)
197
202
  // 在 rulesRunner 运行后保存全局注册组件
198
- this._module.addPresentationalDependency(new RecordGlobalComponentsDependency(json.usingComponents, this.context))
203
+ // todo 其余地方在使用mpx.usingComponents时存在缓存问题,要规避该问题需要在所有使用mpx.usingComponents的loader中添加app resourcePath作为fileDependency,但对于缓存有效率影响巨大
204
+ // todo 需要考虑一种精准控制缓存的方式,仅在全局组件发生变更时才使相关使用方的缓存失效,例如按需在相关模块上动态添加request query?
205
+ this._module.addPresentationalDependency(new RecordGlobalComponentsDependency(mpx.usingComponents, this.context))
199
206
  }
200
207
 
201
208
  const processComponents = (components, context, callback) => {
202
209
  if (components) {
203
210
  async.eachOf(components, (component, name, callback) => {
204
- processComponent(component, context, { relativePath }, (err, entry) => {
211
+ processComponent(component, context, { relativePath }, (err, entry, root, placeholder) => {
205
212
  if (err === RESOLVE_IGNORED_ERR) {
206
213
  delete components[name]
207
214
  return callback()
208
215
  }
209
216
  if (err) return callback(err)
210
217
  components[name] = entry
211
- 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
+ }
212
241
  })
213
242
  }, callback)
214
243
  } else {
package/lib/loader.js CHANGED
@@ -120,7 +120,6 @@ module.exports = function (content) {
120
120
 
121
121
  let usingComponents = [].concat(Object.keys(mpx.usingComponents))
122
122
  let componentPlaceholder = []
123
-
124
123
  let componentGenerics = {}
125
124
 
126
125
  if (parts.json && parts.json.content) {
@@ -134,18 +133,12 @@ module.exports = function (content) {
134
133
  }
135
134
  if (!isApp) {
136
135
  rulesRunnerOptions.mainKey = pagesMap[resourcePath] ? 'page' : 'component'
137
- // polyfill global usingComponents
138
- // 预读json时无需注入polyfill全局组件
139
- // rulesRunnerOptions.data = {
140
- // globalComponents: mpx.usingComponents
141
- // }
142
136
  }
143
-
137
+ const rulesRunner = getRulesRunner(rulesRunnerOptions)
144
138
  try {
145
139
  const ret = JSON5.parse(parts.json.content)
140
+ if (rulesRunner) rulesRunner(ret)
146
141
  if (ret.usingComponents) {
147
- const rulesRunner = getRulesRunner(rulesRunnerOptions)
148
- if (rulesRunner) rulesRunner(ret)
149
142
  usingComponents = usingComponents.concat(Object.keys(ret.usingComponents))
150
143
  }
151
144
  if (ret.componentPlaceholder) {
@@ -137,6 +137,7 @@ module.exports = function (content) {
137
137
  } catch (e) {
138
138
  return callback(e)
139
139
  }
140
+ let usingComponents = Object.keys(mpx.usingComponents)
140
141
  const rulesRunnerOptions = {
141
142
  mode,
142
143
  srcMode,
@@ -147,16 +148,10 @@ module.exports = function (content) {
147
148
  }
148
149
  if (!isApp) {
149
150
  rulesRunnerOptions.mainKey = pagesMap[resourcePath] ? 'page' : 'component'
150
- // polyfill global usingComponents
151
- // 预读json时无需注入polyfill全局组件
152
- // rulesRunnerOptions.data = {
153
- // globalComponents: mpx.usingComponents
154
- // }
155
151
  }
156
- let usingComponents = Object.keys(mpx.usingComponents)
152
+ const rulesRunner = getRulesRunner(rulesRunnerOptions)
153
+ if (rulesRunner) rulesRunner(json)
157
154
  if (json.usingComponents) {
158
- const rulesRunner = getRulesRunner(rulesRunnerOptions)
159
- if (rulesRunner) rulesRunner(json)
160
155
  usingComponents = usingComponents.concat(Object.keys(json.usingComponents))
161
156
  }
162
157
  const {
@@ -70,6 +70,13 @@ module.exports = function getSpec ({ warn, error }) {
70
70
  return input
71
71
  }
72
72
 
73
+ function fillGlobalComponents (input, { globalComponents }) {
74
+ if (globalComponents) {
75
+ Object.assign(globalComponents, input.usingComponents)
76
+ }
77
+ return input
78
+ }
79
+
73
80
  // 处理 ali swan 的组件名大写字母转连字符:WordExample/wordExample -> word-example
74
81
  function componentNameCapitalToHyphen (type) {
75
82
  return function (input) {
@@ -318,6 +325,20 @@ module.exports = function getSpec ({ warn, error }) {
318
325
  tt: deletePath(),
319
326
  jd: deletePath(true)
320
327
  },
328
+ {
329
+ test: 'usingComponents',
330
+ ali: componentNameCapitalToHyphen('usingComponents'),
331
+ swan: componentNameCapitalToHyphen('usingComponents')
332
+ },
333
+ {
334
+ test: 'usingComponents',
335
+ // todo ali 2.0已支持全局组件,待移除
336
+ ali: fillGlobalComponents,
337
+ qq: fillGlobalComponents,
338
+ swan: fillGlobalComponents,
339
+ tt: fillGlobalComponents,
340
+ jd: fillGlobalComponents
341
+ },
321
342
  {
322
343
  test: 'usingComponents',
323
344
  // todo ali 2.0已支持全局组件,待移除
@@ -1,14 +1,10 @@
1
1
  const { capitalToHyphen } = require('../../../../utils/string')
2
2
 
3
3
  module.exports = function () {
4
- function convertTagName (name) {
5
- return capitalToHyphen(name)
6
- }
7
-
8
4
  return {
9
5
  // tag name contains capital letters
10
6
  test: /[A-Z]/,
11
- ali: convertTagName,
12
- swan: convertTagName
7
+ ali: capitalToHyphen,
8
+ swan: capitalToHyphen
13
9
  }
14
10
  }
@@ -8,7 +8,7 @@ const checkbox = require('./checkbox')
8
8
  const coverImage = require('./cover-image')
9
9
  const coverView = require('./cover-view')
10
10
  const form = require('./form')
11
- const HyphenTagName = require('./hypen-tag-name')
11
+ const hyphenTagName = require('./hypen-tag-name')
12
12
  const icon = require('./icon')
13
13
  const image = require('./image')
14
14
  const input = require('./input')
@@ -118,7 +118,7 @@ module.exports = function getComponentConfigs ({ warn, error }) {
118
118
  camera({ print }),
119
119
  livePlayer({ print }),
120
120
  livePusher({ print }),
121
- HyphenTagName({ print }),
121
+ hyphenTagName({ print }),
122
122
  component()
123
123
  ]
124
124
  }
@@ -190,16 +190,16 @@ module.exports = function getSpec ({ warn, error }) {
190
190
  }
191
191
  const styleBinding = []
192
192
  el.isStyleParsed = true
193
- el.attrsList.forEach((item) => {
193
+ // 不过滤的话每一个属性都要 parse
194
+ el.attrsList.filter(item => this.test.test(item.name)).forEach((item) => {
194
195
  const parsed = parseMustache(item.value)
195
- if (item.name === 'style') {
196
- if (parsed.hasBinding || parsed.result.indexOf('rpx') > -1) {
197
- styleBinding.push(parseMustache(item.value).result)
198
- } else {
199
- styleBinding.push(JSON.stringify(item.value))
200
- }
201
- } else if (item.name === 'wx:style') {
202
- styleBinding.push(parseMustache(item.value).result)
196
+ if (item.name === 'wx:style') {
197
+ styleBinding.push(parsed.result)
198
+ // item.name === 'style'
199
+ } else if (parsed.hasBinding || parsed.result.indexOf('rpx') > -1) {
200
+ styleBinding.push(parsed.result)
201
+ } else {
202
+ styleBinding.push(JSON.stringify(item.value))
203
203
  }
204
204
  })
205
205
  return {
@@ -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
@@ -1,10 +1,9 @@
1
1
  module.exports = (loaders, loaderIndex) => {
2
- for (let len = loaders.length; len > 0; --len) {
3
- const currentLoader = loaders[len - 1]
2
+ for (let i = loaderIndex; i >= 0; i--) {
3
+ const currentLoader = loaders[i]
4
4
  if (currentLoader.path.endsWith('ts-loader/dist/stringify-loader.js')) {
5
- break
5
+ return i
6
6
  }
7
- loaderIndex--
8
7
  }
9
8
  return loaderIndex
10
9
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mpxjs/webpack-plugin",
3
- "version": "2.8.41",
3
+ "version": "2.8.43",
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": "f3bfd9bf76756bebe92204e4b87b182b1b5b5502"
85
+ "gitHead": "f1066822d83e958f6266218c51c21b2ebb2ad04b"
86
86
  }