@@ -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
217218let 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' || / \/ n o d e _ m o d u l e s \/ t h r e a d - l o a d e r \/ / . 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