Skip to content

Commit 0f0b09b

Browse files
privatenumberyyx990803
authored andcommitted
feat: inherit root request query in custom block loaders (#1330)
1 parent 1bfc08a commit 0f0b09b

File tree

6 files changed

+55
-7
lines changed

6 files changed

+55
-7
lines changed

Diff for: lib/codegen/customBlocks.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,15 @@ const { attrsToQuery } = require('./utils')
44
module.exports = function genCustomBlocksCode (
55
blocks,
66
resourcePath,
7+
resourceQuery,
78
stringifyRequest
89
) {
910
return `\n/* custom blocks */\n` + blocks.map((block, i) => {
1011
const src = block.attrs.src || resourcePath
1112
const attrsQuery = attrsToQuery(block.attrs)
1213
const issuerQuery = block.attrs.src ? `&issuerPath=${qs.escape(resourcePath)}` : ''
13-
const query = `?vue&type=custom&index=${i}&blockType=${qs.escape(block.type)}${issuerQuery}${attrsQuery}`
14+
const inheritQuery = resourceQuery ? `&${resourceQuery.slice(1)}` : ''
15+
const query = `?vue&type=custom&index=${i}&blockType=${qs.escape(block.type)}${issuerQuery}${attrsQuery}${inheritQuery}`
1416
return (
1517
`import block${i} from ${stringifyRequest(src + query)}\n` +
1618
`if (typeof block${i} === 'function') block${i}(component)`

Diff for: lib/codegen/styleInjection.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,11 @@ module.exports = function genStyleInjectionCode (
2020
function genStyleRequest (style, i) {
2121
const src = style.src || resourcePath
2222
const attrsQuery = attrsToQuery(style.attrs, 'css')
23+
const inheritQuery = `&${loaderContext.resourceQuery.slice(1)}`
2324
// make sure to only pass id when necessary so that we don't inject
2425
// duplicate tags when multiple components import the same css file
2526
const idQuery = style.scoped ? `&id=${id}` : ``
26-
const query = `?vue&type=style&index=${i}${idQuery}${attrsQuery}`
27+
const query = `?vue&type=style&index=${i}${idQuery}${attrsQuery}${inheritQuery}`
2728
return stringifyRequest(src + query)
2829
}
2930

Diff for: lib/index.js

+9-4
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,9 @@ module.exports = function (source) {
3737
resourceQuery
3838
} = loaderContext
3939

40-
const incomingQuery = qs.parse(resourceQuery.slice(1))
40+
const rawQuery = resourceQuery.slice(1)
41+
const inheritQuery = `&${rawQuery}`
42+
const incomingQuery = qs.parse(rawQuery)
4143
const options = loaderUtils.getOptions(loaderContext) || {}
4244

4345
const isServer = target === 'node'
@@ -65,7 +67,9 @@ module.exports = function (source) {
6567
// module id for scoped CSS & hot-reload
6668
const shortFilePath = path
6769
.relative(context, resourcePath)
68-
.replace(/^(\.\.[\\\/])+/, '')
70+
.replace(/^(\.\.[\\\/])+/, '') +
71+
resourceQuery
72+
6973
const id = hash(
7074
isProduction
7175
? (shortFilePath + '\n' + source)
@@ -90,7 +94,7 @@ module.exports = function (source) {
9094
const idQuery = `&id=${id}`
9195
const scopedQuery = hasScoped ? `&scoped=true` : ``
9296
const attrsQuery = attrsToQuery(descriptor.template.attrs)
93-
const query = `?vue&type=template${idQuery}${scopedQuery}${attrsQuery}`
97+
const query = `?vue&type=template${idQuery}${scopedQuery}${attrsQuery}${inheritQuery}`
9498
const request = templateRequest = stringifyRequest(src + query)
9599
templateImport = `import { render, staticRenderFns } from ${request}`
96100
}
@@ -100,7 +104,7 @@ module.exports = function (source) {
100104
if (descriptor.script) {
101105
const src = descriptor.script.src || resourcePath
102106
const attrsQuery = attrsToQuery(descriptor.script.attrs, 'js')
103-
const query = `?vue&type=script${attrsQuery}`
107+
const query = `?vue&type=script${attrsQuery}${inheritQuery}`
104108
const request = stringifyRequest(src + query)
105109
scriptImport = (
106110
`import script from ${request}\n` +
@@ -145,6 +149,7 @@ var component = normalizer(
145149
code += genCustomBlocksCode(
146150
descriptor.customBlocks,
147151
resourcePath,
152+
resourceQuery,
148153
stringifyRequest
149154
)
150155
}

Diff for: test/advanced.spec.js

+18
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,24 @@ test('support chaining with other loaders', done => {
2828
})
2929
})
3030

31+
test('inherit queries on files', done => {
32+
mockBundleAndRun({
33+
entry: 'basic.vue?change',
34+
modify: config => {
35+
config.module.rules[0] = {
36+
test: /\.vue$/,
37+
use: [
38+
'vue-loader',
39+
require.resolve('./mock-loaders/query')
40+
]
41+
}
42+
}
43+
}, ({ module }) => {
44+
expect(module.data().msg).toBe('Changed!')
45+
done()
46+
})
47+
})
48+
3149
test('expose filename', done => {
3250
mockBundleAndRun({
3351
entry: 'basic.vue'

Diff for: test/mock-loaders/query.js

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
module.exports = function (content) {
2+
const query = this.resourceQuery.slice(1)
3+
4+
if (/change/.test(query)) {
5+
return `
6+
<template>
7+
<div>Changed!</div>
8+
</template>
9+
<script>
10+
export default {
11+
data () {
12+
return {
13+
msg: 'Changed!'
14+
}
15+
}
16+
}
17+
</script>
18+
`
19+
}
20+
21+
return content
22+
}

Diff for: test/utils.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ function bundle (options, cb, wontThrowError) {
5757
config.module.rules[vueIndex] = Object.assign({}, vueRule, { options: vueOptions })
5858
}
5959

60-
if (/\.vue$/.test(config.entry)) {
60+
if (/\.vue/.test(config.entry)) {
6161
const vueFile = config.entry
6262
config = merge(config, {
6363
entry: require.resolve('./fixtures/entry'),

0 commit comments

Comments
 (0)