@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.
- package/lib/dependencies/AppEntryDependency.js +56 -0
- package/lib/dependencies/CommonJsVariableDependency.js +74 -0
- package/lib/dependencies/DynamicEntryDependency.js +127 -0
- package/lib/dependencies/FlagPluginDependency.js +23 -0
- package/lib/dependencies/InjectDependency.js +43 -0
- package/lib/dependencies/RecordGlobalComponentsDependency.js +50 -0
- package/lib/dependencies/RecordStaticResourceDependency.js +47 -0
- package/lib/{dependency → dependencies}/ReplaceDependency.js +19 -2
- package/lib/dependencies/ResolveDependency.js +83 -0
- package/lib/extractor.js +72 -179
- package/lib/file-loader.js +7 -19
- package/lib/helpers.js +41 -331
- package/lib/index.js +475 -365
- package/lib/json-compiler/helper.js +152 -0
- package/lib/json-compiler/index.js +148 -407
- package/lib/json-compiler/plugin.js +134 -0
- package/lib/json-compiler/{theme-loader.js → theme.js} +5 -3
- package/lib/loader.js +78 -177
- package/lib/native-loader.js +40 -70
- package/lib/record-loader.js +11 -0
- package/lib/{path-loader.js → resolve-loader.js} +0 -0
- package/lib/runtime/i18n.wxs +3 -3
- package/lib/selector.js +8 -7
- package/lib/style-compiler/index.js +14 -15
- package/lib/template-compiler/compiler.js +16 -153
- package/lib/template-compiler/index.js +46 -132
- package/lib/url-loader.js +11 -29
- package/lib/utils/add-query.js +1 -1
- package/lib/utils/const.js +5 -0
- package/lib/utils/emit-file.js +10 -0
- package/lib/utils/get-entry-name.js +13 -0
- package/lib/utils/is-url-request.js +10 -1
- package/lib/utils/normalize.js +0 -13
- package/lib/utils/parse-request.js +3 -3
- package/lib/utils/set.js +47 -0
- package/lib/utils/stringify-loaders-resource.js +25 -0
- package/lib/utils/stringify-query.js +4 -0
- package/lib/web/processScript.js +3 -3
- package/lib/web/processTemplate.js +2 -0
- package/lib/wxml/{wxml-loader.js → loader.js} +24 -60
- package/lib/wxs/WxsModuleIdsPlugin.js +32 -0
- package/lib/wxs/WxsParserPlugin.js +2 -2
- package/lib/wxs/WxsPlugin.js +4 -8
- package/lib/wxs/WxsTemplatePlugin.js +46 -92
- package/lib/wxs/{wxs-i18n-loader.js → i18n-loader.js} +0 -0
- package/lib/wxs/{wxs-loader.js → loader.js} +33 -38
- package/lib/wxs/{wxs-pre-loader.js → pre-loader.js} +0 -0
- package/lib/wxss/loader.js +31 -43
- package/lib/wxss/localsLoader.js +1 -5
- package/package.json +4 -8
- package/lib/content-loader.js +0 -13
- package/lib/dependency/ChildCompileDependency.js +0 -24
- package/lib/dependency/InjectDependency.js +0 -26
- package/lib/dependency/RemovedModuleDependency.js +0 -23
- package/lib/dependency/ResolveDependency.js +0 -49
- package/lib/plugin-loader.js +0 -287
- package/lib/utils/try-require.js +0 -16
- 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
|
|
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
|
|
15
|
-
const
|
|
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
|
|
45
|
-
hasComment
|
|
46
|
-
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
|
|
56
|
-
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 (
|
|
82
|
+
if (isNative) {
|
|
79
83
|
return result
|
|
80
84
|
}
|
|
81
85
|
|
|
82
|
-
const rawCode = `
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
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
|
|
95
|
+
let bindResult
|
|
90
96
|
|
|
91
97
|
try {
|
|
92
|
-
|
|
98
|
+
bindResult = bindThis(rawCode, {
|
|
93
99
|
needCollect: true,
|
|
94
100
|
ignoreMap: meta.wxsModuleMap
|
|
95
101
|
})
|
|
96
102
|
} catch (e) {
|
|
97
|
-
error(`
|
|
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
|
-
|
|
108
|
-
let globalInjectCode = renderResult.code + '\n'
|
|
114
|
+
resultSource += bindResult.code + '\n'
|
|
109
115
|
|
|
110
|
-
if ((mode === 'tt' || mode === 'swan') &&
|
|
111
|
-
|
|
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
|
-
|
|
121
|
+
resultSource += bindThis(`
|
|
122
|
+
global.currentInject.injectComputed = {
|
|
116
123
|
${meta.computed.join(',')}
|
|
117
|
-
|
|
124
|
+
};`).code + '\n'
|
|
118
125
|
}
|
|
119
126
|
|
|
120
127
|
if (meta.refs) {
|
|
121
|
-
|
|
128
|
+
resultSource += `
|
|
129
|
+
global.currentInject.getRefsData = function () {
|
|
122
130
|
return ${JSON.stringify(meta.refs)};
|
|
123
|
-
|
|
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
|
-
|
|
131
|
-
|
|
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
|
-
|
|
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
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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
|
|
35
|
-
const mimetype = options.mimetype || mime.getType(
|
|
36
|
-
const
|
|
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 ||
|
|
41
|
-
const isStyle = (issuer && issuer.request && isStyleRequest(issuer.request)) ||
|
|
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 (
|
|
30
|
+
if (queryObj.fallback) {
|
|
49
31
|
transBase64 = false
|
|
50
32
|
}
|
|
51
33
|
} else {
|
package/lib/utils/add-query.js
CHANGED
|
@@ -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,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
|
}
|
package/lib/utils/normalize.js
CHANGED
|
@@ -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
|
package/lib/utils/set.js
ADDED
|
@@ -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
|
package/lib/web/processScript.js
CHANGED
|
@@ -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
|
-
? (
|
|
217
|
-
:
|
|
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 =
|
|
15
|
+
const mpx = this.getMpx()
|
|
16
|
+
const root = mpx.projectRoot
|
|
17
|
+
const externals = mpx.externals
|
|
21
18
|
|
|
22
|
-
const {
|
|
23
|
-
const moduleId =
|
|
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,
|
|
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,
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
141
|
-
|
|
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)
|