@mpxjs/webpack-plugin 2.7.0-beta.2 → 2.7.0-beta.6

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 (48) hide show
  1. package/lib/dependencies/CommonJsVariableDependency.js +2 -7
  2. package/lib/dependencies/DynamicEntryDependency.js +5 -1
  3. package/lib/dependencies/{RecordStaticResourceDependency.js → RecordResourceMapDependency.js} +12 -7
  4. package/lib/dependencies/RemoveEntryDependency.js +40 -0
  5. package/lib/dependencies/ResolveDependency.js +8 -7
  6. package/lib/extractor.js +5 -4
  7. package/lib/file-loader.js +2 -2
  8. package/lib/helpers.js +1 -0
  9. package/lib/index.js +136 -112
  10. package/lib/json-compiler/helper.js +14 -21
  11. package/lib/json-compiler/index.js +67 -51
  12. package/lib/json-compiler/plugin.js +21 -5
  13. package/lib/loader.js +27 -50
  14. package/lib/native-loader.js +28 -65
  15. package/lib/parser.js +1 -2
  16. package/lib/platform/json/wx/index.js +7 -2
  17. package/lib/platform/template/wx/component-config/button.js +3 -3
  18. package/lib/platform/template/wx/component-config/navigator.js +1 -1
  19. package/lib/resolver/AddEnvPlugin.js +3 -2
  20. package/lib/resolver/AddModePlugin.js +3 -2
  21. package/lib/runtime/base.styl +5 -0
  22. package/lib/runtime/components/web/getInnerListeners.js +51 -45
  23. package/lib/runtime/components/web/mpx-keep-alive.vue +4 -1
  24. package/lib/runtime/components/web/mpx-tab-bar-container.vue +2 -2
  25. package/lib/runtime/optionProcessor.js +5 -20
  26. package/lib/runtime/stringify.wxs +3 -3
  27. package/lib/selector.js +3 -6
  28. package/lib/style-compiler/index.js +4 -5
  29. package/lib/template-compiler/bind-this.js +4 -4
  30. package/lib/template-compiler/compiler.js +105 -45
  31. package/lib/template-compiler/index.js +3 -6
  32. package/lib/template-compiler/trans-dynamic-class-expr.js +3 -3
  33. package/lib/utils/const.js +5 -1
  34. package/lib/utils/eval-json-js.js +31 -0
  35. package/lib/utils/get-json-content.js +41 -0
  36. package/lib/utils/resolve.js +13 -0
  37. package/lib/web/processJSON.js +113 -142
  38. package/lib/web/processScript.js +30 -24
  39. package/lib/web/processTemplate.js +56 -40
  40. package/lib/wxs/i18n-loader.js +1 -3
  41. package/lib/wxs/loader.js +6 -26
  42. package/lib/wxs/pre-loader.js +7 -8
  43. package/lib/wxss/processCss.js +44 -44
  44. package/package.json +8 -8
  45. package/lib/built-in-loader.js +0 -49
  46. package/lib/record-loader.js +0 -11
  47. package/lib/utils/get-main-compilation.js +0 -6
  48. package/lib/utils/read-json-for-src.js +0 -34
@@ -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
  }
@@ -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,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') format('truetype')
122
122
  }
123
+
124
+ .mpx-root-view {
125
+ display: inline
126
+ line-height: normal
127
+ }
@@ -1,4 +1,5 @@
1
1
  import { isEmptyObject } from './util'
2
+ const isTouchDevice = 'ontouchstart' in document.documentElement
2
3
 
3
4
  function processModel (listeners, context) {
4
5
  // 该函数只有wx:model的情况下才调用,而且默认e.detail.value有值
@@ -54,58 +55,63 @@ function processTap (listeners, context) {
54
55
  })
55
56
  if (isEmptyObject(listenerMap)) return
56
57
  context.__mpxTapInfo = context.__mpxTapInfo || {}
57
- let events = {
58
- touchstart (e) {
59
- context.__mpxTapInfo.detail = {
60
- x: e.changedTouches[0].pageX,
61
- y: e.changedTouches[0].pageY
62
- }
63
- context.__mpxTapInfo.startTimer = null
64
- context.__mpxTapInfo.needTap = true
65
- context.__mpxTapInfo.hadTouch = true
66
- if (listenerMap.longpress || listenerMap.longtap) {
67
- context.__mpxTapInfo.startTimer = setTimeout(() => {
58
+ let events
59
+ if (isTouchDevice) {
60
+ events = {
61
+ touchstart (e) {
62
+ context.__mpxTapInfo.detail = {
63
+ x: e.changedTouches[0].pageX,
64
+ y: e.changedTouches[0].pageY
65
+ }
66
+ context.__mpxTapInfo.startTimer = null
67
+ context.__mpxTapInfo.needTap = true
68
+ if (listenerMap.longpress || listenerMap.longtap) {
69
+ context.__mpxTapInfo.startTimer = setTimeout(() => {
70
+ context.__mpxTapInfo.needTap = false
71
+ if (listenerMap.longpress) {
72
+ const re = inheritEvent('longpress', e, context.__mpxTapInfo.detail)
73
+ context.$emit('longpress', re)
74
+ }
75
+ if (listenerMap.longtap) {
76
+ const re = inheritEvent('longtap', e, context.__mpxTapInfo.detail)
77
+ context.$emit('longtap', re)
78
+ }
79
+ }, 350)
80
+ }
81
+ },
82
+ touchmove (e) {
83
+ const tapDetailInfo = context.__mpxTapInfo.detail || {}
84
+ const currentPageX = e.changedTouches[0].pageX
85
+ const currentPageY = e.changedTouches[0].pageY
86
+ if (Math.abs(currentPageX - tapDetailInfo.x) > 1 || Math.abs(currentPageY - tapDetailInfo.y) > 1) {
68
87
  context.__mpxTapInfo.needTap = false
69
- if (listenerMap.longpress) {
70
- const re = inheritEvent('longpress', e, context.__mpxTapInfo.detail)
71
- context.$emit('longpress', re)
72
- }
73
- if (listenerMap.longtap) {
74
- const re = inheritEvent('longtap', e, context.__mpxTapInfo.detail)
75
- context.$emit('longtap', re)
76
- }
77
- }, 350)
78
- }
79
- },
80
- touchmove (e) {
81
- const tapDetailInfo = context.__mpxTapInfo.detail || {}
82
- const currentPageX = e.changedTouches[0].pageX
83
- const currentPageY = e.changedTouches[0].pageY
84
- if (Math.abs(currentPageX - tapDetailInfo.x) > 1 || Math.abs(currentPageY - tapDetailInfo.y) > 1) {
85
- context.__mpxTapInfo.needTap = false
88
+ context.__mpxTapInfo.startTimer && clearTimeout(context.__mpxTapInfo.startTimer)
89
+ context.__mpxTapInfo.startTimer = null
90
+ }
91
+ },
92
+ touchend (e) {
86
93
  context.__mpxTapInfo.startTimer && clearTimeout(context.__mpxTapInfo.startTimer)
87
- context.__mpxTapInfo.startTimer = null
88
- }
89
- },
90
- touchend (e) {
91
- context.__mpxTapInfo.startTimer && clearTimeout(context.__mpxTapInfo.startTimer)
92
- if (listenerMap.tap && context.__mpxTapInfo.needTap) {
93
- const re = inheritEvent('tap', e, context.__mpxTapInfo.detail)
94
- context.$emit('tap', re)
94
+ if (listenerMap.tap && context.__mpxTapInfo.needTap) {
95
+ const re = inheritEvent('tap', e, context.__mpxTapInfo.detail)
96
+ context.$emit('tap', re)
97
+ }
95
98
  }
96
- },
97
- click (e) {
98
- if (listenerMap.tap && !context.__mpxTapInfo.hadTouch) {
99
- context.__mpxTapInfo.detail = {
100
- x: e.pageX,
101
- y: e.pageY
99
+ }
100
+ } else {
101
+ events = {
102
+ click (e) {
103
+ if (listenerMap.tap) {
104
+ context.__mpxTapInfo.detail = {
105
+ x: e.pageX,
106
+ y: e.pageY
107
+ }
108
+ const re = inheritEvent('tap', e, context.__mpxTapInfo.detail)
109
+ context.$emit('tap', re)
102
110
  }
103
- const re = inheritEvent('tap', e, context.__mpxTapInfo.detail)
104
- context.$emit('tap', re)
105
111
  }
106
- context.__mpxTapInfo.hadTouch = false
107
112
  }
108
113
  }
114
+
109
115
  mergeListeners(listeners, events, {
110
116
  force: true
111
117
  })
@@ -1,5 +1,6 @@
1
1
  <script>
2
2
  import { inBrowser } from '../../../utils/env'
3
+
3
4
  function isDef (v) {
4
5
  return v !== undefined && v !== null
5
6
  }
@@ -30,7 +31,7 @@
30
31
 
31
32
  function getVnodeKey (vnode) {
32
33
  if (vnode && vnode.componentOptions) {
33
- return vnode.key || vnode.componentOptions.Ctor.cid + (vnode.componentOptions.tag ? ('::' + (vnode.componentOptions.tag)) : '')
34
+ return vnode.componentOptions.Ctor.cid + (vnode.componentOptions.tag ? ('::' + (vnode.componentOptions.tag)) : '')
34
35
  }
35
36
  }
36
37
 
@@ -73,6 +74,8 @@
73
74
  const current = stack[i - 1]
74
75
  if (current.vnode && current.vnodeKey === vnodeKey && current.vnode.componentInstance) {
75
76
  vnode.componentInstance = current.vnode.componentInstance
77
+ // 避免组件实例复用但是vnode.key不一致带来的bad case
78
+ vnode.key = current.vnode.key
76
79
  break
77
80
  }
78
81
  }
@@ -15,7 +15,7 @@
15
15
  'mpx-tab-bar': tabBarPagesMap['mpx-tab-bar']
16
16
  }
17
17
  tabBar.list.forEach(({ pagePath }) => {
18
- const name = pagePath.replace('/', '-')
18
+ const name = pagePath.replace(/\//g, '-')
19
19
  const page = tabBarPagesMap[pagePath]
20
20
  if (page) {
21
21
  components[name] = page
@@ -39,7 +39,7 @@
39
39
  currentComponent () {
40
40
  const index = this.currentIndex
41
41
  const tabItem = tabBar.list[index]
42
- return tabItem.pagePath.replace('/', '-')
42
+ return tabItem.pagePath.replace(/\//g, '-')
43
43
  }
44
44
  },
45
45
  watch: {
@@ -4,7 +4,7 @@ export default function processOption (
4
4
  option,
5
5
  ctorType,
6
6
  firstPage,
7
- componentId,
7
+ outputPath,
8
8
  pageConfig,
9
9
  pagesMap,
10
10
  componentsMap,
@@ -25,23 +25,6 @@ export default function processOption (
25
25
  }
26
26
  }
27
27
 
28
- // 注册v-ex-classes自定义指令处理externalClasses
29
- Vue.directive('ex-classes', (el, binding, vnode) => {
30
- const context = vnode.context
31
- if (context) {
32
- const externalClasses = context.$options.externalClasses || []
33
- const classList = el.classList
34
- binding.value.forEach((className) => {
35
- const actualExternalClassNames = context.$attrs[className]
36
- if (externalClasses.indexOf(className) !== -1 && actualExternalClassNames) {
37
- classList.remove(className)
38
- actualExternalClassNames.split(/\s+/).forEach((actualExternalClassName) => {
39
- if (actualExternalClassName) classList.add(actualExternalClassName)
40
- })
41
- }
42
- })
43
- }
44
- })
45
28
  Vue.directive('animation', (el, binding) => {
46
29
  const newActions = binding && binding.value && binding.value.actions
47
30
  if (el.actions === newActions) {
@@ -121,7 +104,9 @@ export default function processOption (
121
104
  redirect: '/' + firstPage
122
105
  })
123
106
  }
107
+ const webRouteConfig = global.__mpx.config.webRouteConfig
124
108
  global.__mpxRouter = option.router = new VueRouter({
109
+ ...webRouteConfig,
125
110
  routes: routes
126
111
  })
127
112
  global.__mpxRouter.stack = []
@@ -354,8 +339,8 @@ registered in parent context!`)
354
339
  option.mixins = [mixin]
355
340
  }
356
341
 
357
- if (componentId) {
358
- option.componentPath = '/' + componentId
342
+ if (outputPath) {
343
+ option.componentPath = '/' + outputPath
359
344
  }
360
345
 
361
346
  return option
@@ -93,7 +93,7 @@ function isDef (v) {
93
93
  return v !== undefined && v !== null
94
94
  }
95
95
 
96
- function stringifyClass (value) {
96
+ function stringifyDynamicClass (value) {
97
97
  if (!value) return ''
98
98
  if (likeArray(value)) {
99
99
  return stringifyArray(value)
@@ -111,7 +111,7 @@ function stringifyArray (value) {
111
111
  var res = ''
112
112
  var stringified
113
113
  for (var i = 0; i < value.length; i++) {
114
- if (isDef(stringified = stringifyClass(value[i])) && stringified !== '') {
114
+ if (isDef(stringified = stringifyDynamicClass(value[i])) && stringified !== '') {
115
115
  if (res) res += ' '
116
116
  res += stringified
117
117
  }
@@ -207,7 +207,7 @@ module.exports = {
207
207
  if (typeof staticClass !== 'string') {
208
208
  return console.log('Template attr class must be a string!')
209
209
  }
210
- return concat(staticClass, stringifyClass(dynamicClass))
210
+ return concat(staticClass, stringifyDynamicClass(dynamicClass))
211
211
  },
212
212
  stringifyStyle: function (staticStyle, dynamicStyle) {
213
213
  var normalizedDynamicStyle = normalizeDynamicStyle(dynamicStyle)
package/lib/selector.js CHANGED
@@ -13,20 +13,17 @@ module.exports = function (content) {
13
13
  const index = queryObj.index || 0
14
14
  const mode = mpx.mode
15
15
  const env = mpx.env
16
- const defs = mpx.defs
17
16
  const filePath = this.resourcePath
18
17
  const parts = parseComponent(content, {
19
18
  filePath,
20
19
  needMap: this.sourceMap,
21
20
  mode,
22
- defs,
23
21
  env
24
22
  })
25
- let part = parts[type] || {}
23
+ let part = parts[type]
26
24
  if (Array.isArray(part)) {
27
- part = part[index] || {
28
- content: ''
29
- }
25
+ part = part[index]
30
26
  }
27
+ part = part || { content: '' }
31
28
  this.callback(null, part.content, part.map)
32
29
  }
@@ -1,5 +1,6 @@
1
1
  const postcss = require('postcss')
2
2
  const loadPostcssConfig = require('./load-postcss-config')
3
+ const { MPX_ROOT_VIEW, MPX_APP_MODULE_ID } = require('../utils/const')
3
4
  const trim = require('./plugins/trim')
4
5
  const rpx = require('./plugins/rpx')
5
6
  const vw = require('./plugins/vw')
@@ -15,12 +16,10 @@ module.exports = function (css, map) {
15
16
  const { resourcePath, queryObj } = parseRequest(this.resource)
16
17
  const id = queryObj.moduleId || queryObj.mid
17
18
  const mpx = this.getMpx()
19
+ const appInfo = mpx.appInfo
18
20
  const defs = mpx.defs
19
21
  const mode = mpx.mode
20
- const packageName = queryObj.packageRoot || mpx.currentPackageRoot || 'main'
21
- const componentsMap = mpx.componentsMap[packageName]
22
- const pagesMap = mpx.pagesMap
23
- const isApp = !(pagesMap[resourcePath] || componentsMap[resourcePath])
22
+ const isApp = resourcePath === appInfo.resourcePath
24
23
  const transRpxRulesRaw = mpx.transRpxRules
25
24
  const transRpxRules = transRpxRulesRaw ? (Array.isArray(transRpxRulesRaw) ? transRpxRulesRaw : [transRpxRulesRaw]) : []
26
25
 
@@ -85,7 +84,7 @@ module.exports = function (css, map) {
85
84
  .then(result => {
86
85
  // ali环境添加全局样式抹平root差异
87
86
  if (mode === 'ali' && isApp) {
88
- result.css += '\n.mpx-root-view { display: inline; line-height: normal; }\n'
87
+ result.css += `\n.${MPX_ROOT_VIEW} { display: initial }\n.${MPX_APP_MODULE_ID} { line-height: normal }`
89
88
  }
90
89
  if (result.messages) {
91
90
  result.messages.forEach(({ type, file }) => {
@@ -1,7 +1,7 @@
1
- const babylon = require('babylon')
2
- const traverse = require('babel-traverse').default
3
- const t = require('babel-types')
4
- const generate = require('babel-generator').default
1
+ const babylon = require('@babel/parser')
2
+ const traverse = require('@babel/traverse').default
3
+ const t = require('@babel/types')
4
+ const generate = require('@babel/generator').default
5
5
 
6
6
  let names = 'Infinity,undefined,NaN,isFinite,isNaN,' +
7
7
  'parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,' +