Skip to content

Commit a9944ff

Browse files
committed
fix: should use normalized resource for template code rule clone
1 parent dd774c1 commit a9944ff

File tree

3 files changed

+39
-10
lines changed

3 files changed

+39
-10
lines changed

example/webpack.config.js

+13-1
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,15 @@ module.exports = {
4040
'css-loader'
4141
]
4242
},
43+
{
44+
test: /\.js$/,
45+
use: {
46+
loader: 'babel-loader',
47+
options: {
48+
presets: ['@babel/preset-env']
49+
}
50+
}
51+
},
4352
// target <docs> custom blocks
4453
{
4554
resourceQuery: /blockType=docs/,
@@ -54,13 +63,16 @@ module.exports = {
5463
})
5564
],
5665
devServer: {
57-
stats: "minimal",
66+
stats: 'minimal',
5867
contentBase: __dirname,
5968
overlay: true
6069
},
6170
resolveLoader: {
6271
alias: {
6372
'vue-loader': require.resolve('../')
6473
}
74+
},
75+
optimization: {
76+
// minimize: false
6577
}
6678
}

src/pitcher.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ module.exports = pitcher
2626

2727
// This pitching loader is responsible for intercepting all vue block requests
2828
// and transform it into appropriate requests.
29-
pitcher.pitch = function(r) {
29+
pitcher.pitch = function() {
3030
const context = this as webpack.loader.LoaderContext
3131
const rawLoaders = context.loaders.filter(isNotPitcher)
3232
let loaders = rawLoaders

src/plugin.ts

+25-8
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,10 @@ class VueLoaderPlugin implements webpack.Plugin {
6767
const templateCompilerRule = {
6868
loader: require.resolve('./templateLoader'),
6969
test: /\.vue$/,
70-
resourceQuery: isVueTemplateBlock,
70+
resourceQuery: (query: string) => {
71+
const parsed = qs.parse(query.slice(1))
72+
return parsed.vue != null && parsed.type === 'template'
73+
},
7174
options: vueLoaderOptions
7275
}
7376

@@ -154,18 +157,32 @@ function cloneRule(rule: webpack.RuleSetRule) {
154157
return res
155158
}
156159

157-
function isVueTemplateBlock(query: string) {
158-
const parsed = qs.parse(query.slice(1))
159-
return parsed.vue != null && parsed.type === 'template'
160-
}
161-
162160
function cloneRuleForRenderFn(rule: webpack.RuleSetRule) {
161+
const resource = rule.resource as Function
162+
const resourceQuery = rule.resourceQuery as Function
163+
let currentResource: string
163164
const res = {
164165
...rule,
165166
resource: {
166-
test: /\.vue$/
167+
test: (resource: string) => {
168+
currentResource = resource
169+
return true
170+
}
167171
},
168-
resourceQuery: isVueTemplateBlock
172+
resourceQuery: (query: string) => {
173+
const parsed = qs.parse(query.slice(1))
174+
if (parsed.vue == null || parsed.type !== 'template') {
175+
return false
176+
}
177+
const fakeResourcePath = `${currentResource}.js`
178+
if (resource && !resource(fakeResourcePath)) {
179+
return false
180+
}
181+
if (resourceQuery && !resourceQuery(query)) {
182+
return false
183+
}
184+
return true
185+
}
169186
}
170187
if (rule.oneOf) {
171188
res.oneOf = rule.oneOf.map(cloneRule)

0 commit comments

Comments
 (0)