diff --git a/packages/vue-cli-plugin-uni/packages/vue-loader/lib/plugin-webpack5.js b/packages/vue-cli-plugin-uni/packages/vue-loader/lib/plugin-webpack5.js index a3ec14dff3d016ca5b6a5960f7703d176a39f58a..bdb21a0ca4f69d759e59730c39d9f0b018988b2b 100644 --- a/packages/vue-cli-plugin-uni/packages/vue-loader/lib/plugin-webpack5.js +++ b/packages/vue-cli-plugin-uni/packages/vue-loader/lib/plugin-webpack5.js @@ -6,28 +6,48 @@ const BasicMatcherRulePlugin = require('webpack/lib/rules/BasicMatcherRulePlugin const RuleSetCompiler = require('webpack/lib/rules/RuleSetCompiler') const UseEffectRulePlugin = require('webpack/lib/rules/UseEffectRulePlugin') +const objectMatcherRulePlugins = [] +try { + const ObjectMatcherRulePlugin = require('webpack/lib/rules/ObjectMatcherRulePlugin') + objectMatcherRulePlugins.push( + new ObjectMatcherRulePlugin('assert', 'assertions'), + new ObjectMatcherRulePlugin('descriptionData') + ) +} catch (e) { + const DescriptionDataMatcherRulePlugin = require('webpack/lib/rules/DescriptionDataMatcherRulePlugin') + objectMatcherRulePlugins.push(new DescriptionDataMatcherRulePlugin()) +} + const ruleSetCompiler = new RuleSetCompiler([ new BasicMatcherRulePlugin('test', 'resource'), + new BasicMatcherRulePlugin('mimetype'), + new BasicMatcherRulePlugin('dependency'), new BasicMatcherRulePlugin('include', 'resource'), new BasicMatcherRulePlugin('exclude', 'resource', true), - new BasicMatcherRulePlugin('resource'), new BasicMatcherRulePlugin('conditions'), + new BasicMatcherRulePlugin('resource'), new BasicMatcherRulePlugin('resourceQuery'), + new BasicMatcherRulePlugin('resourceFragment'), new BasicMatcherRulePlugin('realResource'), new BasicMatcherRulePlugin('issuer'), new BasicMatcherRulePlugin('compiler'), + ...objectMatcherRulePlugins, new BasicEffectRulePlugin('type'), new BasicEffectRulePlugin('sideEffects'), new BasicEffectRulePlugin('parser'), new BasicEffectRulePlugin('resolve'), + new BasicEffectRulePlugin('generator'), new UseEffectRulePlugin() ]) class VueLoaderPlugin { apply (compiler) { + const normalModule = compiler.webpack + ? compiler.webpack.NormalModule + : require('webpack/lib/NormalModule') // add NS marker so that the loader can detect and report missing plugin compiler.hooks.compilation.tap(id, compilation => { - const normalModuleLoader = require('webpack/lib/NormalModule').getCompilationHooks(compilation).loader + const normalModuleLoader = normalModule.getCompilationHooks(compilation).loader normalModuleLoader.tap(id, loaderContext => { loaderContext[NS] = true }) @@ -38,6 +58,10 @@ class VueLoaderPlugin { let vueRules = [] for (const rawRule of rules) { + // skip rules with 'enforce'. eg. rule for eslint-loader + if (rawRule.enforce) { + continue + } // skip the `include` check when locating the vue rule const clonedRawRule = Object.assign({}, rawRule) delete clonedRawRule.include @@ -71,7 +95,7 @@ class VueLoaderPlugin { ) } - // get the normlized "use" for vue files + // get the normalized "use" for vue files const vueUse = vueRules.filter(rule => rule.type === 'use').map(rule => rule.value) // get vue-loader options @@ -110,6 +134,7 @@ class VueLoaderPlugin { const pitcher = { loader: require.resolve('./loaders/pitcher'), resourceQuery: query => { + if (!query) { return false } const parsed = qs.parse(query.slice(1)) return parsed.vue != null }, @@ -128,8 +153,9 @@ class VueLoaderPlugin { } } +let uid = 0 function cloneRule (rawRule, refs) { - const rules = ruleSetCompiler.compileRules('ruleSet', [{ + const rules = ruleSetCompiler.compileRules(`clonedRuleSet-${++uid}`, [{ rules: [rawRule] }], refs) let currentResource @@ -182,6 +208,10 @@ function cloneRule (rawRule, refs) { delete res.test + if (rawRule.rules) { + res.rules = rawRule.rules.map(rule => cloneRule(rule, refs)) + } + if (rawRule.oneOf) { res.oneOf = rawRule.oneOf.map(rule => cloneRule(rule, refs)) }