@mpxjs/webpack-plugin 2.7.0-beta.1 → 2.7.0-beta.13

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 (51) hide show
  1. package/lib/dependencies/AppEntryDependency.js +2 -0
  2. package/lib/dependencies/CommonJsVariableDependency.js +9 -5
  3. package/lib/dependencies/DynamicEntryDependency.js +8 -3
  4. package/lib/dependencies/FlagPluginDependency.js +1 -0
  5. package/lib/dependencies/RecordIndependentDependency.js +41 -0
  6. package/lib/dependencies/{RecordStaticResourceDependency.js → RecordResourceMapDependency.js} +12 -7
  7. package/lib/dependencies/RemoveEntryDependency.js +40 -0
  8. package/lib/dependencies/ResolveDependency.js +8 -7
  9. package/lib/extractor.js +7 -4
  10. package/lib/file-loader.js +2 -2
  11. package/lib/helpers.js +1 -0
  12. package/lib/index.js +218 -146
  13. package/lib/json-compiler/helper.js +21 -25
  14. package/lib/json-compiler/index.js +70 -54
  15. package/lib/json-compiler/plugin.js +21 -5
  16. package/lib/loader.js +59 -77
  17. package/lib/native-loader.js +28 -65
  18. package/lib/parser.js +1 -2
  19. package/lib/platform/json/wx/index.js +7 -2
  20. package/lib/platform/template/wx/component-config/button.js +3 -3
  21. package/lib/platform/template/wx/component-config/navigator.js +1 -1
  22. package/lib/record-loader.js +2 -2
  23. package/lib/resolver/AddEnvPlugin.js +3 -2
  24. package/lib/resolver/AddModePlugin.js +3 -2
  25. package/lib/runtime/base.styl +5 -0
  26. package/lib/runtime/components/web/getInnerListeners.js +51 -45
  27. package/lib/runtime/components/web/mpx-keep-alive.vue +4 -1
  28. package/lib/runtime/components/web/mpx-tab-bar-container.vue +2 -2
  29. package/lib/runtime/optionProcessor.js +5 -20
  30. package/lib/runtime/stringify.wxs +3 -3
  31. package/lib/selector.js +23 -5
  32. package/lib/style-compiler/index.js +8 -10
  33. package/lib/template-compiler/bind-this.js +4 -4
  34. package/lib/template-compiler/compiler.js +109 -46
  35. package/lib/template-compiler/index.js +3 -6
  36. package/lib/template-compiler/trans-dynamic-class-expr.js +3 -3
  37. package/lib/utils/const.js +5 -1
  38. package/lib/utils/eval-json-js.js +31 -0
  39. package/lib/utils/get-json-content.js +41 -0
  40. package/lib/utils/resolve.js +13 -0
  41. package/lib/web/processJSON.js +113 -142
  42. package/lib/web/processScript.js +30 -30
  43. package/lib/web/processTemplate.js +56 -40
  44. package/lib/wxs/i18n-loader.js +1 -3
  45. package/lib/wxs/loader.js +24 -27
  46. package/lib/wxs/pre-loader.js +7 -8
  47. package/lib/wxss/processCss.js +44 -44
  48. package/package.json +8 -8
  49. package/lib/built-in-loader.js +0 -49
  50. package/lib/utils/get-main-compilation.js +0 -6
  51. package/lib/utils/read-json-for-src.js +0 -34
@@ -0,0 +1,31 @@
1
+ const path = require('path')
2
+
3
+ module.exports = function evalJSONJS (source, filename, loaderContext) {
4
+ const fs = loaderContext._compiler.inputFileSystem
5
+ const defs = loaderContext.getMpx().defs
6
+ const defKeys = Object.keys(defs)
7
+ const defValues = defKeys.map((key) => {
8
+ return defs[key]
9
+ })
10
+ // 记录依赖
11
+ loaderContext.addDependency(filename)
12
+ const dirname = path.dirname(filename)
13
+ // eslint-disable-next-line no-new-func
14
+ const func = new Function('module', 'exports', 'require', '__filename', '__dirname', ...defKeys, source)
15
+ const module = {
16
+ exports: {}
17
+ }
18
+ // 此处采用readFileSync+evalJSONJS而不直接使用require获取依赖内容有两个原因:
19
+ // 1. 支持依赖中正常访问defs变量
20
+ // 2. 避免对应的依赖文件被作为buildDependencies
21
+ func(module, module.exports, function (request) {
22
+ if (request.startsWith('.')) {
23
+ request = path.join(dirname, request)
24
+ }
25
+ const filename = require.resolve(request)
26
+ const source = fs.readFileSync(filename).toString('utf-8')
27
+ return evalJSONJS(source, filename, loaderContext)
28
+ }, filename, dirname, ...defValues)
29
+
30
+ return module.exports
31
+ }
@@ -0,0 +1,41 @@
1
+ const parseRequest = require('./parse-request')
2
+ const evalJSONJS = require('./eval-json-js')
3
+ const resolve = require('./resolve')
4
+ const async = require('async')
5
+ const { JSON_JS_EXT } = require('./const')
6
+
7
+ module.exports = function getJSONContent (json, loaderContext, callback) {
8
+ const fs = loaderContext._compiler.inputFileSystem
9
+ async.waterfall([
10
+ (callback) => {
11
+ if (json.src) {
12
+ resolve(loaderContext.context, json.src, loaderContext, (err, result) => {
13
+ if (err) return callback(err)
14
+ const { rawResourcePath: resourcePath } = parseRequest(result)
15
+ fs.readFile(resourcePath, (err, content) => {
16
+ if (err) return callback(err)
17
+ callback(null, {
18
+ content: content.toString('utf-8'),
19
+ useJSONJS: json.useJSONJS || resourcePath.endsWith(JSON_JS_EXT),
20
+ filename: resourcePath
21
+
22
+ })
23
+ })
24
+ })
25
+ } else {
26
+ callback(null, {
27
+ content: json.content,
28
+ useJSONJS: json.useJSONJS,
29
+ filename: loaderContext.resourcePath
30
+ })
31
+ }
32
+ },
33
+ ({ content, useJSONJS, filename }, callback) => {
34
+ if (!content) return callback(null, '{}')
35
+ if (useJSONJS) {
36
+ content = JSON.stringify(evalJSONJS(content, filename, loaderContext))
37
+ }
38
+ callback(null, content)
39
+ }
40
+ ], callback)
41
+ }
@@ -0,0 +1,13 @@
1
+ const parseRequest = require('./parse-request')
2
+ const { RESOLVE_IGNORED_ERR } = require('./const')
3
+
4
+ // todo 提供不记录dependency的resolve方法,非必要的情况下不记录dependency,提升缓存利用率
5
+ module.exports = (context, request, loaderContext, callback) => {
6
+ const { queryObj } = parseRequest(request)
7
+ context = queryObj.context || context
8
+ return loaderContext.resolve(context, request, (err, resource, info) => {
9
+ if (err) return callback(err)
10
+ if (resource === false) return callback(RESOLVE_IGNORED_ERR)
11
+ callback(null, resource, info)
12
+ })
13
+ }
@@ -6,28 +6,30 @@ const parseRequest = require('../utils/parse-request')
6
6
  const toPosix = require('../utils/to-posix')
7
7
  const addQuery = require('../utils/add-query')
8
8
  const parseComponent = require('../parser')
9
- const readJsonForSrc = require('../utils/read-json-for-src')
10
- const isUrlRequest = require('../utils/is-url-request')
9
+ const getJSONContent = require('../utils/get-json-content')
10
+ const resolve = require('../utils/resolve')
11
+ const createJSONHelper = require('../json-compiler/helper')
12
+ const { RESOLVE_IGNORED_ERR } = require('../utils/const')
13
+ const RecordResourceMapDependency = require('../dependencies/RecordResourceMapDependency')
11
14
 
12
- module.exports = function (json, options, rawCallback) {
13
- const mode = options.mode
14
- const env = options.env
15
- const defs = options.defs
16
- const loaderContext = options.loaderContext
17
- const resolveMode = options.resolveMode
18
- const pagesMap = options.pagesMap
19
- const componentsMap = options.componentsMap
20
- const pagesEntryMap = options.pagesEntryMap
21
- const projectRoot = options.projectRoot
22
- const pathHash = options.pathHash
15
+ module.exports = function (json, {
16
+ loaderContext,
17
+ pagesMap,
18
+ componentsMap
19
+ }, rawCallback) {
23
20
  const localPagesMap = {}
24
21
  const localComponentsMap = {}
25
- const buildInfo = loaderContext._module.buildInfo
26
-
27
22
  let output = '/* json */\n'
28
23
  let jsonObj = {}
29
24
  let tabBarMap
30
25
  let tabBarStr
26
+ const mpx = loaderContext.getMpx()
27
+ const {
28
+ mode,
29
+ env,
30
+ projectRoot
31
+ } = mpx
32
+
31
33
  const context = loaderContext.context
32
34
 
33
35
  const emitWarning = (msg) => {
@@ -37,13 +39,31 @@ module.exports = function (json, options, rawCallback) {
37
39
  }
38
40
 
39
41
  const emitError = (msg) => {
40
- this.emitError(
41
- new Error('[json compiler][' + this.resource + ']: ' + msg)
42
+ loaderContext.emitError(
43
+ new Error('[json compiler][' + loaderContext.resource + ']: ' + msg)
42
44
  )
43
45
  }
44
46
 
45
47
  const stringifyRequest = r => loaderUtils.stringifyRequest(loaderContext, r)
46
48
 
49
+ const {
50
+ isUrlRequest,
51
+ urlToRequest,
52
+ processPage,
53
+ processComponent
54
+ } = createJSONHelper({
55
+ loaderContext,
56
+ emitWarning,
57
+ emitError,
58
+ customGetDynamicEntry (resource, type, outputPath, packageRoot) {
59
+ return {
60
+ resource,
61
+ outputPath: toPosix(path.join(packageRoot, outputPath)),
62
+ packageRoot
63
+ }
64
+ }
65
+ })
66
+
47
67
  const callback = (err) => {
48
68
  return rawCallback(err, {
49
69
  output,
@@ -67,12 +87,6 @@ module.exports = function (json, options, rawCallback) {
67
87
 
68
88
  const fs = loaderContext._compiler.inputFileSystem
69
89
 
70
- const resolve = (context, request, callback) => {
71
- const { queryObj } = parseRequest(request)
72
- context = queryObj.context || context
73
- return loaderContext.resolve(context, request, callback)
74
- }
75
-
76
90
  const defaultTabbar = {
77
91
  borderStyle: 'black',
78
92
  position: 'bottom',
@@ -90,7 +104,7 @@ module.exports = function (json, options, rawCallback) {
90
104
  tabBarStr = JSON.stringify(tabBar)
91
105
  tabBarStr = tabBarStr.replace(/"(iconPath|selectedIconPath)":"([^"]+)"/g, function (matched, $1, $2) {
92
106
  if (isUrlRequest($2, projectRoot)) {
93
- return `"${$1}":require(${stringifyRequest(loaderUtils.urlToRequest($2, projectRoot))})`
107
+ return `"${$1}":require(${stringifyRequest(urlToRequest($2, projectRoot))})`
94
108
  }
95
109
  return matched
96
110
  })
@@ -100,45 +114,37 @@ module.exports = function (json, options, rawCallback) {
100
114
 
101
115
  const processPackages = (packages, context, callback) => {
102
116
  if (packages) {
103
- async.forEach(packages, (packagePath, callback) => {
104
- const parsed = parseRequest(packagePath)
105
- const queryObj = parsed.queryObj
106
- // readFile无法处理query
107
- packagePath = parsed.resourcePath
117
+ async.each(packages, (packagePath, callback) => {
118
+ const { queryObj } = parseRequest(packagePath)
108
119
  async.waterfall([
109
120
  (callback) => {
110
- resolve(context, packagePath, (err, result) => {
111
- callback(err, result)
121
+ resolve(context, packagePath, loaderContext, (err, result) => {
122
+ if (err) return callback(err)
123
+ const { rawResourcePath } = parseRequest(result)
124
+ callback(err, rawResourcePath)
112
125
  })
113
126
  },
114
127
  (result, callback) => {
115
- loaderContext.addDependency(result)
116
128
  fs.readFile(result, (err, content) => {
117
129
  if (err) return callback(err)
118
130
  callback(err, result, content.toString('utf-8'))
119
131
  })
120
132
  },
121
133
  (result, content, callback) => {
122
- const filePath = result
123
- const extName = path.extname(filePath)
134
+ const extName = path.extname(result)
124
135
  if (extName === '.mpx' || extName === '.vue') {
125
136
  const parts = parseComponent(content, {
126
- filePath,
137
+ filePath: result,
127
138
  needMap: loaderContext.sourceMap,
128
139
  mode,
129
- defs,
130
140
  env
131
141
  })
132
- const json = parts.json || {}
133
- if (json.content) {
134
- content = json.content
135
- } else if (json.src) {
136
- return readJsonForSrc(json.src, loaderContext, (content) => {
137
- callback(null, result, content)
138
- })
139
- }
142
+ getJSONContent(parts.json || {}, loaderContext, (err, content) => {
143
+ callback(err, result, content)
144
+ })
145
+ } else {
146
+ callback(null, result, content)
140
147
  }
141
- callback(null, result, content)
142
148
  },
143
149
  (result, content, callback) => {
144
150
  try {
@@ -159,12 +165,17 @@ module.exports = function (json, options, rawCallback) {
159
165
  pages: content.pages,
160
166
  ...queryObj
161
167
  }
168
+
169
+ if (content.plugins) {
170
+ subPackage.plugins = content.plugins
171
+ }
172
+
162
173
  processSelfQueue.push((callback) => {
163
174
  processSubPackage(subPackage, context, callback)
164
175
  })
165
176
  } else {
166
177
  processSelfQueue.push((callback) => {
167
- processPages(content.pages, '', '', context, callback)
178
+ processPages(content.pages, context, '', callback)
168
179
  })
169
180
  }
170
181
  }
@@ -179,77 +190,41 @@ module.exports = function (json, options, rawCallback) {
179
190
  callback()
180
191
  }
181
192
  }
182
- ], callback)
193
+ ], (err) => {
194
+ callback(err === RESOLVE_IGNORED_ERR ? null : err)
195
+ })
183
196
  }, callback)
184
197
  } else {
185
198
  callback()
186
199
  }
187
200
  }
188
201
 
189
- const getPageName = (resourcePath, ext) => {
190
- const baseName = path.basename(resourcePath, ext)
191
- return path.join('pages', baseName + pathHash(resourcePath), baseName)
192
- }
202
+ const pageKeySet = new Set()
193
203
 
194
- const processPages = (pages, srcRoot = '', tarRoot = '', context, callback) => {
204
+ const processPages = (pages, context, tarRoot = '', callback) => {
195
205
  if (pages) {
196
- context = path.join(context, srcRoot)
197
- async.forEach(pages, (page, callback) => {
198
- let aliasPath = ''
199
- if (typeof page !== 'string') {
200
- aliasPath = page.path
201
- page = page.src
202
- }
203
- if (!isUrlRequest(page, projectRoot)) return callback()
204
- if (resolveMode === 'native') {
205
- page = loaderUtils.urlToRequest(page, projectRoot)
206
- }
207
- resolve(context, page, (err, resource) => {
208
- if (err) return callback(err)
206
+ async.each(pages, (page, callback) => {
207
+ processPage(page, context, tarRoot, (err, { resource, outputPath } = {}, { isFirst, key } = {}) => {
208
+ if (err) return callback(err === RESOLVE_IGNORED_ERR ? null : err)
209
+ if (pageKeySet.has(key)) return callback()
210
+ pageKeySet.add(key)
209
211
  const { resourcePath, queryObj } = parseRequest(resource)
210
- const ext = path.extname(resourcePath)
211
- // 获取pageName
212
- let pageName
213
- if (aliasPath) {
214
- pageName = toPosix(path.join(tarRoot, aliasPath))
215
- // 判断 key 存在重复情况直接报错
216
- for (let key in pagesMap) {
217
- if (pagesMap[key] === pageName && key !== resourcePath) {
218
- emitError(`Current page [${resourcePath}] registers a conflict page path [${pageName}] with existed page [${key}], which is not allowed, please rename it!`)
219
- return callback()
220
- }
212
+ if (localPagesMap[outputPath]) {
213
+ const { resourcePath: oldResourcePath } = parseRequest(localPagesMap[outputPath].resource)
214
+ if (oldResourcePath !== resourcePath) {
215
+ const oldOutputPath = outputPath
216
+ outputPath = mpx.getOutputPath(resourcePath, 'page', { conflictPath: outputPath })
217
+ emitWarning(new Error(`Current page [${resourcePath}] is registered with a conflict outputPath [${oldOutputPath}] which is already existed in system, will be renamed with [${outputPath}], use ?resolve to get the real outputPath!`))
221
218
  }
222
- } else {
223
- const relative = path.relative(context, resourcePath)
224
- if (/^\./.test(relative)) {
225
- // 如果当前page不存在于context中,对其进行重命名
226
- pageName = toPosix(path.join(tarRoot, getPageName(resourcePath, ext)))
227
- emitWarning(`Current page [${resourcePath}] is not in current pages directory [${context}], the page path will be replaced with [${pageName}], use ?resolve to get the page path and navigate to it!`)
228
- } else {
229
- pageName = toPosix(path.join(tarRoot, /^(.*?)(\.[^.]*)?$/.exec(relative)[1]))
230
- // 如果当前page与已有page存在命名冲突,也进行重命名
231
- for (let key in pagesMap) {
232
- // 此处引入pagesEntryMap确保相同entry下路由路径重复注册才报错,不同entry下的路由路径重复则无影响
233
- if (pagesMap[key] === pageName && key !== resourcePath && pagesEntryMap[key] === loaderContext.resourcePath) {
234
- const pageNameRaw = pageName
235
- pageName = toPosix(path.join(tarRoot, getPageName(resourcePath, ext)))
236
- emitWarning(`Current page [${resourcePath}] is registered with a conflict page path [${pageNameRaw}] which is already existed in system, the page path will be replaced with [${pageName}], use ?resolve to get the page path and navigate to it!`)
237
- break
238
- }
239
- }
240
- }
241
- }
242
- if (pagesMap[resourcePath]) {
243
- emitWarning(`Current page [${resourcePath}] which is imported from [${loaderContext.resourcePath}] has been registered in pagesMap already, it will be ignored, please check it and remove the redundant page declaration!`)
244
- return callback()
245
219
  }
246
- buildInfo.pagesMap = buildInfo.pagesMap || {}
247
- buildInfo.pagesMap[resourcePath] = pagesMap[resourcePath] = pageName
248
- pagesEntryMap[resourcePath] = loaderContext.resourcePath
249
- localPagesMap[pageName] = {
250
- resource: addQuery(resource, { page: true }),
220
+
221
+ pagesMap[resourcePath] = outputPath
222
+ loaderContext._module.addPresentationalDependency(new RecordResourceMapDependency(resourcePath, 'page', outputPath))
223
+
224
+ localPagesMap[outputPath] = {
225
+ resource: addQuery(resource, { isPage: true }),
251
226
  async: tarRoot || queryObj.async,
252
- isFirst: queryObj.isFirst
227
+ isFirst
253
228
  }
254
229
  callback()
255
230
  })
@@ -261,10 +236,15 @@ module.exports = function (json, options, rawCallback) {
261
236
 
262
237
  const processSubPackage = (subPackage, context, callback) => {
263
238
  if (subPackage) {
239
+ if (typeof subPackage.root === 'string' && subPackage.root.startsWith('.')) {
240
+ emitError(`Current subpackage root [${subPackage.root}] is not allow starts with '.'`)
241
+ return callback()
242
+ }
264
243
  let tarRoot = subPackage.tarRoot || subPackage.root || ''
265
244
  let srcRoot = subPackage.srcRoot || subPackage.root || ''
266
245
  if (!tarRoot) return callback()
267
- processPages(subPackage.pages, srcRoot, tarRoot, context, callback)
246
+ context = path.join(context, srcRoot)
247
+ processPages(subPackage.pages, context, tarRoot, callback)
268
248
  } else {
269
249
  callback()
270
250
  }
@@ -272,7 +252,7 @@ module.exports = function (json, options, rawCallback) {
272
252
 
273
253
  const processSubPackages = (subPackages, context, callback) => {
274
254
  if (subPackages) {
275
- async.forEach(subPackages, (subPackage, callback) => {
255
+ async.each(subPackages, (subPackage, callback) => {
276
256
  processSubPackage(subPackage, context, callback)
277
257
  }, callback)
278
258
  } else {
@@ -282,48 +262,38 @@ module.exports = function (json, options, rawCallback) {
282
262
 
283
263
  const processComponents = (components, context, callback) => {
284
264
  if (components) {
285
- async.forEachOf(components, (component, name, callback) => {
286
- processComponent(component, name, context, callback)
265
+ async.eachOf(components, (component, name, callback) => {
266
+ processComponent(component, context, {}, (err, { resource, outputPath } = {}) => {
267
+ if (err === RESOLVE_IGNORED_ERR) {
268
+ return callback()
269
+ }
270
+ const { resourcePath, queryObj } = parseRequest(resource)
271
+ componentsMap[resourcePath] = outputPath
272
+ loaderContext._module.addPresentationalDependency(new RecordResourceMapDependency(resourcePath, 'component', outputPath))
273
+
274
+ localComponentsMap[name] = {
275
+ resource: addQuery(resource, {
276
+ isComponent: true,
277
+ outputPath
278
+ }),
279
+ async: queryObj.async
280
+ }
281
+ callback()
282
+ })
287
283
  }, callback)
288
284
  } else {
289
285
  callback()
290
286
  }
291
287
  }
292
288
 
293
- const processComponent = (component, name, context, callback) => {
294
- if (!isUrlRequest(component, projectRoot)) return callback()
295
-
296
- if (resolveMode === 'native') {
297
- component = loaderUtils.urlToRequest(component, projectRoot)
298
- }
299
-
300
- resolve(context, component, (err, resource) => {
301
- if (err) return callback(err)
302
- const { resourcePath, queryObj } = parseRequest(resource)
303
- const parsed = path.parse(resourcePath)
304
- const componentId = parsed.name + pathHash(resourcePath)
305
-
306
- buildInfo.packageName = 'main'
307
- buildInfo.componentsMap = buildInfo.componentsMap || {}
308
- buildInfo.componentsMap[resourcePath] = componentsMap[resourcePath] = componentId
309
-
310
- localComponentsMap[name] = {
311
- resource: addQuery(resource, { component: true, componentId }),
312
- async: queryObj.async
313
- }
314
- callback()
315
- })
316
- }
317
-
318
289
  const processGenerics = (generics, context, callback) => {
319
290
  if (generics) {
320
- async.forEachOf(generics, (generic, name, callback) => {
321
- if (generic.default) {
322
- processComponent(generic.default, `${name}default`, context, callback)
323
- } else {
324
- callback()
325
- }
326
- }, callback)
291
+ const genericsComponents = {}
292
+ Object.keys(generics).forEach((name) => {
293
+ const generic = generics[name]
294
+ if (generic.default) genericsComponents[`${name}default`] = generic.default
295
+ })
296
+ processComponents(genericsComponents, context, callback)
327
297
  } else {
328
298
  callback()
329
299
  }
@@ -331,6 +301,7 @@ module.exports = function (json, options, rawCallback) {
331
301
 
332
302
  async.parallel([
333
303
  (callback) => {
304
+ // 添加首页标识
334
305
  if (jsonObj.pages && jsonObj.pages[0]) {
335
306
  if (typeof jsonObj.pages[0] !== 'string') {
336
307
  jsonObj.pages[0].src = addQuery(jsonObj.pages[0].src, { isFirst: true })
@@ -338,7 +309,7 @@ module.exports = function (json, options, rawCallback) {
338
309
  jsonObj.pages[0] = addQuery(jsonObj.pages[0], { isFirst: true })
339
310
  }
340
311
  }
341
- processPages(jsonObj.pages, '', '', context, callback)
312
+ processPages(jsonObj.pages, context, '', callback)
342
313
  },
343
314
  (callback) => {
344
315
  processComponents(jsonObj.usingComponents, context, callback)
@@ -2,7 +2,6 @@ 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 builtInLoaderPath = normalize.lib('built-in-loader')
6
5
  const optionProcessorPath = normalize.lib('runtime/optionProcessor')
7
6
  const tabBarContainerPath = normalize.lib('runtime/components/web/mpx-tab-bar-container.vue')
8
7
  const tabBarPath = normalize.lib('runtime/components/web/mpx-tab-bar.vue')
@@ -21,23 +20,29 @@ function shallowStringify (obj) {
21
20
  return `{${arr.join(',')}}`
22
21
  }
23
22
 
24
- module.exports = function (script, options, callback) {
25
- const ctorType = options.ctorType
26
- const builtInComponentsMap = options.builtInComponentsMap
27
- const localComponentsMap = options.localComponentsMap
28
- const localPagesMap = options.localPagesMap
29
- const srcMode = options.srcMode
30
- const loaderContext = options.loaderContext
31
- const isProduction = options.isProduction
32
- const componentId = options.componentId
33
- const i18n = options.i18n
34
- const jsonConfig = options.jsonConfig
23
+ module.exports = function (script, {
24
+ loaderContext,
25
+ ctorType,
26
+ srcMode,
27
+ isProduction,
28
+ componentGenerics,
29
+ jsonConfig,
30
+ outputPath,
31
+ tabBarMap,
32
+ tabBarStr,
33
+ builtInComponentsMap,
34
+ genericsInfo,
35
+ wxsModuleMap,
36
+ localComponentsMap,
37
+ localPagesMap
38
+ }, callback) {
39
+ const mpx = loaderContext.getMpx()
40
+ const {
41
+ i18n,
42
+ projectRoot
43
+ } = mpx
44
+
35
45
  const tabBar = jsonConfig.tabBar
36
- const tabBarMap = options.tabBarMap
37
- const tabBarStr = options.tabBarStr
38
- const genericsInfo = options.genericsInfo
39
- const componentGenerics = options.componentGenerics
40
- const forceDisableBuiltInLoader = options.forceDisableBuiltInLoader
41
46
 
42
47
  const emitWarning = (msg) => {
43
48
  loaderContext.emitWarning(
@@ -49,7 +54,7 @@ module.exports = function (script, options, callback) {
49
54
  let tabBarPagesMap = {}
50
55
  if (tabBar && tabBarMap) {
51
56
  // 挂载tabBar组件
52
- const tabBarRequest = stringifyRequest(addQuery(tabBar.custom ? './custom-tab-bar/index' : tabBarPath, { component: true }))
57
+ const tabBarRequest = stringifyRequest(addQuery(tabBar.custom ? './custom-tab-bar/index' : tabBarPath, { isComponent: true }))
53
58
  tabBarPagesMap['mpx-tab-bar'] = `getComponent(require(${tabBarRequest}))`
54
59
  // 挂载tabBar页面
55
60
  Object.keys(tabBarMap).forEach((pagePath) => {
@@ -108,12 +113,6 @@ module.exports = function (script, options, callback) {
108
113
  import Vue from 'vue'
109
114
  import VueRouter from 'vue-router'
110
115
  Vue.use(VueRouter)
111
- import BScroll from '@better-scroll/core'
112
- import PullDown from '@better-scroll/pull-down'
113
- import ObserveDOM from '@better-scroll/observe-dom'
114
- BScroll.use(ObserveDOM)
115
- BScroll.use(PullDown)
116
- global.BScroll = BScroll
117
116
  global.getApp = function(){}
118
117
  global.getCurrentPages = function(){
119
118
  if(!global.__mpxRouter) return []
@@ -161,9 +160,9 @@ module.exports = function (script, options, callback) {
161
160
  }
162
161
  // 注入wxs模块
163
162
  content += ' const wxsModules = {}\n'
164
- if (options.wxsModuleMap) {
165
- Object.keys(options.wxsModuleMap).forEach((module) => {
166
- const src = loaderUtils.urlToRequest(options.wxsModuleMap[module], options.projectRoot)
163
+ if (wxsModuleMap) {
164
+ Object.keys(wxsModuleMap).forEach((module) => {
165
+ const src = loaderUtils.urlToRequest(wxsModuleMap[module], projectRoot)
167
166
  const expression = `require(${stringifyRequest(src)})`
168
167
  content += ` wxsModules.${module} = ${expression}\n`
169
168
  })
@@ -202,7 +201,7 @@ module.exports = function (script, options, callback) {
202
201
 
203
202
  Object.keys(builtInComponentsMap).forEach((componentName) => {
204
203
  const componentCfg = builtInComponentsMap[componentName]
205
- const componentRequest = forceDisableBuiltInLoader ? stringifyRequest(componentCfg.resource) : stringifyRequest('builtInComponent.vue!=!' + builtInLoaderPath + '!' + componentCfg.resource)
204
+ const componentRequest = stringifyRequest(componentCfg.resource)
206
205
  componentsMap[componentName] = `getComponent(require(${componentRequest}), { __mpxBuiltIn: true })`
207
206
  })
208
207
 
@@ -211,10 +210,11 @@ module.exports = function (script, options, callback) {
211
210
  content += ` global.currentResource = ${JSON.stringify(loaderContext.resourcePath)}\n`
212
211
  }
213
212
  // 为了正确获取currentSrcMode便于运行时进行转换,对于src引入的组件script采用require方式引入(由于webpack会将import的执行顺序上升至最顶),这意味着对于src引入脚本中的named export将不会生效,不过鉴于mpx和小程序中本身也没有在组件script中声明export的用法,所以应该没有影响
213
+ content += '\n\n\n/** ====== Source start ====== **/\n'
214
214
  content += script.src
215
215
  ? `require(${stringifyRequest(script.src)})\n`
216
216
  : script.content
217
- content += '\n'
217
+ content += '\n/** ====== Source end ====== **/\n\n\n'
218
218
  // createApp/Page/Component执行完成后立刻获取当前的option并暂存
219
219
  content += ` const currentOption = global.currentOption\n`
220
220
  // 获取pageConfig
@@ -245,7 +245,7 @@ module.exports = function (script, options, callback) {
245
245
  currentOption,
246
246
  ${JSON.stringify(ctorType)},
247
247
  ${JSON.stringify(firstPage)},
248
- ${JSON.stringify(componentId)},
248
+ ${JSON.stringify(outputPath)},
249
249
  ${JSON.stringify(pageConfig)},
250
250
  // @ts-ignore
251
251
  ${shallowStringify(pagesMap)},