@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
package/lib/loader.js CHANGED
@@ -11,10 +11,13 @@ const processJSON = require('./web/processJSON')
11
11
  const processScript = require('./web/processScript')
12
12
  const processStyles = require('./web/processStyles')
13
13
  const processTemplate = require('./web/processTemplate')
14
- const readJsonForSrc = require('./utils/read-json-for-src')
14
+ const getJSONContent = require('./utils/get-json-content')
15
15
  const normalize = require('./utils/normalize')
16
16
  const getEntryName = require('./utils/get-entry-name')
17
17
  const AppEntryDependency = require('./dependencies/AppEntryDependency')
18
+ const RecordResourceMapDependency = require('./dependencies/RecordResourceMapDependency')
19
+ const CommonJsVariableDependency = require('./dependencies/CommonJsVariableDependency')
20
+ const { MPX_APP_MODULE_ID } = require('./utils/const')
18
21
 
19
22
  module.exports = function (content) {
20
23
  this.cacheable()
@@ -24,14 +27,13 @@ module.exports = function (content) {
24
27
  return content
25
28
  }
26
29
  const { resourcePath, queryObj } = parseRequest(this.resource)
27
- const packageName = queryObj.packageRoot || mpx.currentPackageRoot || 'main'
30
+ const packageRoot = queryObj.packageRoot || mpx.currentPackageRoot
31
+ const packageName = packageRoot || 'main'
32
+ const isIndependent = queryObj.isIndependent
28
33
  const pagesMap = mpx.pagesMap
29
34
  const componentsMap = mpx.componentsMap[packageName]
30
- const resolveMode = mpx.resolveMode
31
- const projectRoot = mpx.projectRoot
32
35
  const mode = mpx.mode
33
36
  const env = mpx.env
34
- const defs = mpx.defs
35
37
  const i18n = mpx.i18n
36
38
  const globalSrcMode = mpx.srcMode
37
39
  const localSrcMode = queryObj.mode
@@ -39,16 +41,6 @@ module.exports = function (content) {
39
41
  const vueContentCache = mpx.vueContentCache
40
42
  const autoScope = matchCondition(resourcePath, mpx.autoScopeRules)
41
43
 
42
- // 支持资源query传入page或component支持页面/组件单独编译
43
- if ((queryObj.component && !componentsMap[resourcePath]) || (queryObj.page && !pagesMap[resourcePath])) {
44
- const entryName = getEntryName(this)
45
- if (queryObj.component) {
46
- componentsMap[resourcePath] = entryName || 'noEntryComponent'
47
- } else {
48
- pagesMap[resourcePath] = entryName || 'noEntryPage'
49
- }
50
- }
51
-
52
44
  let ctorType = 'app'
53
45
  if (pagesMap[resourcePath]) {
54
46
  // page
@@ -58,24 +50,23 @@ module.exports = function (content) {
58
50
  ctorType = 'component'
59
51
  }
60
52
 
61
- if (ctorType === 'app') {
62
- const appName = getEntryName(this)
63
- this._module.addPresentationalDependency(new AppEntryDependency(resourcePath, appName))
53
+ // 支持资源query传入isPage或isComponent支持页面/组件单独编译
54
+ if (queryObj.isComponent || queryObj.isPage) {
55
+ const entryName = getEntryName(this) || (queryObj.isComponent ? 'noEntryComponent' : 'noEntryPage')
56
+ ctorType = queryObj.isComponent ? 'component' : 'page'
57
+ this._module.addPresentationalDependency(new RecordResourceMapDependency(resourcePath, ctorType, entryName, packageRoot))
64
58
  }
65
59
 
66
60
  const loaderContext = this
67
61
  const stringifyRequest = r => loaderUtils.stringifyRequest(loaderContext, r)
68
62
  const isProduction = this.minimize || process.env.NODE_ENV === 'production'
69
-
70
63
  const filePath = resourcePath
71
-
72
- const moduleId = 'm' + mpx.pathHash(filePath)
64
+ const moduleId = ctorType === 'app' ? MPX_APP_MODULE_ID : 'm' + mpx.pathHash(filePath)
73
65
 
74
66
  const parts = parseComponent(content, {
75
67
  filePath,
76
68
  needMap: this.sourceMap,
77
69
  mode,
78
- defs,
79
70
  env
80
71
  })
81
72
 
@@ -84,16 +75,11 @@ module.exports = function (content) {
84
75
 
85
76
  async.waterfall([
86
77
  (callback) => {
87
- const json = parts.json || {}
88
- if (json.src) {
89
- readJsonForSrc(json.src, loaderContext, (err, result) => {
90
- if (err) return callback(err)
91
- json.content = result
92
- callback()
93
- })
94
- } else {
78
+ getJSONContent(parts.json || {}, loaderContext, (err, content) => {
79
+ if (err) return callback(err)
80
+ if (parts.json) parts.json.content = content
95
81
  callback()
96
- }
82
+ })
97
83
  },
98
84
  (callback) => {
99
85
  // web输出模式下没有任何inject,可以通过cache直接返回,由于读取src json可能会新增模块依赖,需要在之后返回缓存内容
@@ -126,8 +112,8 @@ module.exports = function (content) {
126
112
 
127
113
  // 处理mode为web时输出vue格式文件
128
114
  if (mode === 'web') {
129
- if (ctorType === 'app' && !queryObj.app) {
130
- const request = addQuery(this.resource, { app: true })
115
+ if (ctorType === 'app' && !queryObj.isApp) {
116
+ const request = addQuery(this.resource, { isApp: true })
131
117
  output += `
132
118
  import App from ${stringifyRequest(request)}
133
119
  import Vue from 'vue'
@@ -148,20 +134,15 @@ module.exports = function (content) {
148
134
  async.parallel([
149
135
  (callback) => {
150
136
  processTemplate(parts.template, {
137
+ loaderContext,
151
138
  hasScoped,
152
139
  hasComment,
153
140
  isNative,
154
- mode,
155
141
  srcMode,
156
- defs,
157
- loaderContext,
158
142
  moduleId,
159
143
  ctorType,
160
144
  usingComponents,
161
- componentGenerics,
162
- decodeHTMLText: mpx.decodeHTMLText,
163
- externalClasses: mpx.externalClasses,
164
- checkUsingComponents: mpx.checkUsingComponents
145
+ componentGenerics
165
146
  }, callback)
166
147
  },
167
148
  (callback) => {
@@ -173,16 +154,9 @@ module.exports = function (content) {
173
154
  },
174
155
  (callback) => {
175
156
  processJSON(parts.json, {
176
- mode,
177
- env,
178
- defs,
179
- resolveMode,
180
157
  loaderContext,
181
158
  pagesMap,
182
- pagesEntryMap: mpx.pagesEntryMap,
183
- pathHash: mpx.pathHash,
184
- componentsMap,
185
- projectRoot
159
+ componentsMap
186
160
  }, callback)
187
161
  }
188
162
  ], (err, res) => {
@@ -198,23 +172,20 @@ module.exports = function (content) {
198
172
  }
199
173
 
200
174
  processScript(parts.script, {
175
+ loaderContext,
201
176
  ctorType,
202
177
  srcMode,
203
- loaderContext,
204
178
  isProduction,
205
- i18n,
206
179
  componentGenerics,
207
- projectRoot,
208
180
  jsonConfig: jsonRes.jsonObj,
209
- componentId: queryObj.componentId || '',
181
+ outputPath: queryObj.outputPath || '',
210
182
  tabBarMap: jsonRes.tabBarMap,
211
183
  tabBarStr: jsonRes.tabBarStr,
212
184
  builtInComponentsMap: templateRes.builtInComponentsMap,
213
185
  genericsInfo: templateRes.genericsInfo,
214
186
  wxsModuleMap: templateRes.wxsModuleMap,
215
187
  localComponentsMap: jsonRes.localComponentsMap,
216
- localPagesMap: jsonRes.localPagesMap,
217
- forceDisableBuiltInLoader: mpx.forceDisableBuiltInLoader
188
+ localPagesMap: jsonRes.localPagesMap
218
189
  }, callback)
219
190
  }
220
191
  ], (err, scriptRes) => {
@@ -225,6 +196,19 @@ module.exports = function (content) {
225
196
  })
226
197
  }
227
198
 
199
+ const moduleGraph = this._compilation.moduleGraph
200
+
201
+ const issuer = moduleGraph.getIssuer(this._module)
202
+
203
+ if (issuer) {
204
+ return callback(new Error(`Current ${ctorType} [${this.resourcePath}] is issued by [${issuer.resource}], which is not allowed!`))
205
+ }
206
+
207
+ if (ctorType === 'app') {
208
+ const appName = getEntryName(this)
209
+ this._module.addPresentationalDependency(new AppEntryDependency(resourcePath, appName))
210
+ }
211
+
228
212
  const {
229
213
  getRequire
230
214
  } = createHelpers(loaderContext)
@@ -234,14 +218,21 @@ module.exports = function (content) {
234
218
  if (!isProduction) {
235
219
  output += `global.currentResource = ${JSON.stringify(filePath)}\n`
236
220
  }
237
- if (ctorType === 'app' && i18n) {
238
- output += `global.i18n = ${JSON.stringify({ locale: i18n.locale, version: 0 })}\n`
239
-
221
+ // app或独立分包页面注入i18n
222
+ if (i18n && (ctorType === 'app' || (ctorType === 'page' && isIndependent))) {
240
223
  const i18nWxsPath = normalize.lib('runtime/i18n.wxs')
241
224
  const i18nWxsLoaderPath = normalize.lib('wxs/i18n-loader.js')
242
225
  const i18nWxsRequest = i18nWxsLoaderPath + '!' + i18nWxsPath
226
+ const i18nMethodsVar = 'i18nMethods'
227
+ this._module.addDependency(new CommonJsVariableDependency(i18nWxsRequest, i18nMethodsVar))
243
228
 
244
- output += `global.i18nMethods = require(${loaderUtils.stringifyRequest(loaderContext, i18nWxsRequest)})\n`
229
+ output += `if (!global.i18n) {
230
+ global.i18n = ${JSON.stringify({
231
+ locale: i18n.locale,
232
+ version: 0
233
+ })}
234
+ global.i18nMethods = ${i18nMethodsVar}
235
+ }\n`
245
236
  }
246
237
  // 注入构造函数
247
238
  let ctor = 'App'
@@ -259,6 +250,7 @@ module.exports = function (content) {
259
250
  output += `global.currentCtorType = ${JSON.stringify(ctor.replace(/^./, (match) => {
260
251
  return match.toLowerCase()
261
252
  }))}\n`
253
+ output += `global.currentResourceType = '${ctorType}'\n`
262
254
 
263
255
  // template
264
256
  output += '/* template */\n'
@@ -291,9 +283,10 @@ module.exports = function (content) {
291
283
  }
292
284
  // require style
293
285
  if (style.src) {
294
- // style src会被特殊处理为全局复用样式,不添加resourcePath,添加isStatic及issuerResource
286
+ // style src会被特殊处理为全局复用样式,不添加resourcePath,添加isStatic及issuerFile
295
287
  extraOptions.isStatic = true
296
- extraOptions.issuerFile = mpx.getExtractedFile(this.resource)
288
+ const issuerResource = addQuery(this.resource, { type: 'styles' }, true)
289
+ extraOptions.issuerFile = mpx.getExtractedFile(issuerResource)
297
290
  }
298
291
  output += getRequire('styles', style, extraOptions, i) + '\n'
299
292
  })
@@ -310,28 +303,17 @@ module.exports = function (content) {
310
303
  // script
311
304
  output += '/* script */\n'
312
305
  let scriptSrcMode = srcMode
313
- const script = parts.script
306
+ // 给予script默认值, 确保生成js request以自动补全js
307
+ const script = parts.script || {}
314
308
  if (script) {
315
309
  scriptSrcMode = script.mode || scriptSrcMode
316
310
  if (scriptSrcMode) output += `global.currentSrcMode = ${JSON.stringify(scriptSrcMode)}\n`
317
- const extraOptions = {}
311
+ // 传递ctorType以补全js内容
312
+ const extraOptions = {
313
+ ctorType
314
+ }
318
315
  if (script.src) extraOptions.resourcePath = resourcePath
319
316
  output += getRequire('script', script, extraOptions) + '\n'
320
- } else {
321
- switch (ctorType) {
322
- case 'app':
323
- output += 'import {createApp} from "@mpxjs/core"\n' +
324
- 'createApp({})\n'
325
- break
326
- case 'page':
327
- output += 'import {createPage} from "@mpxjs/core"\n' +
328
- 'createPage({})\n'
329
- break
330
- case 'component':
331
- output += 'import {createComponent} from "@mpxjs/core"\n' +
332
- 'createComponent({})\n'
333
- }
334
- output += '\n'
335
317
  }
336
318
  callback(null, output)
337
319
  }
@@ -3,10 +3,11 @@ const JSON5 = require('json5')
3
3
  const parseRequest = require('./utils/parse-request')
4
4
  const config = require('./config')
5
5
  const createHelpers = require('./helpers')
6
- const mpxJSON = require('./utils/mpx-json')
6
+ const getJSONContent = require('./utils/get-json-content')
7
7
  const async = require('async')
8
8
  const matchCondition = require('./utils/match-condition')
9
9
  const fixUsingComponent = require('./utils/fix-using-component')
10
+ const { JSON_JS_EXT } = require('./utils/const')
10
11
 
11
12
  module.exports = function (content) {
12
13
  this.cacheable()
@@ -23,7 +24,6 @@ module.exports = function (content) {
23
24
  const moduleId = 'm' + mpx.pathHash(filePath)
24
25
  const { resourcePath, queryObj } = parseRequest(this.resource)
25
26
  const mode = mpx.mode
26
- const defs = mpx.defs
27
27
  const globalSrcMode = mpx.srcMode
28
28
  const localSrcMode = queryObj.mode
29
29
  const packageName = queryObj.packageRoot || mpx.currentPackageRoot || 'main'
@@ -33,12 +33,10 @@ module.exports = function (content) {
33
33
  const resourceName = path.join(parsed.dir, parsed.name)
34
34
  const isApp = !(pagesMap[resourcePath] || componentsMap[resourcePath])
35
35
  const srcMode = localSrcMode || globalSrcMode
36
- const fs = this._compiler.inputFileSystem
37
36
  const typeExtMap = config[srcMode].typeExtMap
38
37
  const typeResourceMap = {}
39
38
  const autoScope = matchCondition(resourcePath, mpx.autoScopeRules)
40
39
 
41
- const EXT_MPX_JSON = '.json.js'
42
40
  const CSS_LANG_EXT_MAP = {
43
41
  less: '.less',
44
42
  stylus: '.styl',
@@ -46,36 +44,14 @@ module.exports = function (content) {
46
44
  scss: '.scss'
47
45
  }
48
46
 
49
- let useMPXJSON = false
47
+ let useJSONJS = false
50
48
  let cssLang = ''
51
49
  const hasScoped = (queryObj.scoped || autoScope) && mode === 'ali'
52
50
  const hasComment = false
53
51
  const isNative = true
54
52
 
55
- const tryEvalMPXJSON = (callback) => {
56
- const { rawResourcePath } = parseRequest(typeResourceMap['json'])
57
- const _src = rawResourcePath
58
- this.addDependency(_src)
59
- fs.readFile(_src, (err, raw) => {
60
- if (err) {
61
- callback(err)
62
- } else {
63
- try {
64
- const source = raw.toString('utf-8')
65
- const text = mpxJSON.compileMPXJSONText({ source, defs, filePath: _src })
66
- callback(null, text)
67
- } catch (e) {
68
- callback(e)
69
- }
70
- }
71
- })
72
- }
73
-
74
53
  const checkFileExists = (extName, callback) => {
75
- this.resolve(parsed.dir, resourceName + extName, (err, result) => {
76
- err = null
77
- callback(err, result)
78
- })
54
+ this.resolve(parsed.dir, resourceName + extName, callback)
79
55
  }
80
56
 
81
57
  function checkCSSLangFiles (callback) {
@@ -89,7 +65,7 @@ module.exports = function (content) {
89
65
  if (!err && result) {
90
66
  results[i] = result
91
67
  }
92
- callback(err)
68
+ callback()
93
69
  })
94
70
  }, function (err) {
95
71
  for (let i = 0; i < langs.length; i++) {
@@ -103,14 +79,13 @@ module.exports = function (content) {
103
79
  })
104
80
  }
105
81
 
106
- function checkMPXJSONFile (callback) {
107
- // checkFileExists(EXT_MPX_JSON, (err, result) => {
108
- checkFileExists(EXT_MPX_JSON, (err, result) => {
82
+ function checkJSONJSFile (callback) {
83
+ checkFileExists(JSON_JS_EXT, (err, result) => {
109
84
  if (!err && result) {
110
85
  typeResourceMap.json = result
111
- useMPXJSON = true
86
+ useJSONJS = true
112
87
  }
113
- callback(err)
88
+ callback()
114
89
  })
115
90
  }
116
91
 
@@ -119,55 +94,42 @@ module.exports = function (content) {
119
94
  (callback) => {
120
95
  async.parallel([
121
96
  checkCSSLangFiles,
122
- checkMPXJSONFile
97
+ checkJSONJSFile
123
98
  ], (err) => {
124
99
  callback(err)
125
100
  })
126
101
  },
127
102
  (callback) => {
128
103
  async.forEachOf(typeExtMap, (ext, key, callback) => {
129
- // 检测到mpxJson或cssLang时跳过对应类型文件检测
130
- if ((key === 'json' && useMPXJSON) || (key === 'styles' && cssLang)) {
104
+ // 检测到jsonjs或cssLang时跳过对应类型文件检测
105
+ if (typeResourceMap[key]) {
131
106
  return callback()
132
107
  }
133
108
  checkFileExists(ext, (err, result) => {
134
109
  if (!err && result) {
135
110
  typeResourceMap[key] = result
136
111
  }
137
- callback(err)
112
+ callback()
138
113
  })
139
114
  }, callback)
140
115
  },
141
116
  (callback) => {
142
- // 对原生写法增强json写法,可以用js来写json,尝试找.json.js文件,找不到用回json的内容
143
- if (useMPXJSON) {
144
- tryEvalMPXJSON(callback)
145
- } else {
146
- if (typeResourceMap['json']) {
147
- // eslint-disable-next-line handle-callback-err
148
- const { rawResourcePath } = parseRequest(typeResourceMap['json'])
149
- fs.readFile(rawResourcePath, (err, raw) => {
150
- if (err) {
151
- callback(err)
152
- } else {
153
- callback(null, raw.toString('utf-8'))
154
- }
155
- })
156
- } else {
157
- callback(null, '{}')
158
- }
159
- }
117
+ getJSONContent({
118
+ src: typeResourceMap.json,
119
+ useJSONJS
120
+ }, this, callback)
160
121
  }, (content, callback) => {
161
- let usingComponents = [].concat(Object.keys(mpx.usingComponents))
122
+ let json
162
123
  try {
163
- let ret = JSON5.parse(content)
164
- if (ret.usingComponents) {
165
- fixUsingComponent(ret.usingComponents, mode)
166
- usingComponents = usingComponents.concat(Object.keys(ret.usingComponents))
167
- }
124
+ json = JSON5.parse(content)
168
125
  } catch (e) {
126
+ return callback(e)
127
+ }
128
+ let usingComponents = Object.keys(mpx.usingComponents)
129
+ if (json.usingComponents) {
130
+ fixUsingComponent(json.usingComponents, mode)
131
+ usingComponents = usingComponents.concat(Object.keys(json.usingComponents))
169
132
  }
170
-
171
133
  const {
172
134
  getRequire
173
135
  } = createHelpers(loaderContext)
@@ -179,8 +141,6 @@ module.exports = function (content) {
179
141
  resourcePath
180
142
  })
181
143
 
182
- if (type !== 'script') this.addDependency(src)
183
-
184
144
  switch (type) {
185
145
  case 'template':
186
146
  if (isApp) return ''
@@ -199,6 +159,9 @@ module.exports = function (content) {
199
159
  scoped: hasScoped
200
160
  })
201
161
  break
162
+ case 'json':
163
+ if (useJSONJS) part.useJSONJS = true
164
+ break
202
165
  }
203
166
  return getRequire(type, part, extraOptions)
204
167
  }
package/lib/parser.js CHANGED
@@ -6,7 +6,7 @@ const SourceMapGenerator = require('source-map').SourceMapGenerator
6
6
  const splitRE = /\r?\n/g
7
7
  const emptyRE = /^(?:\/\/)?\s*$/
8
8
 
9
- module.exports = (content, { filePath, needMap, mode, defs, env }) => {
9
+ module.exports = (content, { filePath, needMap, mode, env }) => {
10
10
  // 缓存需要mode隔离,不同mode经过区块条件编译parseComponent得到的内容并不一致
11
11
  const cacheKey = hash(filePath + content + mode + env)
12
12
 
@@ -14,7 +14,6 @@ module.exports = (content, { filePath, needMap, mode, defs, env }) => {
14
14
  if (output) return JSON.parse(output)
15
15
  output = compiler.parseComponent(content, {
16
16
  mode,
17
- defs,
18
17
  filePath,
19
18
  pad: 'line',
20
19
  env
@@ -73,7 +73,12 @@ module.exports = function getSpec ({ warn, error }) {
73
73
  swan: deletePath()
74
74
  },
75
75
  {
76
- test: 'onReachBottomDistance|disableScroll',
76
+ test: 'onReachBottomDistance',
77
+ qq: deletePath(),
78
+ jd: deletePath()
79
+ },
80
+ {
81
+ test: 'disableScroll',
77
82
  ali: deletePath(),
78
83
  qq: deletePath(),
79
84
  jd: deletePath()
@@ -84,7 +89,7 @@ module.exports = function getSpec ({ warn, error }) {
84
89
  swan: deletePath()
85
90
  },
86
91
  {
87
- test: 'navigationBarTextStyle|navigationStyle|backgroundColor|backgroundTextStyle',
92
+ test: 'navigationBarTextStyle|navigationStyle|backgroundTextStyle',
88
93
  ali: deletePath()
89
94
  },
90
95
  {
@@ -79,7 +79,7 @@ module.exports = function ({ print }) {
79
79
  if (isMustache(value)) {
80
80
  // 如果是个变量,报warning
81
81
  baiduValueLog({ name, value })
82
- } else if (supportList.indexOf(value) === -1) {
82
+ } else if (value && supportList.indexOf(value) === -1) {
83
83
  baiduValueLogError({ name, value })
84
84
  }
85
85
  },
@@ -91,7 +91,7 @@ module.exports = function ({ print }) {
91
91
  if (isMustache(value)) {
92
92
  // 如果是个变量,报warning
93
93
  qqValueLog({ name, value })
94
- } else if (supportList.indexOf(value) === -1) {
94
+ } else if (value && supportList.indexOf(value) === -1) {
95
95
  qqValueLogError({ name, value })
96
96
  }
97
97
  },
@@ -103,7 +103,7 @@ module.exports = function ({ print }) {
103
103
  ttValueLog({ name, value })
104
104
  } else {
105
105
  const supportList = ['share', 'getPhoneNumber', 'contact']
106
- if (supportList.indexOf(value) === -1) {
106
+ if (value && supportList.indexOf(value) === -1) {
107
107
  ttValueLogError({ name, value })
108
108
  }
109
109
  }
@@ -44,7 +44,7 @@ module.exports = function ({ print }) {
44
44
  // 如果是个变量,报warning~
45
45
  aliPropLog(attr)
46
46
  } else {
47
- let supportedList = ['navigate', 'redirect', 'switchTab', 'navigateBack', 'reLaunch']
47
+ let supportedList = ['navigate', 'redirect', 'switchTab', 'navigateBack', 'reLaunch', 'exit']
48
48
  if (supportedList.indexOf(attr.value) === -1) {
49
49
  aliValueLogError(attr)
50
50
  }
@@ -1,11 +1,11 @@
1
1
  const parseRequest = require('./utils/parse-request')
2
- const RecordStaticResourceDependency = require('./dependencies/RecordStaticResourceDependency')
2
+ const RecordResourceMapDependency = require('./dependencies/RecordResourceMapDependency')
3
3
 
4
4
  module.exports = function (source) {
5
5
  const mpx = this.getMpx()
6
6
  const { resourcePath, queryObj } = parseRequest(this.resource)
7
7
  const file = mpx.getExtractedFile(this.resource)
8
8
  const packageRoot = queryObj.packageRoot || ''
9
- this._module.addPresentationalDependency(new RecordStaticResourceDependency(resourcePath, file, packageRoot))
9
+ this._module.addPresentationalDependency(new RecordResourceMapDependency(resourcePath, 'staticResource', file, packageRoot))
10
10
  return source
11
11
  }
@@ -3,6 +3,7 @@ const stringifyQuery = require('../utils/stringify-query')
3
3
  const parseQuery = require('loader-utils').parseQuery
4
4
  const addInfix = require('../utils/add-infix')
5
5
  const matchCondition = require('../utils/match-condition')
6
+ const { JSON_JS_EXT } = require('../utils/const')
6
7
 
7
8
  module.exports = class AddEnvPlugin {
8
9
  constructor (source, env, fileConditionRules, target) {
@@ -24,8 +25,8 @@ module.exports = class AddEnvPlugin {
24
25
  }
25
26
  const resourcePath = request.path
26
27
  let extname = ''
27
- if (resourcePath.endsWith('.json.js')) {
28
- extname = '.json.js'
28
+ if (resourcePath.endsWith(JSON_JS_EXT)) {
29
+ extname = JSON_JS_EXT
29
30
  } else {
30
31
  extname = path.extname(resourcePath)
31
32
  }
@@ -3,6 +3,7 @@ const stringifyQuery = require('../utils/stringify-query')
3
3
  const parseQuery = require('loader-utils').parseQuery
4
4
  const matchCondition = require('../utils/match-condition')
5
5
  const addInfix = require('../utils/add-infix')
6
+ const { JSON_JS_EXT } = require('../utils/const')
6
7
 
7
8
  module.exports = class AddModePlugin {
8
9
  constructor (source, mode, fileConditionRules, target) {
@@ -24,8 +25,8 @@ module.exports = class AddModePlugin {
24
25
  }
25
26
  const resourcePath = request.path
26
27
  let extname = ''
27
- if (resourcePath.endsWith('.json.js')) {
28
- extname = '.json.js'
28
+ if (resourcePath.endsWith(JSON_JS_EXT)) {
29
+ extname = JSON_JS_EXT
29
30
  } else {
30
31
  extname = path.extname(resourcePath)
31
32
  }
@@ -120,3 +120,8 @@ html, body, .app {
120
120
  font-family "weui"
121
121
  src url('data:application/octet-stream;base64,AAEAAAALAIAAAwAwR1NVQrD+s+0AAAE4AAAAQk9TLzJAKEx+AAABfAAAAFZjbWFw65cFHQAAAhwAAAJQZ2x5ZvCRR/EAAASUAAAKtGhlYWQLKIN9AAAA4AAAADZoaGVhCCwD+gAAALwAAAAkaG10eEJo//8AAAHUAAAASGxvY2EYqhW6AAAEbAAAACZtYXhwASEAVQAAARgAAAAgbmFtZeNcHtgAAA9IAAAB5nBvc3T6bLhLAAARMAAAAOYAAQAAA+gAAABaA+j/////A+kAAQAAAAAAAAAAAAAAAAAAABIAAQAAAAEAACkCj3dfDzz1AAsD6AAAAADUER9XAAAAANQRH1f//wAAA+kD6gAAAAgAAgAAAAAAAAABAAAAEgBJAAUAAAAAAAIAAAAKAAoAAAD/AAAAAAAAAAEAAAAKAB4ALAABREZMVAAIAAQAAAAAAAAAAQAAAAFsaWdhAAgAAAABAAAAAQAEAAQAAAABAAgAAQAGAAAAAQAAAAAAAQOwAZAABQAIAnoCvAAAAIwCegK8AAAB4AAxAQIAAAIABQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUGZFZABA6gHqEQPoAAAAWgPqAAAAAAABAAAAAAAAAAAAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+j//wPoAAAD6AAAAAAABQAAAAMAAAAsAAAABAAAAXQAAQAAAAAAbgADAAEAAAAsAAMACgAAAXQABABCAAAABAAEAAEAAOoR//8AAOoB//8AAAABAAQAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAAAEGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAANwAAAAAAAAAEQAA6gEAAOoBAAAAAQAA6gIAAOoCAAAAAgAA6gMAAOoDAAAAAwAA6gQAAOoEAAAABAAA6gUAAOoFAAAABQAA6gYAAOoGAAAABgAA6gcAAOoHAAAABwAA6ggAAOoIAAAACAAA6gkAAOoJAAAACQAA6goAAOoKAAAACgAA6gsAAOoLAAAACwAA6gwAAOoMAAAADAAA6g0AAOoNAAAADQAA6g4AAOoOAAAADgAA6g8AAOoPAAAADwAA6hAAAOoQAAAAEAAA6hEAAOoRAAAAEQAAAAAARgCMANIBJgF4AcQCMgJgAqgC/ANIA6YD/gROBKAE9AVaAAAAAgAAAAADrwOtABQAKQAAASIHBgcGFBcWFxYyNzY3NjQnJicmAyInJicmNDc2NzYyFxYXFhQHBgcGAfV4Z2Q7PDw7ZGfwZmQ7PDw7ZGZ4bl5bNjc3Nlte215bNjc3NlteA608O2Rn8GdjOzw8O2Nn8GdkOzz8rzc1W17bXlw1Nzc1XF7bXls1NwAAAAACAAAAAAOzA7MAFwAtAAABIgcGBwYVFBcWFxYzMjc2NzY1NCcmJyYTBwYiLwEmNjsBETQ2OwEyFhURMzIWAe52Z2Q7PT07ZGd2fGpmOz4+O2ZpIXYOKA52Dg0XXQsHJgcLXRcNA7M+O2ZqfHZnZDs9PTtkZ3Z9aWY7Pv3wmhISmhIaARcICwsI/ukaAAMAAAAAA+UD5QAXACMALAAAASIHBgcGFRQXFhcWMzI3Njc2NTQnJicmAxQrASI1AzQ7ATIHJyImNDYyFhQGAe6Ecm9BRERBb3KEiXZxQkREQnF1aQIxAwgCQgMBIxIZGSQZGQPkREJxdomEcm9BRERBb3KEinVxQkT9HQICAWICAjEZIxkZIxkAAAAAAwAAAAADsQPkABsAKgAzAAABBgcGBwYHBjcRFBcWFxYXNjc2NzY1ESQXJicmBzMyFhUDFAYrASInAzQ2EyImNDYyFhQGAfVBQTg7LDt/IEc+bF5sbF1tPUj+2KhQQVVvNAQGDAMCJgUBCwYeDxYWHhUVA+QPEg4SDhIpCv6tj3VkST4dHT5JZHWPAVNeNRkSGPwGBP7GAgMFAToEBv5AFR8VFR8VAAAAAgAAAAADsQPkABkALgAAAQYHBgc2BREUFxYXFhc2NzY3NjURJBcmJyYTAQYvASY/ATYyHwEWNjclNjIfARYB9VVVQk+v/tFHPmxebGxdbT1I/tGvT0JVo/7VBASKAwMSAQUBcQEFAgESAgUBEQQD4xMYEhk3YP6sjnVlSD8cHD9IZXWOAVRgNxkSGP62/tkDA48EBBkCAVYCAQHlAQIQBAAAAAACAAAAAAPkA+QAFwAtAAABIgcGBwYVFBcWFxYzMjc2NzY1NCcmJyYTAQYiLwEmPwE2Mh8BFjI3ATYyHwEWAe6Ecm9BQ0NCbnODiXVxQkREQnF1kf6gAQUBowMDFgEFAYUCBQEBQwIFARUEA+NEQnF1iYNzbkJDQ0FvcoSJdXFCRP6j/qUBAagEBR4CAWYBAQENAgIVBAAAAAQAAAAAA68DrQAUACkAPwBDAAABIgcGBwYUFxYXFjI3Njc2NCcmJyYDIicmJyY0NzY3NjIXFhcWFAcGBwYTBQ4BLwEmBg8BBhYfARYyNwE+ASYiFzAfAQH1eGdkOzw8O2Rn8GZkOzw8O2RmeG5eWzY3NzZbXtteWzY3NzZbXmn+9gYSBmAGDwUDBQEGfQUQBgElBQELEBUBAQOtPDtkZ/BnYzs8PDtjZ/BnZDs8/K83NVte215cNTc3NVxe215bNTcCJt0FAQVJBQIGBAcRBoAGBQEhBQ8LBAEBAAABAAAAAAO7AzoAFwAAEy4BPwE+AR8BFjY3ATYWFycWFAcBBiInPQoGBwUHGgzLDCELAh0LHwsNCgr9uQoeCgGzCyEOCw0HCZMJAQoBvgkCCg0LHQv9sQsKAAAAAAIAAAAAA+UD5gAXACwAAAEiBwYHBhUUFxYXFjMyNzY3NjU0JyYnJhMHBi8BJicmNRM0NjsBMhYVExceAQHvhHJvQUNDQm5zg4l1cUJEREJxdVcQAwT6AwIEEAMCKwIDDsUCAQPlREJxdYmDc25CQ0NBb3KEiXVxQkT9VhwEAncCAgMGAXoCAwMC/q2FAgQAAAQAAAAAA68DrQADABgALQAzAAABMB8BAyIHBgcGFBcWFxYyNzY3NjQnJicmAyInJicmNDc2NzYyFxYXFhQHBgcGAyMVMzUjAuUBAfJ4Z2Q7PDw7ZGfwZmQ7PDw7ZGZ4bl5bNjc3Nlte215bNjc3NltemyT92QKDAQEBLDw7ZGfwZ2M7PDw7Y2fwZ2Q7PPyvNzVbXtteXDU3NzVcXtteWzU3AjH9JAAAAAMAAAAAA+QD5AAXACcAMAAAASIHBgcGFRQXFhcWMzI3Njc2NTQnJicmAzMyFhUDFAYrASImNQM0NhMiJjQ2MhYUBgHuhHJvQUNDQm5zg4l1cUJEREJxdZ42BAYMAwInAwMMBh8PFhYeFhYD40RCcXWJg3NuQkNDQW9yhIl1cUJE/vYGBf7AAgMDAgFABQb+NhYfFhYfFgAABAAAAAADwAPAAAgAEgAoAD0AAAEyNjQmIgYUFhcjFTMRIxUzNSMDIgcGBwYVFBYXFjMyNzY3NjU0Jy4BAyInJicmNDc2NzYyFxYXFhQHBgcGAfQYISEwISFRjzk5yTorhG5rPT99am+DdmhlPD4+PMyFbV5bNTc3NVte2l5bNTc3NVteAqAiLyIiLyI5Hf7EHBwCsT89a26Ed8w8Pj48ZWh2g29qffyjNzVbXtpeWzU3NzVbXtpeWzU3AAADAAAAAAOoA6gACwAgADUAAAEHJwcXBxc3FzcnNwMiBwYHBhQXFhcWMjc2NzY0JyYnJgMiJyYnJjQ3Njc2MhcWFxYUBwYHBgKOmpocmpocmpocmpq2dmZiOjs7OmJm7GZiOjs7OmJmdmtdWTQ2NjRZXdZdWTQ2NjRZXQKqmpocmpocmpocmpoBGTs6YmbsZmI6Ozs6YmbsZmI6O/zCNjRZXdZdWTQ2NjRZXdZdWTQ2AAMAAAAAA+kD6gAaAC8AMAAAAQYHBiMiJyYnJjQ3Njc2MhcWFxYVFAcGBwEHATI3Njc2NCcmJyYiBwYHBhQXFhcWMwKONUBCR21dWjU3NzVaXdpdWzU2GBcrASM5/eBXS0grKysrSEuuSkkqLCwqSUpXASMrFxg2NVtd2l1aNTc3NVpdbUdCQDX+3jkBGSsrSEuuSkkqLCwqSUquS0grKwAC//8AAAPoA+gAFAAwAAABIgcGBwYQFxYXFiA3Njc2ECcmJyYTFg4BIi8BBwYuATQ/AScmPgEWHwE3Nh4BBg8BAfSIdHFDRERDcXQBEHRxQ0REQ3F0SQoBFBsKoqgKGxMKqKIKARQbCqKoChsUAQqoA+hEQ3F0/vB0cUNERENxdAEQdHFDRP1jChsTCqiiCgEUGwqiqAobFAEKqKIKARQbCqIAAAIAAAAAA+QD5AAXADQAAAEiBwYHBhUUFxYXFjMyNzY3NjU0JyYnJhMUBiMFFxYUDwEGLwEuAT8BNh8BFhQPAQUyFh0BAe6Ecm9BQ0NCbnODiXVxQkREQnF1fwQC/pGDAQEVAwTsAgEC7AQEFAIBhAFwAgMD40RCcXWJg3NuQkNDQW9yhIl1cUJE/fYCAwuVAgQCFAQE0AIFAtEEBBQCBQGVCwMDJwAAAAUAAAAAA9QD0wAjACcANwBHAEgAAAERFAYjISImNREjIiY9ATQ2MyE1NDYzITIWHQEhMhYdARQGIyERIREHIgYVERQWOwEyNjURNCYjISIGFREUFjsBMjY1ETQmKwEDeyYb/XYbJkMJDQ0JAQYZEgEvExkBBgkNDQn9CQJc0QkNDQktCQ0NCf7sCQ0NCS0JDQ0JLQMi/TQbJiYbAswMCiwJDS4SGRkSLg0JLAoM/UwCtGsNCf5NCQ0NCQGzCQ0NCf5NCQ0NCQGzCQ0AAAAAEADGAAEAAAAAAAEABAAAAAEAAAAAAAIABwAEAAEAAAAAAAMABAALAAEAAAAAAAQABAAPAAEAAAAAAAUACwATAAEAAAAAAAYABAAeAAEAAAAAAAoAKwAiAAEAAAAAAAsAEwBNAAMAAQQJAAEACABgAAMAAQQJAAIADgBoAAMAAQQJAAMACAB2AAMAAQQJAAQACAB+AAMAAQQJAAUAFgCGAAMAAQQJAAYACACcAAMAAQQJAAoAVgCkAAMAAQQJAAsAJgD6d2V1aVJlZ3VsYXJ3ZXVpd2V1aVZlcnNpb24gMS4wd2V1aUdlbmVyYXRlZCBieSBzdmcydHRmIGZyb20gRm9udGVsbG8gcHJvamVjdC5odHRwOi8vZm9udGVsbG8uY29tAHcAZQB1AGkAUgBlAGcAdQBsAGEAcgB3AGUAdQBpAHcAZQB1AGkAVgBlAHIAcwBpAG8AbgAgADEALgAwAHcAZQB1AGkARwBlAG4AZQByAGEAdABlAGQAIABiAHkAIABzAHYAZwAyAHQAdABmACAAZgByAG8AbQAgAEYAbwBuAHQAZQBsAGwAbwAgAHAAcgBvAGoAZQBjAHQALgBoAHQAdABwADoALwAvAGYAbwBuAHQAZQBsAGwAbwAuAGMAbwBtAAAAAgAAAAAAAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASAQIBAwEEAQUBBgEHAQgBCQEKAQsBDAENAQ4BDwEQAREBEgETAAZjaXJjbGUIZG93bmxvYWQEaW5mbwxzYWZlX3N1Y2Nlc3MJc2FmZV93YXJuB3N1Y2Nlc3MOc3VjY2Vzcy1jaXJjbGURc3VjY2Vzcy1uby1jaXJjbGUHd2FpdGluZw53YWl0aW5nLWNpcmNsZQR3YXJuC2luZm8tY2lyY2xlBmNhbmNlbAZzZWFyY2gFY2xlYXIEYmFjawZkZWxldGUAAAAA') format('truetype')
122
122
  }
123
+
124
+ .mpx-root-view {
125
+ display: inline
126
+ line-height: normal
127
+ }