@mpxjs/webpack-plugin 2.6.114-alpha.6 → 2.6.114-alpha.7

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 (98) hide show
  1. package/lib/{dependency → dependencies}/AddEntryDependency.js +0 -0
  2. package/lib/dependencies/AppEntryDependency.js +58 -0
  3. package/lib/dependencies/CommonJsAsyncDependency.js +51 -0
  4. package/lib/dependencies/CommonJsVariableDependency.js +81 -0
  5. package/lib/dependencies/DynamicEntryDependency.js +171 -0
  6. package/lib/dependencies/FlagPluginDependency.js +24 -0
  7. package/lib/dependencies/InjectDependency.js +43 -0
  8. package/lib/dependencies/RecordGlobalComponentsDependency.js +50 -0
  9. package/lib/dependencies/RecordIndependentDependency.js +44 -0
  10. package/lib/dependencies/RecordResourceMapDependency.js +62 -0
  11. package/lib/dependencies/RemoveEntryDependency.js +40 -0
  12. package/lib/{dependency → dependencies}/ReplaceDependency.js +19 -2
  13. package/lib/dependencies/ResolveDependency.js +88 -0
  14. package/lib/extractor.js +82 -178
  15. package/lib/file-loader.js +7 -19
  16. package/lib/helpers.js +39 -334
  17. package/lib/independent-loader.js +52 -0
  18. package/lib/index.js +854 -542
  19. package/lib/json-compiler/helper.js +156 -0
  20. package/lib/json-compiler/index.js +242 -451
  21. package/lib/json-compiler/plugin.js +150 -0
  22. package/lib/json-compiler/{theme-loader.js → theme.js} +5 -3
  23. package/lib/loader.js +137 -240
  24. package/lib/native-loader.js +71 -133
  25. package/lib/parser.js +1 -2
  26. package/lib/partial-compile/index.js +35 -0
  27. package/lib/platform/json/wx/index.js +1 -1
  28. package/lib/platform/template/normalize-component-rules.js +2 -3
  29. package/lib/platform/template/wx/index.js +30 -4
  30. package/lib/record-loader.js +11 -0
  31. package/lib/{path-loader.js → resolve-loader.js} +0 -0
  32. package/lib/resolver/AddEnvPlugin.js +4 -3
  33. package/lib/resolver/AddModePlugin.js +4 -3
  34. package/lib/resolver/FixDescriptionInfoPlugin.js +28 -0
  35. package/lib/resolver/PackageEntryPlugin.js +23 -36
  36. package/lib/runtime/base.styl +5 -0
  37. package/lib/runtime/components/web/mpx-image.vue +20 -5
  38. package/lib/runtime/components/web/mpx-movable-view.vue +6 -2
  39. package/lib/runtime/components/web/mpx-swiper.vue +18 -3
  40. package/lib/runtime/i18n.wxs +31 -11
  41. package/lib/runtime/optionProcessor.js +48 -3
  42. package/lib/selector.js +29 -10
  43. package/lib/style-compiler/index.js +15 -23
  44. package/lib/style-compiler/load-postcss-config.js +3 -1
  45. package/lib/style-compiler/plugins/conditional-strip.js +68 -65
  46. package/lib/style-compiler/plugins/rpx.js +43 -37
  47. package/lib/style-compiler/plugins/scope-id.js +79 -72
  48. package/lib/style-compiler/plugins/trans-special.js +25 -18
  49. package/lib/style-compiler/plugins/trim.js +13 -7
  50. package/lib/style-compiler/plugins/vw.js +22 -16
  51. package/lib/template-compiler/compiler.js +95 -197
  52. package/lib/template-compiler/index.js +52 -139
  53. package/lib/template-compiler/trans-dynamic-class-expr.js +18 -13
  54. package/lib/tenon/index.js +1 -3
  55. package/lib/tenon/processScript.js +52 -40
  56. package/lib/url-loader.js +11 -29
  57. package/lib/utils/add-query.js +1 -1
  58. package/lib/utils/const.js +10 -0
  59. package/lib/utils/emit-file.js +10 -0
  60. package/lib/utils/eval-json-js.js +31 -0
  61. package/lib/utils/get-entry-name.js +13 -0
  62. package/lib/utils/get-json-content.js +42 -0
  63. package/lib/utils/is-url-request.js +10 -1
  64. package/lib/utils/match-condition.js +4 -1
  65. package/lib/utils/normalize.js +4 -15
  66. package/lib/utils/parse-request.js +3 -3
  67. package/lib/utils/resolve.js +13 -0
  68. package/lib/utils/set.js +47 -0
  69. package/lib/utils/stringify-loaders-resource.js +25 -0
  70. package/lib/utils/stringify-query.js +4 -0
  71. package/lib/web/processJSON.js +113 -144
  72. package/lib/web/processScript.js +47 -34
  73. package/lib/web/processTemplate.js +57 -40
  74. package/lib/wxml/{wxml-loader.js → loader.js} +21 -62
  75. package/lib/wxs/WxsModuleIdsPlugin.js +29 -0
  76. package/lib/wxs/WxsParserPlugin.js +2 -2
  77. package/lib/wxs/WxsPlugin.js +4 -8
  78. package/lib/wxs/WxsTemplatePlugin.js +46 -92
  79. package/lib/wxs/{wxs-i18n-loader.js → i18n-loader.js} +5 -4
  80. package/lib/wxs/loader.js +142 -0
  81. package/lib/wxs/{wxs-pre-loader.js → pre-loader.js} +20 -5
  82. package/lib/wxss/loader.js +31 -43
  83. package/lib/wxss/localsLoader.js +1 -5
  84. package/lib/wxss/processCss.js +107 -103
  85. package/package.json +18 -20
  86. package/lib/built-in-loader.js +0 -49
  87. package/lib/content-loader.js +0 -13
  88. package/lib/dependency/ChildCompileDependency.js +0 -24
  89. package/lib/dependency/InjectDependency.js +0 -26
  90. package/lib/dependency/RemovedModuleDependency.js +0 -23
  91. package/lib/dependency/ResolveDependency.js +0 -53
  92. package/lib/plugin-loader.js +0 -287
  93. package/lib/staticConfig.js +0 -4
  94. package/lib/utils/get-main-compilation.js +0 -6
  95. package/lib/utils/read-json-for-src.js +0 -34
  96. package/lib/utils/try-require.js +0 -16
  97. package/lib/wxs/wxs-loader.js +0 -117
  98. package/lib/wxss/getImportPrefix.js +0 -30
@@ -1,39 +1,29 @@
1
1
  const path = require('path')
2
2
  const JSON5 = require('json5')
3
3
  const parseRequest = require('./utils/parse-request')
4
- const loaderUtils = require('loader-utils')
5
4
  const config = require('./config')
6
5
  const createHelpers = require('./helpers')
7
- const InjectDependency = require('./dependency/InjectDependency')
8
- const addQuery = require('./utils/add-query')
9
- const mpxJSON = require('./utils/mpx-json')
6
+ const getJSONContent = require('./utils/get-json-content')
10
7
  const async = require('async')
11
- const matchCondition = require('./utils/match-condition')
8
+ const { matchCondition } = require('./utils/match-condition')
12
9
  const fixUsingComponent = require('./utils/fix-using-component')
13
- const getMainCompilation = require('./utils/get-main-compilation')
10
+ const { JSON_JS_EXT } = require('./utils/const')
14
11
 
15
12
  module.exports = function (content) {
16
13
  this.cacheable()
17
14
 
18
- const mainCompilation = getMainCompilation(this._compilation)
19
- const mpx = mainCompilation.__mpx__
15
+ const mpx = this.getMpx()
20
16
  if (!mpx) {
21
17
  return content
22
18
  }
23
19
 
24
20
  const nativeCallback = this.async()
25
-
26
21
  const loaderContext = this
27
22
  const isProduction = this.minimize || process.env.NODE_ENV === 'production'
28
- const options = Object.assign({}, mpx.loaderOptions, loaderUtils.getOptions(this))
29
-
30
23
  const filePath = this.resourcePath
31
-
32
24
  const moduleId = 'm' + mpx.pathHash(filePath)
33
25
  const { resourcePath, queryObj } = parseRequest(this.resource)
34
- const projectRoot = mpx.projectRoot
35
26
  const mode = mpx.mode
36
- const defs = mpx.defs
37
27
  const globalSrcMode = mpx.srcMode
38
28
  const localSrcMode = queryObj.mode
39
29
  const packageName = queryObj.packageRoot || mpx.currentPackageRoot || 'main'
@@ -41,14 +31,12 @@ module.exports = function (content) {
41
31
  const componentsMap = mpx.componentsMap[packageName]
42
32
  const parsed = path.parse(resourcePath)
43
33
  const resourceName = path.join(parsed.dir, parsed.name)
44
- const isApp = !pagesMap[resourcePath] && !componentsMap[resourcePath]
34
+ const isApp = !(pagesMap[resourcePath] || componentsMap[resourcePath])
45
35
  const srcMode = localSrcMode || globalSrcMode
46
- const fs = this._compiler.inputFileSystem
47
36
  const typeExtMap = config[srcMode].typeExtMap
48
37
  const typeResourceMap = {}
49
38
  const autoScope = matchCondition(resourcePath, mpx.autoScopeRules)
50
39
 
51
- const EXT_MPX_JSON = '.json.js'
52
40
  const CSS_LANG_EXT_MAP = {
53
41
  less: '.less',
54
42
  stylus: '.styl',
@@ -56,40 +44,18 @@ module.exports = function (content) {
56
44
  scss: '.scss'
57
45
  }
58
46
 
59
- let useMPXJSON = false
47
+ let useJSONJS = false
60
48
  let cssLang = ''
61
49
  const hasScoped = (queryObj.scoped || autoScope) && mode === 'ali'
62
50
  const hasComment = false
63
51
  const isNative = true
64
52
 
65
- const tryEvalMPXJSON = (callback) => {
66
- const { rawResourcePath } = parseRequest(typeResourceMap['json'])
67
- const _src = rawResourcePath
68
- this.addDependency(_src)
69
- fs.readFile(_src, (err, raw) => {
70
- if (err) {
71
- callback(err)
72
- } else {
73
- try {
74
- const source = raw.toString('utf-8')
75
- const text = mpxJSON.compileMPXJSONText({ source, defs, filePath: _src })
76
- callback(null, text)
77
- } catch (e) {
78
- callback(e)
79
- }
80
- }
81
- })
82
- }
83
-
84
53
  const checkFileExists = (extName, callback) => {
85
- this.resolve(parsed.dir, resourceName + extName, (err, result) => {
86
- err = null
87
- callback(err, result)
88
- })
54
+ this.resolve(parsed.dir, resourceName + extName, callback)
89
55
  }
90
56
 
91
57
  function checkCSSLangFiles (callback) {
92
- const langs = mpx.nativeOptions.cssLangs || ['less', 'stylus', 'scss', 'sass']
58
+ const langs = mpx.nativeConfig.cssLangs || ['less', 'stylus', 'scss', 'sass']
93
59
  const results = []
94
60
  async.eachOf(langs, function (lang, i, callback) {
95
61
  if (!CSS_LANG_EXT_MAP[lang]) {
@@ -99,7 +65,7 @@ module.exports = function (content) {
99
65
  if (!err && result) {
100
66
  results[i] = result
101
67
  }
102
- callback(err)
68
+ callback()
103
69
  })
104
70
  }, function (err) {
105
71
  for (let i = 0; i < langs.length; i++) {
@@ -113,14 +79,13 @@ module.exports = function (content) {
113
79
  })
114
80
  }
115
81
 
116
- function checkMPXJSONFile (callback) {
117
- // checkFileExists(EXT_MPX_JSON, (err, result) => {
118
- checkFileExists(EXT_MPX_JSON, (err, result) => {
82
+ function checkJSONJSFile (callback) {
83
+ checkFileExists(JSON_JS_EXT, (err, result) => {
119
84
  if (!err && result) {
120
85
  typeResourceMap.json = result
121
- useMPXJSON = true
86
+ useJSONJS = true
122
87
  }
123
- callback(err)
88
+ callback()
124
89
  })
125
90
  }
126
91
 
@@ -129,138 +94,111 @@ module.exports = function (content) {
129
94
  (callback) => {
130
95
  async.parallel([
131
96
  checkCSSLangFiles,
132
- checkMPXJSONFile
97
+ checkJSONJSFile
133
98
  ], (err) => {
134
99
  callback(err)
135
100
  })
136
101
  },
137
102
  (callback) => {
138
103
  async.forEachOf(typeExtMap, (ext, key, callback) => {
139
- // 检测到mpxJson或cssLang时跳过对应类型文件检测
140
- if ((key === 'json' && useMPXJSON) || (key === 'styles' && cssLang)) {
104
+ // 检测到jsonjs或cssLang时跳过对应类型文件检测
105
+ if (typeResourceMap[key]) {
141
106
  return callback()
142
107
  }
143
108
  checkFileExists(ext, (err, result) => {
144
109
  if (!err && result) {
145
110
  typeResourceMap[key] = result
146
111
  }
147
- callback(err)
112
+ callback()
148
113
  })
149
114
  }, callback)
150
115
  },
151
116
  (callback) => {
152
- // 对原生写法增强json写法,可以用js来写json,尝试找.json.js文件,找不到用回json的内容
153
- if (useMPXJSON) {
154
- tryEvalMPXJSON(callback)
155
- } else {
156
- if (typeResourceMap['json']) {
157
- // eslint-disable-next-line handle-callback-err
158
- const { rawResourcePath } = parseRequest(typeResourceMap['json'])
159
- fs.readFile(rawResourcePath, (err, raw) => {
160
- if (err) {
161
- callback(err)
162
- } else {
163
- callback(null, raw.toString('utf-8'))
164
- }
165
- })
166
- } else {
167
- callback(null, '{}')
168
- }
169
- }
117
+ getJSONContent({
118
+ src: typeResourceMap.json,
119
+ useJSONJS
120
+ }, this, callback)
170
121
  }, (content, callback) => {
171
- let usingComponents = [].concat(Object.keys(mpx.usingComponents))
122
+ let json
172
123
  try {
173
- let ret = JSON5.parse(content)
174
- if (ret.usingComponents) {
175
- fixUsingComponent(ret.usingComponents, mode)
176
- usingComponents = usingComponents.concat(Object.keys(ret.usingComponents))
177
- }
124
+ json = JSON5.parse(content)
178
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))
179
132
  }
180
133
  const {
181
- getRequireForSrc,
182
- getNamedExportsForSrc
183
- } = createHelpers({
184
- loaderContext,
185
- options,
186
- moduleId,
187
- hasScoped,
188
- hasComment,
189
- usingComponents,
190
- srcMode,
191
- isNative,
192
- projectRoot
193
- })
194
-
195
- const getRequire = (type) => {
196
- const localQuery = Object.assign({}, queryObj)
197
- let src = typeResourceMap[type]
198
- localQuery.resourcePath = resourcePath
199
- if (type !== 'script') {
200
- this.addDependency(src)
201
- }
202
- if (type === 'template' && isApp) {
203
- return ''
204
- }
205
- if (type === 'json' && !useMPXJSON) {
206
- localQuery.__component = true
134
+ getRequire
135
+ } = createHelpers(loaderContext)
136
+
137
+ const getRequireByType = (type) => {
138
+ const src = typeResourceMap[type]
139
+ const part = { src }
140
+ const extraOptions = {
141
+ ...queryObj,
142
+ resourcePath
207
143
  }
208
- src = addQuery(src, localQuery, true)
209
- const partsOpts = { src }
210
144
 
211
- if (type === 'script') {
212
- return getNamedExportsForSrc(type, partsOpts)
145
+ switch (type) {
146
+ case 'template':
147
+ if (isApp) return ''
148
+ Object.assign(extraOptions, {
149
+ hasScoped,
150
+ hasComment,
151
+ isNative,
152
+ moduleId,
153
+ usingComponents
154
+ })
155
+ break
156
+ case 'styles':
157
+ if (cssLang) part.lang = cssLang
158
+ Object.assign(extraOptions, {
159
+ moduleId,
160
+ scoped: hasScoped
161
+ })
162
+ break
163
+ case 'json':
164
+ if (useJSONJS) part.useJSONJS = true
165
+ break
213
166
  }
214
- if (type === 'styles') {
215
- if (cssLang) {
216
- partsOpts.lang = cssLang
217
- }
218
- if (hasScoped) {
219
- return getRequireForSrc(type, partsOpts, 0, true)
220
- }
221
- }
222
- return getRequireForSrc(type, partsOpts)
167
+ return getRequire(type, part, extraOptions)
223
168
  }
224
169
 
225
170
  // 注入模块id及资源路径
226
- let globalInjectCode = `global.currentModuleId = ${JSON.stringify(moduleId)}\n`
171
+ let output = `global.currentModuleId = ${JSON.stringify(moduleId)}\n`
227
172
  if (!isProduction) {
228
- globalInjectCode += `global.currentResource = ${JSON.stringify(filePath)}\n`
173
+ output += `global.currentResource = ${JSON.stringify(filePath)}\n`
229
174
  }
230
175
 
231
176
  // 注入构造函数
232
177
  let ctor = 'App'
178
+ let ctorType = 'app'
233
179
  if (pagesMap[resourcePath]) {
234
- if (mpx.forceUsePageCtor || mode === 'ali') {
180
+ ctorType = 'page'
181
+ if (mpx.forceUsePageCtor || mode === 'ali' || mode === 'swan') {
235
182
  ctor = 'Page'
236
183
  } else {
237
184
  ctor = 'Component'
238
185
  }
239
186
  } else if (componentsMap[resourcePath]) {
240
187
  ctor = 'Component'
188
+ ctorType = 'component'
241
189
  }
242
- globalInjectCode += `global.currentCtor = ${ctor}\n`
243
- globalInjectCode += `global.currentCtorType = ${JSON.stringify(ctor.replace(/^./, (match) => {
190
+ output += `global.currentCtor = ${ctor}\n`
191
+ output += `global.currentCtorType = ${JSON.stringify(ctor.replace(/^./, (match) => {
244
192
  return match.toLowerCase()
245
193
  }))}\n`
194
+ output += `global.currentResourceType = ${JSON.stringify(ctorType)}\n`
246
195
 
247
196
  if (srcMode) {
248
- globalInjectCode += `global.currentSrcMode = ${JSON.stringify(srcMode)}\n`
197
+ output += `global.currentSrcMode = ${JSON.stringify(srcMode)}\n`
249
198
  }
250
199
 
251
- if (!mpx.forceDisableInject) {
252
- const dep = new InjectDependency({
253
- content: globalInjectCode,
254
- index: -3
255
- })
256
- this._module.addDependency(dep)
257
- }
258
-
259
- // 触发webpack global var 注入
260
- let output = 'global.currentModuleId;\n'
261
-
262
200
  for (let type in typeResourceMap) {
263
- output += `/* ${type} */\n${getRequire(type)}\n\n`
201
+ output += `/* ${type} */\n${getRequireByType(type)}\n\n`
264
202
  }
265
203
 
266
204
  callback(null, output)
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
@@ -0,0 +1,35 @@
1
+ const { matchCondition } = require('../utils/match-condition')
2
+ const { parseQuery } = require('loader-utils')
3
+
4
+ class MpxPartialCompilePlugin {
5
+ constructor (condition) {
6
+ this.condition = condition
7
+ }
8
+
9
+ isResolvingPage (obj) {
10
+ // valid query should start with '?'
11
+ const query = obj.query || '?'
12
+ return parseQuery(query).isPage
13
+ }
14
+
15
+ apply (compiler) {
16
+ compiler.resolverFactory.hooks.resolver.intercept({
17
+ factory: (type, hook) => {
18
+ hook.tap('MpxPartialCompilePlugin', (resolver) => {
19
+ resolver.hooks.result.tapAsync({
20
+ name: 'MpxPartialCompilePlugin',
21
+ stage: -100
22
+ }, (obj, resolverContext, callback) => {
23
+ if (this.isResolvingPage(obj) && !matchCondition(obj.path, this.condition)) {
24
+ obj.path = false
25
+ }
26
+ callback(null, obj)
27
+ })
28
+ })
29
+ return hook
30
+ }
31
+ })
32
+ }
33
+ }
34
+
35
+ module.exports = MpxPartialCompilePlugin
@@ -246,7 +246,7 @@ module.exports = function getSpec ({ warn, error }) {
246
246
  jd: deletePath()
247
247
  },
248
248
  {
249
- test: 'navigateToMiniProgramAppIdList|networkTimeout|permission',
249
+ test: 'navigateToMiniProgramAppIdList|networkTimeout',
250
250
  ali: deletePath(),
251
251
  jd: deletePath()
252
252
  },
@@ -4,7 +4,7 @@ const runRules = require('../run-rules')
4
4
  * @desc 针对每一个组件(属性,event,指令等)执行规则判断
5
5
  * @params cfgs [{test: 'camera', props:[], event: []}] 组件配置列表
6
6
  * @params spec ../index.js中公共的spec
7
- */
7
+ */
8
8
  module.exports = function normalizeComponentRules (cfgs, spec) {
9
9
  return cfgs.map((cfg) => {
10
10
  const result = {}
@@ -25,9 +25,8 @@ module.exports = function normalizeComponentRules (cfgs, spec) {
25
25
  data
26
26
  }
27
27
  el.attrsList.forEach((attr) => {
28
- let rAttr = runRules(spec.preAttrs, attr, options)
29
28
  const meta = {}
30
- rAttr = runRules(spec.directive, rAttr, {
29
+ let rAttr = runRules(spec.directive, attr, {
31
30
  ...options,
32
31
  meta
33
32
  })
@@ -265,14 +265,40 @@ module.exports = function getSpec ({ warn, error }) {
265
265
  }
266
266
  }
267
267
  },
268
+ {
269
+ // style样式绑定
270
+ test: /^(style|wx:style)$/,
271
+ web ({ value }, { el }) {
272
+ if (el.isStyleParsed) {
273
+ return false
274
+ }
275
+ let styleBinding = []
276
+ el.isStyleParsed = true
277
+ el.attrsList.map((item, index) => {
278
+ const parsed = parseMustache(item.value)
279
+ if (item.name === 'style') {
280
+ if (parsed.hasBinding || parsed.result.indexOf('rpx') > -1) {
281
+ styleBinding.push(parseMustache(item.value).result)
282
+ } else {
283
+ styleBinding.push(JSON.stringify(item.value))
284
+ }
285
+ } else if (item.name === 'wx:style') {
286
+ styleBinding.push(parseMustache(item.value).result)
287
+ }
288
+ })
289
+ return {
290
+ name: ':style',
291
+ value: `[${styleBinding}] | transRpxStyle`
292
+ }
293
+ }
294
+ },
268
295
  {
269
296
  // 样式类名绑定
270
- test: /^wx:(class|style)$/,
271
- web ({ name, value }) {
272
- const dir = this.test.exec(name)[1]
297
+ test: /^wx:(class)$/,
298
+ web ({ value }) {
273
299
  const parsed = parseMustache(value)
274
300
  return {
275
- name: ':' + dir,
301
+ name: ':class',
276
302
  value: parsed.result
277
303
  }
278
304
  },
@@ -0,0 +1,11 @@
1
+ const parseRequest = require('./utils/parse-request')
2
+ const RecordResourceMapDependency = require('./dependencies/RecordResourceMapDependency')
3
+
4
+ module.exports = function (source) {
5
+ const mpx = this.getMpx()
6
+ const { resourcePath, queryObj } = parseRequest(this.resource)
7
+ const file = mpx.getExtractedFile(this.resource)
8
+ const packageRoot = queryObj.packageRoot || ''
9
+ this._module.addPresentationalDependency(new RecordResourceMapDependency(resourcePath, 'staticResource', file, packageRoot))
10
+ return source
11
+ }
File without changes
@@ -2,7 +2,8 @@ const path = require('path')
2
2
  const stringifyQuery = require('../utils/stringify-query')
3
3
  const parseQuery = require('loader-utils').parseQuery
4
4
  const addInfix = require('../utils/add-infix')
5
- const matchCondition = require('../utils/match-condition')
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
  }
@@ -1,8 +1,9 @@
1
1
  const path = require('path')
2
2
  const stringifyQuery = require('../utils/stringify-query')
3
3
  const parseQuery = require('loader-utils').parseQuery
4
- const matchCondition = require('../utils/match-condition')
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
  }
@@ -0,0 +1,28 @@
1
+ const path = require('path')
2
+
3
+ module.exports = class FixDescriptionInfoPlugin {
4
+ apply (resolver) {
5
+ resolver.hooks.result.tap('FixDescriptionInfoPlugin', (request) => {
6
+ const { path: resourcePath } = request
7
+ const segments = resourcePath.split(path.sep)
8
+ let rootIndex = -1
9
+ for (let i = segments.length - 1; i >= 0; i--) {
10
+ const segment = segments[i]
11
+ if (segment === 'node_modules') {
12
+ rootIndex = segments[i + 1].startsWith('@') ? i + 2 : i + 1
13
+ break
14
+ }
15
+ }
16
+ if (rootIndex !== -1) {
17
+ const descriptionFileRoot = segments.slice(0, rootIndex + 1).join(path.sep)
18
+ const descriptionFilePath = path.join(descriptionFileRoot, 'package.json')
19
+ if (descriptionFilePath !== request.descriptionFilePath) {
20
+ Object.assign(request, {
21
+ descriptionFileRoot,
22
+ descriptionFilePath
23
+ })
24
+ }
25
+ }
26
+ })
27
+ }
28
+ }
@@ -1,55 +1,42 @@
1
1
  const path = require('path')
2
- /**
3
- * @desc 获取小程序npm包资源入口目录
4
- */
5
- const getEntry = (name, miniprogram) => {
6
- return path.join(name, miniprogram)
7
- }
2
+ const toPosix = require('../utils/to-posix')
8
3
 
9
4
  module.exports = class PackageEntryPlugin {
10
- constructor (source, miniNpmPackage, target) {
5
+ constructor (source, miniNpmPackages, target) {
11
6
  this.source = source
12
7
  this.target = target
13
- this.miniNpmPackage = miniNpmPackage
8
+ this.miniNpmPackages = miniNpmPackages
14
9
  }
15
10
 
16
11
  /**
17
12
  * 判断是否需要更改innerRequest
18
13
  * 小程序发布npm包约束: package.json配置miniprogram 或默认 miniprogram_dist目录
19
- * 0. 前提: request中含有package.json中name字段
20
14
  * 1. package.json中配置了miniprogram, 且request中不含miniprogram,尝试拼接
21
- * 2. 用户配置miniNpmPackage说明是小程序npm包,如果package.json中没配置miniprogram字段,则尝试拼接默认miniprogram_dist目录
15
+ * 2. 用户配置miniNpmPackages说明是小程序npm包,如果package.json中没配置miniprogram字段,则尝试拼接默认miniprogram_dist目录
22
16
  */
23
17
  apply (resolver) {
24
18
  const target = resolver.ensureHook(this.target)
25
- resolver.getHook(this.source).tapAsync('PackagePlugin', (request, resolveContext, callback) => {
26
- const innerRequest = request.request || request.path
27
- if (!innerRequest || request.miniprogram) return callback()
19
+ resolver.getHook(this.source).tapAsync('PackageEntryPlugin', (request, resolveContext, callback) => {
20
+ if (request.miniprogram) return callback()
21
+ let { path: resourcePath, descriptionFileData, descriptionFileRoot } = request
22
+ if (request.miniprogram || !descriptionFileData) return callback()
23
+
24
+ let { name, miniprogram } = descriptionFileData
25
+ if (!miniprogram && this.miniNpmPackages.includes(name)) miniprogram = 'miniprogram_dist'
26
+ if (!miniprogram) return callback()
27
+
28
+ let relativePath = path.relative(descriptionFileRoot, resourcePath)
29
+ if (relativePath.startsWith(miniprogram)) return callback()
30
+
31
+ relativePath = path.join(miniprogram, relativePath)
28
32
 
29
- const descriptionFileData = request.descriptionFileData || {}
30
- const { name = '', miniprogram } = descriptionFileData
31
- let newEntry = ''
32
- // request.path和系统环境有关:windows和linux
33
- let normalizedName = path.normalize(name)
34
- if (innerRequest.indexOf(normalizedName) === -1) {
35
- return callback()
36
- }
37
- if (miniprogram) {
38
- newEntry = getEntry(normalizedName, miniprogram)
39
- } else if (this.miniNpmPackage.includes(name)) {
40
- newEntry = getEntry(normalizedName, 'miniprogram_dist')
41
- }
33
+ const obj = Object.assign({}, request, {
34
+ path: path.join(descriptionFileRoot, relativePath),
35
+ relativePath: './' + toPosix(relativePath),
36
+ miniprogram: true
37
+ })
42
38
 
43
- if (newEntry) {
44
- const newRequest = innerRequest.replace(normalizedName, newEntry)
45
- const obj = Object.assign({}, request, {
46
- request: newRequest,
47
- miniprogram: true
48
- })
49
- resolver.doResolve(target, obj, `change request ${innerRequest} to :` + newRequest, resolveContext, callback)
50
- } else {
51
- callback()
52
- }
39
+ resolver.doResolve(target, obj, 'add miniprogram dist: ' + miniprogram, resolveContext, callback)
53
40
  })
54
41
  }
55
42
  }
@@ -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
+ }