@mpxjs/webpack-plugin 2.7.46 → 2.7.49

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.
@@ -5,10 +5,9 @@ const addQuery = require('../utils/add-query')
5
5
  const toPosix = require('../utils/to-posix')
6
6
  const async = require('async')
7
7
  const parseRequest = require('../utils/parse-request')
8
- const { MPX_CURRENT_CHUNK } = require('../utils/const')
9
8
 
10
9
  class DynamicEntryDependency extends NullDependency {
11
- constructor (request, entryType, outputPath = '', packageRoot = '', relativePath = '', context = '', range) {
10
+ constructor (request, entryType, outputPath = '', packageRoot = '', relativePath = '', context = '', range, extraOptions = {}) {
12
11
  super()
13
12
  this.request = request
14
13
  this.entryType = entryType
@@ -17,6 +16,7 @@ class DynamicEntryDependency extends NullDependency {
17
16
  this.relativePath = relativePath
18
17
  this.context = context
19
18
  this.range = range
19
+ this.extraOptions = extraOptions
20
20
  }
21
21
 
22
22
  get type () {
@@ -61,7 +61,7 @@ class DynamicEntryDependency extends NullDependency {
61
61
  })
62
62
 
63
63
  let resultPath = publicPath + filename
64
- if (relativePath && relativePath !== MPX_CURRENT_CHUNK) {
64
+ if (relativePath) {
65
65
  resultPath = toPosix(path.relative(relativePath, resultPath))
66
66
  }
67
67
 
@@ -91,10 +91,16 @@ class DynamicEntryDependency extends NullDependency {
91
91
  }
92
92
 
93
93
  mpxAction (module, compilation, callback) {
94
- const mpx = compilation.__mpx__
95
- const { packageRoot, context } = this
96
- this.originEntryNode = mpx.getEntryNode(module)
94
+ const { __mpx__: mpx, moduleGraph } = compilation
95
+ let entryModule = module
96
+ while (true) {
97
+ const issuer = moduleGraph.getIssuer(entryModule)
98
+ if (issuer) entryModule = issuer
99
+ else break
100
+ }
101
+ this.originEntryNode = mpx.getEntryNode(entryModule)
97
102
  this.publicPath = compilation.outputOptions.publicPath || ''
103
+ const { packageRoot, context } = this
98
104
  if (context) this.resolver = compilation.resolverFactory.get('normal', module.resolveOptions)
99
105
  // 分包构建在需要在主包构建完成后在finishMake中处理,返回的资源路径先用key来占位,在合成extractedAssets时再进行最终替换
100
106
  if (packageRoot && mpx.currentPackageRoot !== packageRoot) {
@@ -112,10 +118,10 @@ class DynamicEntryDependency extends NullDependency {
112
118
 
113
119
  // hash会影响最终的codeGenerateResult是否走缓存,由于该dep中resultPath是动态变更的,需要将其更新到hash中,避免错误使用缓存
114
120
  updateHash (hash, context) {
115
- const { resultPath, relativePath } = this
121
+ const { resultPath, extraOptions } = this
116
122
  if (resultPath) hash.update(resultPath)
117
- // relativePath为MPX_CURRENT_CHUNK时,插入随机hash使当前module的codeGeneration cache失效,从而执行dep.apply动态获取当前module所属的chunk路径
118
- if (relativePath === MPX_CURRENT_CHUNK) hash.update('' + (+new Date()) + Math.random())
123
+ // 当处理require.async时,插入随机hash使当前module的codeGeneration cache失效,从而执行dep.apply动态获取当前module所属的chunk路径
124
+ if (extraOptions.isRequireAsync) hash.update('' + (+new Date()) + Math.random())
119
125
  super.updateHash(hash, context)
120
126
  }
121
127
 
@@ -128,6 +134,7 @@ class DynamicEntryDependency extends NullDependency {
128
134
  write(this.relativePath)
129
135
  write(this.context)
130
136
  write(this.range)
137
+ write(this.extraOptions)
131
138
  super.serialize(context)
132
139
  }
133
140
 
@@ -140,6 +147,7 @@ class DynamicEntryDependency extends NullDependency {
140
147
  this.relativePath = read()
141
148
  this.context = read()
142
149
  this.range = read()
150
+ this.extraOptions = read()
143
151
  super.deserialize(context)
144
152
  }
145
153
  }
@@ -149,20 +157,30 @@ DynamicEntryDependency.Template = class DynamicEntryDependencyTemplate {
149
157
  module,
150
158
  chunkGraph
151
159
  }) {
152
- let { resultPath, range, key, outputPath, relativePath, publicPath } = dep
160
+ const { resultPath, range, key, outputPath, publicPath, extraOptions } = dep
161
+
162
+ let replaceContent = ''
163
+
153
164
  if (outputPath === 'custom-tab-bar/index') {
154
165
  // replace with true for custom-tab-bar
155
- source.replace(range[0], range[1] - 1, 'true')
166
+ replaceContent = JSON.stringify(true)
156
167
  } else if (resultPath) {
157
- if (relativePath === MPX_CURRENT_CHUNK) {
158
- relativePath = publicPath + path.dirname(chunkGraph.getModuleChunks(module)[0].name)
159
- resultPath = toPosix(path.relative(relativePath, resultPath))
168
+ if (extraOptions.isRequireAsync) {
169
+ const relativePath = toPosix(path.relative(publicPath + path.dirname(chunkGraph.getModuleChunks(module)[0].name), resultPath))
170
+ replaceContent = JSON.stringify(relativePath)
171
+ if (extraOptions.retryRequireAsync) {
172
+ replaceContent += `).catch(function (e) {
173
+ return require.async(${JSON.stringify(relativePath)});
174
+ }`
175
+ }
176
+ } else {
177
+ replaceContent = JSON.stringify(resultPath)
160
178
  }
161
- source.replace(range[0], range[1] - 1, JSON.stringify(resultPath))
162
179
  } else {
163
- const replaceRange = `mpx_replace_path_${key}`
164
- source.replace(range[0], range[1] - 1, JSON.stringify(replaceRange))
180
+ replaceContent = JSON.stringify(`mpx_replace_path_${key}`)
165
181
  }
182
+
183
+ if (replaceContent) source.replace(range[0], range[1] - 1, replaceContent)
166
184
  }
167
185
  }
168
186
 
package/lib/index.js CHANGED
@@ -55,7 +55,7 @@ const extractorPath = normalize.lib('extractor')
55
55
  const async = require('async')
56
56
  const stringifyLoadersAndResource = require('./utils/stringify-loaders-resource')
57
57
  const emitFile = require('./utils/emit-file')
58
- const { MPX_PROCESSED_FLAG, MPX_DISABLE_EXTRACTOR_CACHE, MPX_CURRENT_CHUNK } = require('./utils/const')
58
+ const { MPX_PROCESSED_FLAG, MPX_DISABLE_EXTRACTOR_CACHE } = require('./utils/const')
59
59
  const isEmptyObject = require('./utils/is-empty-object')
60
60
 
61
61
  const isProductionLikeMode = options => {
@@ -164,6 +164,7 @@ class MpxWebpackPlugin {
164
164
  }, options.nativeConfig)
165
165
  options.webConfig = options.webConfig || {}
166
166
  options.partialCompile = options.mode !== 'web' && options.partialCompile
167
+ options.retryRequireAsync = options.retryRequireAsync || false
167
168
  this.options = options
168
169
  // Hack for buildDependencies
169
170
  const rawResolveBuildDependencies = FileSystemInfo.prototype.resolveBuildDependencies
@@ -537,7 +538,6 @@ class MpxWebpackPlugin {
537
538
  assetsASTsMap: new Map(),
538
539
  usingComponents: {},
539
540
  // todo es6 map读写性能高于object,之后会逐步替换
540
- vueContentCache: new Map(),
541
541
  wxsAssetsCache: new Map(),
542
542
  currentPackageRoot: '',
543
543
  wxsContentMap: {},
@@ -585,6 +585,11 @@ class MpxWebpackPlugin {
585
585
  if (!entryNode) {
586
586
  entryNode = new EntryNode(module, type)
587
587
  entryNodeModulesMap.set(module, entryNode)
588
+ } else if (type) {
589
+ if (entryNode.type && entryNode.type !== type) {
590
+ compilation.errors.push(`获取request为${module.request}的entryNode时类型与已有节点冲突, 当前注册的type为${type}, 已有节点的type为${entryNode.type}!`)
591
+ }
592
+ entryNode.type = type
588
593
  }
589
594
  return entryNode
590
595
  },
@@ -957,6 +962,7 @@ class MpxWebpackPlugin {
957
962
  parser.hooks.call.for('__mpx_dynamic_entry__').tap('MpxWebpackPlugin', (expr) => {
958
963
  const args = expr.arguments.map((i) => i.value)
959
964
  args.push(expr.range)
965
+
960
966
  const dep = new DynamicEntryDependency(...args)
961
967
  parser.state.current.addPresentationalDependency(dep)
962
968
  return true
@@ -973,7 +979,11 @@ class MpxWebpackPlugin {
973
979
  request = addQuery(request, {}, false, ['root'])
974
980
  // 目前仅wx支持require.async,其余平台使用CommonJsAsyncDependency进行模拟抹平
975
981
  if (mpx.mode === 'wx') {
976
- const dep = new DynamicEntryDependency(request, 'export', '', queryObj.root, MPX_CURRENT_CHUNK, context, range)
982
+ const dep = new DynamicEntryDependency(request, 'export', '', queryObj.root, '', context, range, {
983
+ isRequireAsync: true,
984
+ retryRequireAsync: !!this.options.retryRequireAsync
985
+ })
986
+
977
987
  parser.state.current.addPresentationalDependency(dep)
978
988
  // 包含require.async的模块不能被concatenate,避免DynamicEntryDependency中无法获取模块chunk以计算相对路径
979
989
  parser.state.module.buildInfo.moduleConcatenationBailout = 'require async'
package/lib/loader.js CHANGED
@@ -46,7 +46,6 @@ module.exports = function (content) {
46
46
  const globalSrcMode = mpx.srcMode
47
47
  const localSrcMode = queryObj.mode
48
48
  const srcMode = localSrcMode || globalSrcMode
49
- const vueContentCache = mpx.vueContentCache
50
49
  const autoScope = matchCondition(resourcePath, mpx.autoScopeRules)
51
50
 
52
51
  let ctorType = 'app'
@@ -60,7 +59,7 @@ module.exports = function (content) {
60
59
 
61
60
  // 支持资源query传入isPage或isComponent支持页面/组件单独编译
62
61
  if (ctorType === 'app' && (queryObj.isComponent || queryObj.isPage)) {
63
- const entryName = getEntryName(this) || (queryObj.isComponent ? 'noEntryComponent' : 'noEntryPage')
62
+ const entryName = getEntryName(this) || mpx.getOutputPath(resourcePath, queryObj.isComponent ? 'component' : 'page')
64
63
  ctorType = queryObj.isComponent ? 'component' : 'page'
65
64
  this._module.addPresentationalDependency(new RecordResourceMapDependency(resourcePath, ctorType, entryName, packageRoot))
66
65
  }
@@ -94,10 +93,6 @@ module.exports = function (content) {
94
93
  })
95
94
  },
96
95
  (callback) => {
97
- // web输出模式下没有任何inject,可以通过cache直接返回,由于读取src json可能会新增模块依赖,需要在之后返回缓存内容
98
- if (vueContentCache.has(filePath)) {
99
- return callback(null, vueContentCache.get(filePath))
100
- }
101
96
  const hasScoped = parts.styles.some(({ scoped }) => scoped) || autoScope
102
97
  const templateAttrs = parts.template && parts.template.attrs
103
98
  const hasComment = templateAttrs && templateAttrs.comments
@@ -204,7 +199,6 @@ module.exports = function (content) {
204
199
  ], (err, scriptRes) => {
205
200
  if (err) return callback(err)
206
201
  output += scriptRes.output
207
- vueContentCache.set(filePath, output)
208
202
  callback(null, output)
209
203
  })
210
204
  }
@@ -5,6 +5,5 @@ module.exports = {
5
5
  RESOLVE_IGNORED_ERR: new Error('Resolve ignored!'),
6
6
  JSON_JS_EXT: '.json.js',
7
7
  MPX_ROOT_VIEW: 'mpx-root-view', // 根节点类名
8
- MPX_APP_MODULE_ID: 'mpx-app-scope', // app文件moduleId
9
- MPX_CURRENT_CHUNK: 'mpx_current_chunk'
8
+ MPX_APP_MODULE_ID: 'mpx-app-scope' // app文件moduleId
10
9
  }
@@ -2,6 +2,7 @@ const genComponentTag = require('../utils/gen-component-tag')
2
2
  const loaderUtils = require('loader-utils')
3
3
  const addQuery = require('../utils/add-query')
4
4
  const normalize = require('../utils/normalize')
5
+ const parseRequest = require('../utils/parse-request')
5
6
  const optionProcessorPath = normalize.lib('runtime/optionProcessor')
6
7
  const tabBarContainerPath = normalize.lib('runtime/components/web/mpx-tab-bar-container.vue')
7
8
  const tabBarPath = normalize.lib('runtime/components/web/mpx-tab-bar.vue')
@@ -49,6 +50,7 @@ module.exports = function (script, {
49
50
  projectRoot
50
51
  } = mpx
51
52
 
53
+ const { queryObj } = parseRequest(loaderContext.resource)
52
54
  const tabBar = jsonConfig.tabBar
53
55
 
54
56
  const emitWarning = (msg) => {
@@ -219,7 +221,8 @@ module.exports = function (script, {
219
221
  // 为了正确获取currentSrcMode便于运行时进行转换,对于src引入的组件script采用require方式引入(由于webpack会将import的执行顺序上升至最顶),这意味着对于src引入脚本中的named export将不会生效,不过鉴于mpx和小程序中本身也没有在组件script中声明export的用法,所以应该没有影响
220
222
  content += '\n\n\n/** Source start **/\n'
221
223
  content += script.src
222
- ? `require(${stringifyRequest(script.src)})\n`
224
+ // 继承单文件组件query避免多个单文件模块实例引用一个src模块,因模块缓存导致createComponent不执行的问题
225
+ ? `require(${stringifyRequest(addQuery(script.src, queryObj))})\n`
223
226
  : script.content
224
227
  content += '\n/** Source end **/\n\n\n'
225
228
  // createApp/Page/Component执行完成后立刻获取当前的option并暂存
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mpxjs/webpack-plugin",
3
- "version": "2.7.46",
3
+ "version": "2.7.49",
4
4
  "description": "mpx compile core",
5
5
  "keywords": [
6
6
  "mpx"
@@ -80,5 +80,5 @@
80
80
  "engines": {
81
81
  "node": ">=14.14.0"
82
82
  },
83
- "gitHead": "5c8b46722d862bba145badd164c4675a43a577c3"
83
+ "gitHead": "d24eb21aeb7b11087d5aaaffb1047e7344bfe9cf"
84
84
  }