Skip to content

Commit fb6ff6e

Browse files
committed
fix: skip thread-loader when cloning js rules to template compilation pipeline
Fixes vuejs/vue#12828
1 parent 46ffb4d commit fb6ff6e

File tree

2 files changed

+29
-3
lines changed

2 files changed

+29
-3
lines changed

lib/plugin-webpack4.js

+13
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,7 @@ function cloneRuleForRenderFn(rule) {
182182
const resource = rule.resource
183183
const resourceQuery = rule.resourceQuery
184184
let currentResource
185+
185186
const res = {
186187
...rule,
187188
resource: (resource) => {
@@ -204,6 +205,18 @@ function cloneRuleForRenderFn(rule) {
204205
}
205206
}
206207

208+
// Filter out `thread-loader` from the `use` array.
209+
// Mitigate https://github.com./vuejs/vue/issues/12828
210+
// Note this won't work if the `use` filed is a function
211+
if (Array.isArray(res.use)) {
212+
const isThreadLoader = (loader) => loader === 'thread-loader' || /\/node_modules\/thread-loader\//.test(loader)
213+
214+
res.use = res.use.filter(useEntry => {
215+
const loader = typeof useEntry === 'string' ? useEntry : useEntry.loader
216+
return !isThreadLoader(loader)
217+
})
218+
}
219+
207220
if (rule.rules) {
208221
res.rules = rule.rules.map(cloneRuleForRenderFn)
209222
}

lib/plugin-webpack5.js

+16-3
Original file line numberDiff line numberDiff line change
@@ -144,13 +144,14 @@ class VueLoaderPlugin {
144144
const { is27 } = resolveCompiler(compiler.options.context)
145145
let jsRulesForRenderFn = []
146146
if (is27) {
147+
const skipThreadLoader = true
147148
jsRulesForRenderFn = rules
148149
.filter(
149150
(r) =>
150151
r !== rawVueRule &&
151152
(match(r, 'test.js').length > 0 || match(r, 'test.ts').length > 0)
152153
)
153-
.map((rawRule) => cloneRule(rawRule, refs, jsRuleCheck, jsRuleResource))
154+
.map((rawRule) => cloneRule(rawRule, refs, jsRuleCheck, jsRuleResource, skipThreadLoader))
154155
}
155156

156157
// global pitcher (responsible for injecting template compiler loader & CSS
@@ -216,7 +217,7 @@ const jsRuleResource = (query, resource) =>
216217

217218
let uid = 0
218219

219-
function cloneRule(rawRule, refs, ruleCheck, ruleResource) {
220+
function cloneRule(rawRule, refs, ruleCheck, ruleResource, skipThreadLoader) {
220221
const compiledRule = ruleSetCompiler.compileRule(
221222
`clonedRuleSet-${++uid}`,
222223
rawRule,
@@ -231,7 +232,19 @@ function cloneRule(rawRule, refs, ruleCheck, ruleResource) {
231232
// fix conflict with config.loader and config.options when using config.use
232233
delete rawRule.loader
233234
delete rawRule.options
234-
rawRule.use = ruleUse
235+
236+
// Filter out `thread-loader` from the `use` array.
237+
// Mitigate https://github.com./vuejs/vue/issues/12828
238+
// Note this won't work if the `use` filed is a function
239+
if (skipThreadLoader && Array.isArray(ruleUse)) {
240+
const isThreadLoader = (loader) => loader === 'thread-loader' || /\/node_modules\/thread-loader\//.test(loader)
241+
rawRule.use = ruleUse.filter(useEntry => {
242+
const loader = typeof useEntry === 'string' ? useEntry : useEntry.loader
243+
return !isThreadLoader(loader)
244+
})
245+
} else {
246+
rawRule.use = ruleUse
247+
}
235248
}
236249

237250
let currentResource

0 commit comments

Comments
 (0)