@mpxjs/webpack-plugin 2.6.103 → 2.7.0-alpha.0

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 (58) hide show
  1. package/lib/dependencies/AppEntryDependency.js +56 -0
  2. package/lib/dependencies/CommonJsVariableDependency.js +74 -0
  3. package/lib/dependencies/DynamicEntryDependency.js +127 -0
  4. package/lib/dependencies/FlagPluginDependency.js +23 -0
  5. package/lib/dependencies/InjectDependency.js +43 -0
  6. package/lib/dependencies/RecordGlobalComponentsDependency.js +50 -0
  7. package/lib/dependencies/RecordStaticResourceDependency.js +47 -0
  8. package/lib/{dependency → dependencies}/ReplaceDependency.js +19 -2
  9. package/lib/dependencies/ResolveDependency.js +83 -0
  10. package/lib/extractor.js +72 -179
  11. package/lib/file-loader.js +7 -19
  12. package/lib/helpers.js +41 -331
  13. package/lib/index.js +475 -365
  14. package/lib/json-compiler/helper.js +152 -0
  15. package/lib/json-compiler/index.js +148 -407
  16. package/lib/json-compiler/plugin.js +134 -0
  17. package/lib/json-compiler/{theme-loader.js → theme.js} +5 -3
  18. package/lib/loader.js +78 -177
  19. package/lib/native-loader.js +40 -70
  20. package/lib/record-loader.js +11 -0
  21. package/lib/{path-loader.js → resolve-loader.js} +0 -0
  22. package/lib/runtime/i18n.wxs +3 -3
  23. package/lib/selector.js +8 -7
  24. package/lib/style-compiler/index.js +14 -15
  25. package/lib/template-compiler/compiler.js +16 -153
  26. package/lib/template-compiler/index.js +46 -132
  27. package/lib/url-loader.js +11 -29
  28. package/lib/utils/add-query.js +1 -1
  29. package/lib/utils/const.js +5 -0
  30. package/lib/utils/emit-file.js +10 -0
  31. package/lib/utils/get-entry-name.js +13 -0
  32. package/lib/utils/is-url-request.js +10 -1
  33. package/lib/utils/normalize.js +0 -13
  34. package/lib/utils/parse-request.js +3 -3
  35. package/lib/utils/set.js +47 -0
  36. package/lib/utils/stringify-loaders-resource.js +25 -0
  37. package/lib/utils/stringify-query.js +4 -0
  38. package/lib/web/processScript.js +3 -3
  39. package/lib/web/processTemplate.js +2 -0
  40. package/lib/wxml/{wxml-loader.js → loader.js} +24 -60
  41. package/lib/wxs/WxsModuleIdsPlugin.js +32 -0
  42. package/lib/wxs/WxsParserPlugin.js +2 -2
  43. package/lib/wxs/WxsPlugin.js +4 -8
  44. package/lib/wxs/WxsTemplatePlugin.js +46 -92
  45. package/lib/wxs/{wxs-i18n-loader.js → i18n-loader.js} +0 -0
  46. package/lib/wxs/{wxs-loader.js → loader.js} +33 -38
  47. package/lib/wxs/{wxs-pre-loader.js → pre-loader.js} +0 -0
  48. package/lib/wxss/loader.js +31 -43
  49. package/lib/wxss/localsLoader.js +1 -5
  50. package/package.json +4 -8
  51. package/lib/content-loader.js +0 -13
  52. package/lib/dependency/ChildCompileDependency.js +0 -24
  53. package/lib/dependency/InjectDependency.js +0 -26
  54. package/lib/dependency/RemovedModuleDependency.js +0 -23
  55. package/lib/dependency/ResolveDependency.js +0 -49
  56. package/lib/plugin-loader.js +0 -287
  57. package/lib/utils/try-require.js +0 -16
  58. package/lib/wxss/getImportPrefix.js +0 -30
@@ -1,19 +1,14 @@
1
1
  const compiler = require('./compiler')
2
- const loaderUtils = require('loader-utils')
3
2
  const bindThis = require('./bind-this').transform
4
- const InjectDependency = require('../dependency/InjectDependency')
5
3
  const parseRequest = require('../utils/parse-request')
6
- const getMainCompilation = require('../utils/get-main-compilation')
7
4
  const matchCondition = require('../utils/match-condition')
8
- const path = require('path')
5
+ const loaderUtils = require('loader-utils')
9
6
 
10
7
  module.exports = function (raw) {
11
8
  this.cacheable()
12
- const options = loaderUtils.getOptions(this) || {}
13
9
  const { resourcePath, queryObj } = parseRequest(this.resource)
14
- const compilation = this._compilation
15
- const mainCompilation = getMainCompilation(compilation)
16
- const mpx = mainCompilation.__mpx__
10
+ const mpx = this.getMpx()
11
+ const root = mpx.projectRoot
17
12
  const mode = mpx.mode
18
13
  const env = mpx.env
19
14
  const defs = mpx.defs
@@ -25,6 +20,11 @@ module.exports = function (raw) {
25
20
  const packageName = queryObj.packageRoot || mpx.currentPackageRoot || 'main'
26
21
  const componentsMap = mpx.componentsMap[packageName]
27
22
  const wxsContentMap = mpx.wxsContentMap
23
+ const usingComponents = queryObj.usingComponents || []
24
+ const hasComment = queryObj.hasComment
25
+ const isNative = queryObj.isNative
26
+ const hasScoped = queryObj.hasScoped
27
+ const moduleId = queryObj.moduleId
28
28
 
29
29
  const warn = (msg) => {
30
30
  this.emitWarning(
@@ -41,10 +41,9 @@ module.exports = function (raw) {
41
41
  const parsed = compiler.parse(raw, {
42
42
  warn,
43
43
  error,
44
- usingComponents: options.usingComponents,
45
- hasComment: options.hasComment,
46
- isNative: options.isNative,
47
- basename: path.basename(resourcePath),
44
+ usingComponents,
45
+ hasComment,
46
+ isNative,
48
47
  isComponent: !!componentsMap[resourcePath],
49
48
  mode,
50
49
  env,
@@ -52,16 +51,14 @@ module.exports = function (raw) {
52
51
  defs,
53
52
  decodeHTMLText,
54
53
  externalClasses,
55
- hasScoped: options.hasScoped,
56
- moduleId: options.moduleId,
54
+ hasScoped,
55
+ moduleId,
57
56
  filePath: this.resourcePath,
58
57
  i18n,
59
58
  checkUsingComponents: mpx.checkUsingComponents,
60
59
  globalComponents: Object.keys(mpx.usingComponents),
61
- // deprecated option
62
- globalMpxAttrsFilter: mpx.globalMpxAttrsFilter,
63
60
  forceProxyEvent: matchCondition(this.resourcePath, mpx.forceProxyEventRules),
64
- hasVirtualHost: matchCondition(resourcePath, mpx.autoVirtualHostRules)
61
+ hasVirtualHost: matchCondition(this.resourcePath, mpx.autoVirtualHostRules)
65
62
  })
66
63
 
67
64
  let ast = parsed.root
@@ -73,28 +70,38 @@ module.exports = function (raw) {
73
70
  }
74
71
  }
75
72
 
73
+ let resultSource = ''
74
+
75
+ for (let module in meta.wxsModuleMap) {
76
+ const src = loaderUtils.urlToRequest(meta.wxsModuleMap[module], root)
77
+ resultSource += `var ${module} = require(${loaderUtils.stringifyRequest(this, src)});\n`
78
+ }
79
+
76
80
  let result = compiler.serialize(ast)
77
81
 
78
- if (options.isNative || mpx.forceDisableInject) {
82
+ if (isNative) {
79
83
  return result
80
84
  }
81
85
 
82
- const rawCode = `global.currentInject = {
83
- moduleId: ${JSON.stringify(options.moduleId)},
84
- render: function () {
85
- ${compiler.genNode(ast)}this._r();
86
- }
86
+ const rawCode = `
87
+ global.currentInject = {
88
+ moduleId: ${JSON.stringify(moduleId)},
89
+ render: function () {
90
+ ${compiler.genNode(ast)}
91
+ this._r();
92
+ }
87
93
  };\n`
88
94
 
89
- let renderResult
95
+ let bindResult
90
96
 
91
97
  try {
92
- renderResult = bindThis(rawCode, {
98
+ bindResult = bindThis(rawCode, {
93
99
  needCollect: true,
94
100
  ignoreMap: meta.wxsModuleMap
95
101
  })
96
102
  } catch (e) {
97
- error(`Invalid render function generated by the template, please check!\n
103
+ error(`
104
+ Invalid render function generated by the template, please check!\n
98
105
  Template result:
99
106
  ${result}\n
100
107
  Error code:
@@ -104,123 +111,30 @@ ${e.stack}`)
104
111
  return result
105
112
  }
106
113
 
107
- // todo 此处在loader中往其他模块addDep更加危险,考虑修改为通过抽取后的空模块的module.exports来传递信息
108
- let globalInjectCode = renderResult.code + '\n'
114
+ resultSource += bindResult.code + '\n'
109
115
 
110
- if ((mode === 'tt' || mode === 'swan') && renderResult.propKeys) {
111
- globalInjectCode += `global.currentInject.propKeys = ${JSON.stringify(renderResult.propKeys)};\n`
116
+ if ((mode === 'tt' || mode === 'swan') && bindResult.propKeys) {
117
+ resultSource += `global.currentInject.propKeys = ${JSON.stringify(bindResult.propKeys)};\n`
112
118
  }
113
119
 
114
120
  if (meta.computed) {
115
- globalInjectCode += bindThis(`global.currentInject.injectComputed = {
121
+ resultSource += bindThis(`
122
+ global.currentInject.injectComputed = {
116
123
  ${meta.computed.join(',')}
117
- };`).code + '\n'
124
+ };`).code + '\n'
118
125
  }
119
126
 
120
127
  if (meta.refs) {
121
- globalInjectCode += `global.currentInject.getRefsData = function () {
128
+ resultSource += `
129
+ global.currentInject.getRefsData = function () {
122
130
  return ${JSON.stringify(meta.refs)};
123
- };\n`
124
- }
125
-
126
- if (meta.options) {
127
- globalInjectCode += bindThis(`global.currentInject.injectOptions = ${JSON.stringify(meta.options)};`).code + '\n'
131
+ };\n`
128
132
  }
129
133
 
130
- const issuer = this._module.issuer
131
- const parser = issuer.parser
132
-
133
- // 同步issuer的dependencies,确保watch中issuer rebuild时template也进行rebuild,使该loader中往issuer中注入的依赖持续有效
134
- issuer.buildInfo.fileDependencies.forEach((dep) => {
135
- this.addDependency(dep)
136
- })
137
- issuer.buildInfo.contextDependencies.forEach((dep) => {
138
- this.addContextDependency(dep)
139
- })
140
-
141
- // 删除issuer中上次注入的dependencies,避免issuer本身不需要更新时上次的注入代码残留
142
- issuer.dependencies = issuer.dependencies.filter((dep) => {
143
- return !dep.templateInject
144
- })
145
-
146
- const dep = new InjectDependency({
147
- content: globalInjectCode,
148
- index: -2
134
+ this.emitFile(resourcePath, '', undefined, {
135
+ skipEmit: true,
136
+ extractedResultSource: resultSource
149
137
  })
150
138
 
151
- dep.templateInject = true
152
- issuer.addDependency(dep)
153
-
154
- let isSync = true
155
-
156
- const iterationOfArrayCallback = (arr, fn) => {
157
- for (let index = 0; index < arr.length; index++) {
158
- fn(arr[index])
159
- }
160
- }
161
-
162
- const dependencies = new Map()
163
-
164
- const addDependency = dep => {
165
- const resourceIdent = dep.getResourceIdentifier()
166
- if (resourceIdent) {
167
- const factory = compilation.dependencyFactories.get(dep.constructor)
168
- if (factory === undefined) {
169
- throw new Error(`No module factory available for dependency type: ${dep.constructor.name}`)
170
- }
171
- let innerMap = dependencies.get(factory)
172
- if (innerMap === undefined) {
173
- dependencies.set(factory, (innerMap = new Map()))
174
- }
175
- let list = innerMap.get(resourceIdent)
176
- if (list === undefined) innerMap.set(resourceIdent, (list = []))
177
- list.push(dep)
178
- }
179
- }
180
-
181
- for (let module in meta.wxsModuleMap) {
182
- isSync = false
183
- const src = loaderUtils.urlToRequest(meta.wxsModuleMap[module], options.root)
184
- // 编译render函数只在mpx文件中运行,此处issuer的context一定等同于当前loader的context
185
- const expression = `require(${loaderUtils.stringifyRequest(this, src)})`
186
- const deps = []
187
- parser.parse(expression, {
188
- current: {
189
- addDependency: dep => {
190
- dep.userRequest = module
191
- deps.push(dep)
192
- }
193
- },
194
- module: issuer
195
- })
196
- issuer.addVariable(module, expression, deps)
197
- iterationOfArrayCallback(deps, addDependency)
198
- }
199
-
200
- if (isSync) {
201
- return result
202
- } else {
203
- const callback = this.async()
204
-
205
- const sortedDependencies = []
206
- for (const pair1 of dependencies) {
207
- for (const pair2 of pair1[1]) {
208
- sortedDependencies.push({
209
- factory: pair1[0],
210
- dependencies: pair2[1]
211
- })
212
- }
213
- }
214
-
215
- compilation.addModuleDependencies(
216
- issuer,
217
- sortedDependencies,
218
- compilation.bail,
219
- null,
220
- true,
221
- () => {
222
- callback(null, result)
223
- }
224
- )
225
- }
139
+ return result
226
140
  }
package/lib/url-loader.js CHANGED
@@ -1,51 +1,33 @@
1
1
  const loaderUtils = require('loader-utils')
2
2
  const mime = require('mime')
3
+ const parseRequest = require('./utils/parse-request')
3
4
  const getOptions = loaderUtils.getOptions
4
- const parseQuery = loaderUtils.parseQuery
5
5
 
6
6
  function isStyleRequest (request) {
7
- let elements = request.replace(/^-?!+/, '').replace(/!!+/g, '!').split('!')
8
- elements.pop()
9
- for (let i = 0; i < elements.length; i++) {
10
- let element = elements[i]
11
- let queryString = '?'
12
- let loaderString = element
13
- let idx = element.indexOf('?')
14
- if (idx >= 0) {
15
- queryString = element.substr(idx)
16
- loaderString = element.substr(0, idx)
17
- }
18
- if (/css-loader/.test(loaderString)) {
19
- return true
20
- }
21
- if (/content-loader/.test(loaderString)) {
22
- let query = parseQuery(queryString)
23
- if (query.type === 'styles') {
24
- return true
25
- }
26
- }
27
- }
7
+ const { loaderString, queryObj } = parseRequest(request)
8
+ if (queryObj.type === 'styles') return true
9
+ if (/(css-loader|wxss\/loader)/.test(loaderString)) return true
28
10
  return false
29
11
  }
30
12
 
31
13
  module.exports = function (src) {
32
14
  let transBase64 = false
33
15
  const options = Object.assign({}, getOptions(this))
34
- const filePath = this.resourcePath
35
- const mimetype = options.mimetype || mime.getType(filePath)
36
- const issuer = this._module.issuer
16
+ const { resourcePath, queryObj } = parseRequest(this.resource)
17
+ const mimetype = options.mimetype || mime.getType(resourcePath)
18
+ const moduleGraph = this._compilation.moduleGraph
19
+ const issuer = moduleGraph.getIssuer(this._module)
37
20
  const publicPathScope = options.publicPathScope === 'all' ? 'all' : 'styleOnly'
38
- const queryOption = parseQuery(this.resourceQuery || '?')
39
21
  const limit = options.limit
40
- const useLocal = !limit || src.length < limit || queryOption.useLocal
41
- const isStyle = (issuer && issuer.request && isStyleRequest(issuer.request)) || queryOption.isStyle
22
+ const useLocal = !limit || src.length < limit || queryObj.useLocal
23
+ const isStyle = (issuer && issuer.request && isStyleRequest(issuer.request)) || queryObj.isStyle
42
24
 
43
25
  if (isStyle) {
44
26
  if (options.publicPath) {
45
27
  if (useLocal) {
46
28
  transBase64 = true
47
29
  }
48
- if (queryOption.fallback) {
30
+ if (queryObj.fallback) {
49
31
  transBase64 = false
50
32
  }
51
33
  } else {
@@ -3,7 +3,7 @@ const stringifyQuery = require('./stringify-query')
3
3
  const type = require('./type')
4
4
 
5
5
  // 默认为非强行覆盖原query,如需强行覆盖传递force为true
6
- module.exports = function (request, data = {}, force, removeKeys) {
6
+ module.exports = function addQuery (request, data = {}, force, removeKeys) {
7
7
  const { rawResourcePath: resourcePath, loaderString, queryObj: queryObjRaw } = parseRequest(request)
8
8
  const queryObj = Object.assign({}, queryObjRaw)
9
9
  if (force) {
@@ -0,0 +1,5 @@
1
+ module.exports = {
2
+ MPX_PROCESSED_FLAG: 'mpx_processed',
3
+ MPX_DISABLE_EXTRACTOR_CACHE: 'mpx_disable_extractor_cache',
4
+ DEFAULT_RESULT_SOURCE: ''
5
+ }
@@ -0,0 +1,10 @@
1
+ const { RawSource } = require('webpack').sources
2
+
3
+ module.exports = (module, name, content, sourceMap, assetInfo) => {
4
+ if (!module.buildInfo.assets) {
5
+ module.buildInfo.assets = Object.create(null)
6
+ module.buildInfo.assetsInfo = new Map()
7
+ }
8
+ module.buildInfo.assets[name] = new RawSource(content)
9
+ module.buildInfo.assetsInfo.set(name, assetInfo)
10
+ }
@@ -0,0 +1,13 @@
1
+ module.exports = function (loaderContext) {
2
+ const compilation = loaderContext._compilation
3
+ const moduleGraph = compilation.moduleGraph
4
+ let entryName = ''
5
+ for (const [name, { dependencies }] of compilation.entries) {
6
+ const entryModule = moduleGraph.getModule(dependencies[0])
7
+ if (entryModule.resource === loaderContext.resource) {
8
+ entryName = name
9
+ break
10
+ }
11
+ }
12
+ return entryName
13
+ }
@@ -1,7 +1,7 @@
1
1
  const isUrlRequestRaw = require('loader-utils').isUrlRequest
2
2
  const tagRE = /\{\{((?:.|\n|\r)+?)\}\}(?!})/
3
3
 
4
- module.exports = function isUrlRequest (url, root) {
4
+ module.exports = function isUrlRequest (url, root, externals) {
5
5
  // 对于非字符串或空字符串url直接返回false
6
6
  if (!url || typeof url !== 'string') return false
7
7
  // 对于@开头且后续字符串为合法标识符的情况也返回false,识别为theme变量
@@ -9,5 +9,14 @@ module.exports = function isUrlRequest (url, root) {
9
9
  if (/^.+:\/\//.test(url)) return false
10
10
  // 对于url中存在Mustache插值的情况也返回false
11
11
  if (tagRE.test(url)) return false
12
+ // url存在于externals中也返回false
13
+ if (externals && externals.some((external) => {
14
+ if (typeof external === 'string') {
15
+ return external === url
16
+ } else if (external instanceof RegExp) {
17
+ return external.test(url)
18
+ }
19
+ return false
20
+ })) return false
12
21
  return isUrlRequestRaw(url, root)
13
22
  }
@@ -1,16 +1,3 @@
1
- const fs = require('fs')
2
1
  const path = require('path')
3
2
 
4
3
  exports.lib = file => path.resolve(__dirname, '../', file)
5
-
6
- exports.dep = dep => {
7
- if (
8
- fs.existsSync(path.resolve(__dirname, '../../node_modules', dep))
9
- ) {
10
- // npm 2 or npm linked
11
- return '@mpxjs/webpack-plugin/node_modules/' + dep
12
- } else {
13
- // npm 3
14
- return dep
15
- }
16
- }
@@ -4,7 +4,7 @@ const path = require('path')
4
4
 
5
5
  function genQueryObj (result) {
6
6
  // 避免外部修改queryObj影响缓存
7
- result.queryObj = parseQuery(result.resourceQuery)
7
+ result.queryObj = parseQuery(result.resourceQuery || '?')
8
8
  return result
9
9
  }
10
10
 
@@ -16,13 +16,13 @@ module.exports = function parseRequest (request) {
16
16
  let resource = elements.pop()
17
17
  let loaderString = elements.join('!')
18
18
  let resourcePath = resource
19
- let resourceQuery = '?'
19
+ let resourceQuery = ''
20
20
  const queryIndex = resource.indexOf('?')
21
21
  if (queryIndex >= 0) {
22
22
  resourcePath = resource.slice(0, queryIndex)
23
23
  resourceQuery = resource.slice(queryIndex)
24
24
  }
25
- const queryObj = parseQuery(resourceQuery)
25
+ const queryObj = parseQuery(resourceQuery || '?')
26
26
  const rawResourcePath = resourcePath
27
27
  if (queryObj.resourcePath) {
28
28
  resourcePath = queryObj.resourcePath
@@ -0,0 +1,47 @@
1
+ module.exports = {
2
+ every (set, fn) {
3
+ for (const item of set) {
4
+ if (!fn(item)) return false
5
+ }
6
+ return true
7
+ },
8
+ has (set, fn) {
9
+ for (const item of set) {
10
+ if (fn(item)) return true
11
+ }
12
+ return false
13
+ },
14
+ map (set, fn) {
15
+ const result = new Set()
16
+ set.forEach((item) => {
17
+ result.add(fn(item))
18
+ })
19
+ return result
20
+ },
21
+ filter (set, fn) {
22
+ const result = new Set()
23
+ set.forEach((item) => {
24
+ if (fn(item)) {
25
+ result.add(item)
26
+ }
27
+ })
28
+ return result
29
+ },
30
+ concat (setA, setB) {
31
+ const result = new Set()
32
+ setA.forEach((item) => {
33
+ result.add(item)
34
+ })
35
+ setB.forEach((item) => {
36
+ result.add(item)
37
+ })
38
+ return result
39
+ },
40
+ mapToArr (set, fn) {
41
+ const result = []
42
+ set.forEach((item) => {
43
+ result.push(fn(item))
44
+ })
45
+ return result
46
+ }
47
+ }
@@ -0,0 +1,25 @@
1
+ const loaderToIdent = data => {
2
+ if (!data.options) {
3
+ return data.loader
4
+ }
5
+ if (typeof data.options === 'string') {
6
+ return data.loader + '?' + data.options
7
+ }
8
+ if (typeof data.options !== 'object') {
9
+ throw new Error('loader options must be string or object')
10
+ }
11
+ if (data.ident) {
12
+ return data.loader + '??' + data.ident
13
+ }
14
+ return data.loader + '?' + JSON.stringify(data.options)
15
+ }
16
+
17
+ const stringifyLoadersAndResource = (loaders, resource) => {
18
+ let str = ''
19
+ for (const loader of loaders) {
20
+ str += loaderToIdent(loader) + '!'
21
+ }
22
+ return str + resource
23
+ }
24
+
25
+ module.exports = stringifyLoadersAndResource
@@ -16,6 +16,10 @@ function stringifyQuery (obj, useJSON) {
16
16
  return
17
17
  }
18
18
 
19
+ if (val === true) {
20
+ return key
21
+ }
22
+
19
23
  if (Array.isArray(val)) {
20
24
  const key2 = `${key}[]`
21
25
  const result = []
@@ -30,7 +30,6 @@ module.exports = function (script, options, callback) {
30
30
  const loaderContext = options.loaderContext
31
31
  const isProduction = options.isProduction
32
32
  const componentId = options.componentId
33
- const getRequireForSrc = options.getRequireForSrc
34
33
  const i18n = options.i18n
35
34
  const jsonConfig = options.jsonConfig
36
35
  const tabBar = jsonConfig.tabBar
@@ -213,8 +212,9 @@ module.exports = function (script, options, callback) {
213
212
  }
214
213
  // 为了正确获取currentSrcMode便于运行时进行转换,对于src引入的组件script采用require方式引入(由于webpack会将import的执行顺序上升至最顶),这意味着对于src引入脚本中的named export将不会生效,不过鉴于mpx和小程序中本身也没有在组件script中声明export的用法,所以应该没有影响
215
214
  content += script.src
216
- ? (getRequireForSrc('script', script) + '\n')
217
- : (script.content + '\n') + '\n'
215
+ ? `require(${stringifyRequest(script.src)})\n`
216
+ : script.content
217
+ content += '\n'
218
218
  // createApp/Page/Component执行完成后立刻获取当前的option并暂存
219
219
  content += ` const currentOption = global.currentOption\n`
220
220
  // 获取pageConfig
@@ -83,6 +83,8 @@ module.exports = function (template, options, callback) {
83
83
  defs,
84
84
  decodeHTMLText: options.decodeHTMLText,
85
85
  externalClasses: options.externalClasses,
86
+ // todo 后续输出web也采用mpx的scoped处理
87
+ // hasScoped:options.hasScoped,
86
88
  hasScoped: false,
87
89
  moduleId,
88
90
  filePath: loaderContext.resourcePath,
@@ -1,12 +1,9 @@
1
- // const htmlMinifier = require('html-minifier')
2
1
  const attrParse = require('./attributesParser')
3
2
  const loaderUtils = require('loader-utils')
4
3
  const url = require('url')
5
4
  const config = require('../config')
6
- const getMainCompilation = require('../utils/get-main-compilation')
7
5
  const createHelpers = require('../helpers')
8
6
  const isUrlRequest = require('../utils/is-url-request')
9
- const addQuery = require('../utils/add-query')
10
7
  const parseRequest = require('../utils/parse-request')
11
8
 
12
9
  function randomIdent () {
@@ -14,13 +11,13 @@ function randomIdent () {
14
11
  }
15
12
 
16
13
  module.exports = function (content) {
17
- const loaderContext = this
18
- const isProduction = this.minimize || process.env.NODE_ENV === 'production'
19
14
  const options = loaderUtils.getOptions(this) || {}
20
- const mpx = getMainCompilation(this._compilation).__mpx__
15
+ const mpx = this.getMpx()
16
+ const root = mpx.projectRoot
17
+ const externals = mpx.externals
21
18
 
22
- const { resourcePath: filePath, queryObj } = parseRequest(this.resource)
23
- const moduleId = 'm' + mpx.pathHash(filePath)
19
+ const { queryObj } = parseRequest(this.resource)
20
+ const moduleId = queryObj.moduleId
24
21
  const hasScoped = false
25
22
  const hasComment = false
26
23
  const isNative = true
@@ -28,25 +25,10 @@ module.exports = function (content) {
28
25
  const usingComponents = []
29
26
 
30
27
  const mode = mpx.mode
31
- const globalSrcMode = mpx.srcMode
32
28
  const localSrcMode = queryObj.mode
33
- const srcMode = localSrcMode || globalSrcMode
34
29
  const customAttributes = options.attributes || mpx.attributes || []
35
30
 
36
- const {
37
- getSrcRequestString
38
- } = createHelpers({
39
- loaderContext,
40
- options,
41
- moduleId,
42
- isProduction,
43
- hasScoped,
44
- hasComment,
45
- usingComponents,
46
- srcMode,
47
- isNative,
48
- projectRoot: options.root || ''
49
- })
31
+ const { getRequestString } = createHelpers(this)
50
32
 
51
33
  const attributes = ['image:src', 'audio:src', 'video:src', 'cover-image:src', 'import:src', 'include:src', `${config[mode].wxs.tag}:${config[mode].wxs.src}`].concat(customAttributes)
52
34
 
@@ -64,7 +46,7 @@ module.exports = function (content) {
64
46
  const data = {}
65
47
  content = [content]
66
48
  links.forEach(function (link) {
67
- if (!isUrlRequest(link.value, options.root)) return
49
+ if (!isUrlRequest(link.value, root, externals)) return
68
50
 
69
51
  if (link.value.indexOf('mailto:') > -1) return
70
52
 
@@ -88,57 +70,39 @@ module.exports = function (content) {
88
70
  })
89
71
  content.reverse()
90
72
  content = content.join('')
91
-
92
- // if (isProduction) {
93
- // const minimizeOptions = Object.assign({}, options);
94
- // [
95
- // 'removeComments',
96
- // 'removeCommentsFromCDATA',
97
- // 'removeCDATASectionsFromCDATA',
98
- // 'caseSensitive',
99
- // 'collapseWhitespace',
100
- // 'conservativeCollapse',
101
- // 'useShortDoctype',
102
- // 'keepClosingSlash',
103
- // 'removeScriptTypeAttributes',
104
- // 'removeStyleTypeAttributes'
105
- // ].forEach(function (name) {
106
- // if (typeof minimizeOptions[name] === 'undefined') {
107
- // minimizeOptions[name] = true
108
- // }
109
- // })
110
- //
111
- // const KEY_IGNORECUSTOM_FRAGMENTS = 'ignoreCustomFragments'
112
- // if (typeof minimizeOptions[KEY_IGNORECUSTOM_FRAGMENTS] === 'undefined') {
113
- // minimizeOptions[KEY_IGNORECUSTOM_FRAGMENTS] = [/{{[\s\S]*?}}/]
114
- // }
115
- //
116
- // content = htmlMinifier.minify(content, minimizeOptions)
117
- // }
118
-
119
73
  content = JSON.stringify(content)
120
74
 
121
75
  const exportsString = 'module.exports = '
122
76
 
123
- return exportsString + content.replace(/xxxHTMLLINKxxx[0-9.]+xxx/g, function (match) {
77
+ return exportsString + content.replace(/xxxHTMLLINKxxx[0-9.]+xxx/g, (match) => {
124
78
  if (!data[match]) return match
125
79
 
126
80
  const link = data[match]
127
81
 
128
- let src = loaderUtils.urlToRequest(link.value, options.root)
129
- src = addQuery(src, { isStatic: true })
82
+ let src = loaderUtils.urlToRequest(link.value, root)
130
83
 
131
- let requestString
84
+ let requestString, extraOptions
132
85
 
133
86
  switch (link.tag) {
134
87
  case 'import':
135
88
  case 'include':
136
- requestString = getSrcRequestString('template', { src, mode: localSrcMode }, -1)
89
+ extraOptions = {
90
+ hasScoped,
91
+ hasComment,
92
+ isNative,
93
+ moduleId,
94
+ usingComponents,
95
+ isStatic: true
96
+ }
97
+ requestString = getRequestString('template', { src, mode: localSrcMode }, extraOptions)
137
98
  break
138
99
  case config[mode].wxs.tag:
139
100
  // 显式传递issuerResource避免模块缓存以及提供给wxs-loader计算相对路径
140
- src = addQuery(src, { issuerResource: loaderContext.resource })
141
- requestString = getSrcRequestString('wxs', { src, mode: localSrcMode }, -1, undefined, '!!')
101
+ extraOptions = {
102
+ issuerFile: mpx.getExtractedFile(this.resource),
103
+ isStatic: true
104
+ }
105
+ requestString = getRequestString('wxs', { src, mode: localSrcMode }, extraOptions)
142
106
  break
143
107
  default:
144
108
  requestString = JSON.stringify(src)