From cdb254885ea98aa60595fb1830555a6b1cabd767 Mon Sep 17 00:00:00 2001 From: jeneser Date: Fri, 26 Mar 2021 16:56:41 +0800 Subject: [PATCH 01/11] refactor: remove cache-loader and migrate on webpack@5 the cache option --- .../__tests__/tsPluginBabel.spec.js | 5 ++--- packages/@vue/cli-plugin-typescript/index.js | 10 ---------- packages/@vue/cli-plugin-typescript/package.json | 1 - packages/@vue/cli-service/lib/PluginAPI.js | 6 ------ packages/@vue/cli-service/lib/config/base.js | 9 +-------- packages/@vue/cli-service/lib/config/prod.js | 1 + packages/@vue/cli-service/package.json | 1 - yarn.lock | 16 ++-------------- 8 files changed, 6 insertions(+), 43 deletions(-) diff --git a/packages/@vue/cli-plugin-typescript/__tests__/tsPluginBabel.spec.js b/packages/@vue/cli-plugin-typescript/__tests__/tsPluginBabel.spec.js index e88d243989..a2a10550d8 100644 --- a/packages/@vue/cli-plugin-typescript/__tests__/tsPluginBabel.spec.js +++ b/packages/@vue/cli-plugin-typescript/__tests__/tsPluginBabel.spec.js @@ -17,9 +17,8 @@ test('using correct loader', () => { const config = service.resolveWebpackConfig() // eslint-disable-next-line no-shadow const rule = config.module.rules.find(rule => rule.test.test('foo.ts')) - expect(rule.use[0].loader).toMatch(require.resolve('cache-loader')) - expect(rule.use[1].loader).toMatch(require.resolve('babel-loader')) - expect(rule.use[2].loader).toMatch(require.resolve('ts-loader')) + expect(rule.use[0].loader).toMatch(require.resolve('babel-loader')) + expect(rule.use[1].loader).toMatch(require.resolve('ts-loader')) }) const creatorOptions = { diff --git a/packages/@vue/cli-plugin-typescript/index.js b/packages/@vue/cli-plugin-typescript/index.js index cc02c8b175..b3d8c3c20d 100644 --- a/packages/@vue/cli-plugin-typescript/index.js +++ b/packages/@vue/cli-plugin-typescript/index.js @@ -30,16 +30,6 @@ module.exports = (api, projectOptions) => { tsxRule.use(name).loader(loader).options(options) } - addLoader({ - name: 'cache-loader', - loader: require.resolve('cache-loader'), - options: api.genCacheConfig('ts-loader', { - 'ts-loader': require('ts-loader/package.json').version, - 'typescript': require('typescript/package.json').version, - modern: !!process.env.VUE_CLI_MODERN_BUILD - }, 'tsconfig.json') - }) - if (useThreads) { addLoader({ name: 'thread-loader', diff --git a/packages/@vue/cli-plugin-typescript/package.json b/packages/@vue/cli-plugin-typescript/package.json index 6e869e5aaa..80d099ed5b 100644 --- a/packages/@vue/cli-plugin-typescript/package.json +++ b/packages/@vue/cli-plugin-typescript/package.json @@ -26,7 +26,6 @@ "@types/webpack-env": "^1.15.2", "@vue/cli-shared-utils": "^5.0.0-alpha.8", "babel-loader": "^8.2.2", - "cache-loader": "^4.1.0", "fork-ts-checker-webpack-plugin": "^6.1.0", "globby": "^11.0.2", "thread-loader": "^3.0.0", diff --git a/packages/@vue/cli-service/lib/PluginAPI.js b/packages/@vue/cli-service/lib/PluginAPI.js index 88db286f40..9f2000e7cc 100644 --- a/packages/@vue/cli-service/lib/PluginAPI.js +++ b/packages/@vue/cli-service/lib/PluginAPI.js @@ -171,12 +171,6 @@ class PluginAPI { ] } - try { - variables['cache-loader'] = require('cache-loader/package.json').version - } catch (e) { - // cache-loader is only intended to be used for webpack 4 - } - if (!Array.isArray(configFiles)) { configFiles = [configFiles] } diff --git a/packages/@vue/cli-service/lib/config/base.js b/packages/@vue/cli-service/lib/config/base.js index f821c8fedb..42f2f10382 100644 --- a/packages/@vue/cli-service/lib/config/base.js +++ b/packages/@vue/cli-service/lib/config/base.js @@ -21,6 +21,7 @@ module.exports = (api, options) => { } webpackConfig + .cache(true) .mode('development') .context(api.service.context) .entry('app') @@ -75,10 +76,6 @@ module.exports = (api, options) => { webpackConfig.module .rule('vue') .test(/\.vue$/) - .use('cache-loader') - .loader(require.resolve('cache-loader')) - .options(vueLoaderCacheConfig) - .end() .use('vue-loader') .loader(require.resolve('vue-loader-v15')) .options(Object.assign({ @@ -118,10 +115,6 @@ module.exports = (api, options) => { webpackConfig.module .rule('vue') .test(/\.vue$/) - .use('cache-loader') - .loader(require.resolve('cache-loader')) - .options(vueLoaderCacheConfig) - .end() .use('vue-loader') .loader(require.resolve('vue-loader')) .options({ diff --git a/packages/@vue/cli-service/lib/config/prod.js b/packages/@vue/cli-service/lib/config/prod.js index 68fe1f2ccc..a0e61c22a6 100644 --- a/packages/@vue/cli-service/lib/config/prod.js +++ b/packages/@vue/cli-service/lib/config/prod.js @@ -3,6 +3,7 @@ module.exports = (api, options) => { api.chainWebpack(webpackConfig => { if (process.env.NODE_ENV === 'production') { webpackConfig + .cache(false) .mode('production') .devtool(options.productionSourceMap ? 'source-map' : false) diff --git a/packages/@vue/cli-service/package.json b/packages/@vue/cli-service/package.json index 42ac1247fa..f9838396c8 100644 --- a/packages/@vue/cli-service/package.json +++ b/packages/@vue/cli-service/package.json @@ -38,7 +38,6 @@ "address": "^1.1.2", "autoprefixer": "^10.2.4", "browserslist": "^4.16.3", - "cache-loader": "^4.1.0", "case-sensitive-paths-webpack-plugin": "^2.3.0", "cli-highlight": "^2.1.10", "clipboardy": "^2.3.0", diff --git a/yarn.lock b/yarn.lock index 36fb726ac1..5576b696ce 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6597,18 +6597,6 @@ cache-loader@^3.0.0: neo-async "^2.6.1" schema-utils "^1.0.0" -cache-loader@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/cache-loader/-/cache-loader-4.1.0.tgz#9948cae353aec0a1fcb1eafda2300816ec85387e" - integrity sha512-ftOayxve0PwKzBF/GLsZNC9fJBXl8lkZE3TOsjkboHfVHVkL39iUEs1FO07A33mizmci5Dudt38UZrrYXDtbhw== - dependencies: - buffer-json "^2.0.0" - find-cache-dir "^3.0.0" - loader-utils "^1.2.3" - mkdirp "^0.5.1" - neo-async "^2.6.1" - schema-utils "^2.0.0" - cacheable-lookup@^5.0.3: version "5.0.4" resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz#5a6b865b2c44357be3d5ebc2a467b032719a7005" @@ -10467,7 +10455,7 @@ find-cache-dir@^2.0.0, find-cache-dir@^2.1.0: make-dir "^2.0.0" pkg-dir "^3.0.0" -find-cache-dir@^3.0.0, find-cache-dir@^3.3.1: +find-cache-dir@^3.3.1: version "3.3.1" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880" integrity sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ== @@ -19021,7 +19009,7 @@ schema-utils@^1.0.0: ajv-errors "^1.0.0" ajv-keywords "^3.1.0" -schema-utils@^2.0.0, schema-utils@^2.6.5: +schema-utils@^2.6.5: version "2.7.1" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== From c91351a13995d283f7e0710a1d9da8ab0a640874 Mon Sep 17 00:00:00 2001 From: jeneser Date: Tue, 30 Mar 2021 21:31:02 +0800 Subject: [PATCH 02/11] feat: enable webpack 5 caching by default --- packages/@vue/cli-service/lib/config/base.js | 22 ++++++++++++++++++- packages/@vue/cli-service/lib/config/prod.js | 1 - .../cli-service/lib/util/getFileConfigPath.js | 21 ++++++++++++++++++ 3 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 packages/@vue/cli-service/lib/util/getFileConfigPath.js diff --git a/packages/@vue/cli-service/lib/config/base.js b/packages/@vue/cli-service/lib/config/base.js index 42f2f10382..c6b7ebf102 100644 --- a/packages/@vue/cli-service/lib/config/base.js +++ b/packages/@vue/cli-service/lib/config/base.js @@ -7,6 +7,8 @@ module.exports = (api, options) => { const webpack = require('webpack') const webpackMajor = semver.major(webpack.version) const vueMajor = require('../util/getVueMajor')(cwd) + const cliServiceVersion = require('@vue/cli-service/package.json').version + const fileConfigPath = require('../util/getFileConfigPath')(cwd) api.chainWebpack(webpackConfig => { const isLegacyBundle = process.env.VUE_CLI_MODERN_MODE && !process.env.VUE_CLI_MODERN_BUILD @@ -20,8 +22,26 @@ module.exports = (api, options) => { .resolve.set('fullySpecified', false) } + const cacheOptions = { + type: 'filesystem', + // Includes: + // - @vue/cli-service version + version: `${cliServiceVersion}` + } + + if (fileConfigPath) { + cacheOptions.buildDependencies = { + config: [fileConfigPath] + } + } + + webpackConfig + .cache(cacheOptions) + + webpackConfig.optimization + .set('realContentHash', false) + webpackConfig - .cache(true) .mode('development') .context(api.service.context) .entry('app') diff --git a/packages/@vue/cli-service/lib/config/prod.js b/packages/@vue/cli-service/lib/config/prod.js index a0e61c22a6..68fe1f2ccc 100644 --- a/packages/@vue/cli-service/lib/config/prod.js +++ b/packages/@vue/cli-service/lib/config/prod.js @@ -3,7 +3,6 @@ module.exports = (api, options) => { api.chainWebpack(webpackConfig => { if (process.env.NODE_ENV === 'production') { webpackConfig - .cache(false) .mode('production') .devtool(options.productionSourceMap ? 'source-map' : false) diff --git a/packages/@vue/cli-service/lib/util/getFileConfigPath.js b/packages/@vue/cli-service/lib/util/getFileConfigPath.js new file mode 100644 index 0000000000..0381155019 --- /dev/null +++ b/packages/@vue/cli-service/lib/util/getFileConfigPath.js @@ -0,0 +1,21 @@ +const path = require('path') +const fs = require('fs') + +module.exports = function getFileConfigPath (context) { + const possibleConfigPaths = [ + process.env.VUE_CLI_SERVICE_CONFIG_PATH, + './vue.config.js', + './vue.config.cjs' + ] + + let fileConfigPath + for (const p of possibleConfigPaths) { + const resolvedPath = p && path.resolve(context, p) + if (resolvedPath && fs.existsSync(resolvedPath)) { + fileConfigPath = resolvedPath + break + } + } + + return fileConfigPath +} From 59abdeaf7eaa319b2982af07fc33a32666fef7f6 Mon Sep 17 00:00:00 2001 From: jeneser Date: Thu, 8 Apr 2021 21:59:08 +0800 Subject: [PATCH 03/11] feat: add separate independent persistent cache --- .../@vue/cli-service/lib/commands/build/index.js | 12 ++++++++++++ packages/@vue/cli-service/lib/commands/serve.js | 2 ++ packages/@vue/cli-service/lib/config/base.js | 2 -- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/packages/@vue/cli-service/lib/commands/build/index.js b/packages/@vue/cli-service/lib/commands/build/index.js index d749e7230d..32d5be4014 100644 --- a/packages/@vue/cli-service/lib/commands/build/index.js +++ b/packages/@vue/cli-service/lib/commands/build/index.js @@ -196,6 +196,18 @@ async function build (args, api, options) { await fs.emptyDir(targetDir) } + modifyConfig(webpackConfig, config => { + config.cache.name = `${ + config.mode + }-${ + args.target + }-${ + Object.keys(config.entry).join('-') + }${ + args.modern ? (args.modernBuild ? '-modern' : '-legacy') : '' + }` + }) + return new Promise((resolve, reject) => { webpack(webpackConfig, (err, stats) => { stopSpinner(false) diff --git a/packages/@vue/cli-service/lib/commands/serve.js b/packages/@vue/cli-service/lib/commands/serve.js index 430096f925..6a47b7537a 100644 --- a/packages/@vue/cli-service/lib/commands/serve.js +++ b/packages/@vue/cli-service/lib/commands/serve.js @@ -160,6 +160,8 @@ module.exports = (api, options) => { addDevClientToEntry(webpackConfig, devClients) } + webpackConfig.cache.name = `${webpackConfig.mode}-${Object.keys(webpackConfig.entry).join('-')}` + // create compiler const compiler = webpack(webpackConfig) diff --git a/packages/@vue/cli-service/lib/config/base.js b/packages/@vue/cli-service/lib/config/base.js index c6b7ebf102..d523e91b91 100644 --- a/packages/@vue/cli-service/lib/config/base.js +++ b/packages/@vue/cli-service/lib/config/base.js @@ -24,8 +24,6 @@ module.exports = (api, options) => { const cacheOptions = { type: 'filesystem', - // Includes: - // - @vue/cli-service version version: `${cliServiceVersion}` } From a75073f9ad78640bb4044f48fda813bd8d2e675c Mon Sep 17 00:00:00 2001 From: jeneser Date: Sat, 10 Apr 2021 18:40:52 +0800 Subject: [PATCH 04/11] fix: disable vue-loader cache --- packages/@vue/cli-service/lib/config/base.js | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/packages/@vue/cli-service/lib/config/base.js b/packages/@vue/cli-service/lib/config/base.js index d523e91b91..5672c89d47 100644 --- a/packages/@vue/cli-service/lib/config/base.js +++ b/packages/@vue/cli-service/lib/config/base.js @@ -76,12 +76,6 @@ module.exports = (api, options) => { // vue-loader -------------------------------------------------------------- if (vueMajor === 2) { // for Vue 2 projects - const vueLoaderCacheConfig = api.genCacheConfig('vue-loader', { - 'vue-loader': require('vue-loader-v15/package.json').version, - '@vue/component-compiler-utils': require('@vue/component-compiler-utils/package.json').version, - 'vue-template-compiler': require('vue-template-compiler/package.json').version - }) - webpackConfig.resolve .alias .set( @@ -96,11 +90,11 @@ module.exports = (api, options) => { .test(/\.vue$/) .use('vue-loader') .loader(require.resolve('vue-loader-v15')) - .options(Object.assign({ + .options({ compilerOptions: { whitespace: 'condense' } - }, vueLoaderCacheConfig)) + }) webpackConfig .plugin('vue-loader') @@ -116,11 +110,6 @@ module.exports = (api, options) => { .prepend(path.resolve(__dirname, './vue-loader-v15-resolve-compat')) } else if (vueMajor === 3) { // for Vue 3 projects - const vueLoaderCacheConfig = api.genCacheConfig('vue-loader', { - 'vue-loader': require('vue-loader/package.json').version, - '@vue/compiler-sfc': require('@vue/compiler-sfc/package.json').version - }) - webpackConfig.resolve .alias .set( @@ -136,7 +125,6 @@ module.exports = (api, options) => { .use('vue-loader') .loader(require.resolve('vue-loader')) .options({ - ...vueLoaderCacheConfig, babelParserPlugins: ['jsx', 'classProperties', 'decorators-legacy'] }) .end() From 3604f92646ccdd68b1962cbea9531ddf3443cd2e Mon Sep 17 00:00:00 2001 From: jeneser Date: Sat, 10 Apr 2021 21:01:45 +0800 Subject: [PATCH 05/11] fix: remove realContentHash --- packages/@vue/cli-service/lib/config/base.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/packages/@vue/cli-service/lib/config/base.js b/packages/@vue/cli-service/lib/config/base.js index 5672c89d47..0584fe3c78 100644 --- a/packages/@vue/cli-service/lib/config/base.js +++ b/packages/@vue/cli-service/lib/config/base.js @@ -36,9 +36,6 @@ module.exports = (api, options) => { webpackConfig .cache(cacheOptions) - webpackConfig.optimization - .set('realContentHash', false) - webpackConfig .mode('development') .context(api.service.context) From bdd2c2920b8e29890041a335065756a066f1d906 Mon Sep 17 00:00:00 2001 From: jeneser Date: Sun, 11 Apr 2021 12:10:18 +0800 Subject: [PATCH 06/11] fix: disable vue-cli-plugin-apollo cache-loader for now --- packages/@vue/cli-ui/vue.config.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/@vue/cli-ui/vue.config.js b/packages/@vue/cli-ui/vue.config.js index 9f284b4a7d..277ce475d7 100644 --- a/packages/@vue/cli-ui/vue.config.js +++ b/packages/@vue/cli-ui/vue.config.js @@ -13,6 +13,10 @@ module.exports = { } }, + chainWebpack: config => { + config.module.rule('gql').uses.delete('cache-loader') + }, + css: { loaderOptions: { stylus: { From f3b8baa70cf68ff063fac79e90dc019d1fcfd967 Mon Sep 17 00:00:00 2001 From: Binwei Fang Date: Tue, 6 Apr 2021 14:43:23 +0800 Subject: [PATCH 07/11] fix(mocha): workaround the SVGElement issue in Vue (#6400) related to https://github.com/vuejs/vue-next/pull/2929 --- packages/@vue/cli-plugin-unit-mocha/setup.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/@vue/cli-plugin-unit-mocha/setup.js b/packages/@vue/cli-plugin-unit-mocha/setup.js index d615cf2d40..df81b0b514 100644 --- a/packages/@vue/cli-plugin-unit-mocha/setup.js +++ b/packages/@vue/cli-plugin-unit-mocha/setup.js @@ -4,3 +4,5 @@ require('jsdom-global')(undefined, { pretendToBeVisual: true, url: 'http://local window.Date = Date // https://github.com/vuejs/vue-next/pull/2943 global.ShadowRoot = window.ShadowRoot + +global.SVGElement = window.SVGElement From e4bf01ea82313d6571271ef7de8ed4ae462299f6 Mon Sep 17 00:00:00 2001 From: jeneser Date: Sun, 11 Apr 2021 18:04:51 +0800 Subject: [PATCH 08/11] feat: add --no-cache option for both serve and build --- .../cli-service/lib/commands/build/index.js | 28 ++++++++++--------- .../@vue/cli-service/lib/commands/serve.js | 13 +++++++-- 2 files changed, 25 insertions(+), 16 deletions(-) diff --git a/packages/@vue/cli-service/lib/commands/build/index.js b/packages/@vue/cli-service/lib/commands/build/index.js index 32d5be4014..3feef7cb48 100644 --- a/packages/@vue/cli-service/lib/commands/build/index.js +++ b/packages/@vue/cli-service/lib/commands/build/index.js @@ -2,7 +2,8 @@ const defaults = { clean: true, target: 'app', formats: 'commonjs,umd,umd-min', - 'unsafe-inline': true + 'unsafe-inline': true, + cache: true } const buildModes = { @@ -38,7 +39,8 @@ module.exports = (api, options) => { '--report-json': 'generate report.json to help analyze bundle content', '--skip-plugins': `comma-separated list of plugin names to skip for this run`, '--watch': `watch for changes`, - '--stdin': `close when stdin ends` + '--stdin': `close when stdin ends`, + '--no-cache': `disable webpack persistent caching` } }, async (args, rawArgs) => { for (const key in defaults) { @@ -196,17 +198,17 @@ async function build (args, api, options) { await fs.emptyDir(targetDir) } - modifyConfig(webpackConfig, config => { - config.cache.name = `${ - config.mode - }-${ - args.target - }-${ - Object.keys(config.entry).join('-') - }${ - args.modern ? (args.modernBuild ? '-modern' : '-legacy') : '' - }` - }) + if (args.cache) { + modifyConfig(webpackConfig, config => { + config.cache.name = `${config.mode}-${args.target}-${Object.keys(config.entry).join('-')}${ + args.modern ? (args.modernBuild ? '-modern' : '-legacy') : '' + }` + }) + } else { + modifyConfig(webpackConfig, config => { + config.cache = false + }) + } return new Promise((resolve, reject) => { webpack(webpackConfig, (err, stats) => { diff --git a/packages/@vue/cli-service/lib/commands/serve.js b/packages/@vue/cli-service/lib/commands/serve.js index 6a47b7537a..5d2e00edb1 100644 --- a/packages/@vue/cli-service/lib/commands/serve.js +++ b/packages/@vue/cli-service/lib/commands/serve.js @@ -10,7 +10,8 @@ const { const defaults = { host: '0.0.0.0', port: 8080, - https: false + https: false, + cache: true } module.exports = (api, options) => { @@ -26,7 +27,8 @@ module.exports = (api, options) => { '--port': `specify port (default: ${defaults.port})`, '--https': `use https (default: ${defaults.https})`, '--public': `specify the public network URL for the HMR client`, - '--skip-plugins': `comma-separated list of plugin names to skip for this run` + '--skip-plugins': `comma-separated list of plugin names to skip for this run`, + '--no-cache': `disable webpack persistent caching` } }, async function serve (args) { info('Starting development server...') @@ -160,7 +162,12 @@ module.exports = (api, options) => { addDevClientToEntry(webpackConfig, devClients) } - webpackConfig.cache.name = `${webpackConfig.mode}-${Object.keys(webpackConfig.entry).join('-')}` + args.cache = args.cache == null ? defaults.cache : args.cache + if (args.cache) { + webpackConfig.cache.name = `${webpackConfig.mode}-${Object.keys(webpackConfig.entry).join('-')}` + } else { + webpackConfig.cache = false + } // create compiler const compiler = webpack(webpackConfig) From 7f19a24ca436b0fa4533fd5624626161c7c13d59 Mon Sep 17 00:00:00 2001 From: jeneser Date: Tue, 13 Apr 2021 15:41:47 +0000 Subject: [PATCH 09/11] feat: specify cache.version for build --- packages/@vue/cli-service/lib/commands/build/index.js | 7 +++++++ packages/@vue/cli-service/lib/config/base.js | 4 +--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/packages/@vue/cli-service/lib/commands/build/index.js b/packages/@vue/cli-service/lib/commands/build/index.js index 3feef7cb48..265a4bd551 100644 --- a/packages/@vue/cli-service/lib/commands/build/index.js +++ b/packages/@vue/cli-service/lib/commands/build/index.js @@ -108,6 +108,7 @@ async function build (args, api, options) { logWithSpinner, stopSpinner } = require('@vue/cli-shared-utils') + const cliServiceVersion = require('@vue/cli-service/package.json').version log() const mode = api.service.mode @@ -203,6 +204,12 @@ async function build (args, api, options) { config.cache.name = `${config.mode}-${args.target}-${Object.keys(config.entry).join('-')}${ args.modern ? (args.modernBuild ? '-modern' : '-legacy') : '' }` + config.cache.version = `${cliServiceVersion}|${JSON.stringify(args)}|${targetDir}|${ + Object.entries(process.env) + .filter(([key]) => key.startsWith('VUE_CLI_') || key.startsWith('VUE_APP_') || key === 'NODE_ENV' || key === 'BABEL_ENV') + .map(([key, value]) => `${key}-${value}`) + .join(';') + }` }) } else { modifyConfig(webpackConfig, config => { diff --git a/packages/@vue/cli-service/lib/config/base.js b/packages/@vue/cli-service/lib/config/base.js index 0584fe3c78..fb246bb408 100644 --- a/packages/@vue/cli-service/lib/config/base.js +++ b/packages/@vue/cli-service/lib/config/base.js @@ -7,7 +7,6 @@ module.exports = (api, options) => { const webpack = require('webpack') const webpackMajor = semver.major(webpack.version) const vueMajor = require('../util/getVueMajor')(cwd) - const cliServiceVersion = require('@vue/cli-service/package.json').version const fileConfigPath = require('../util/getFileConfigPath')(cwd) api.chainWebpack(webpackConfig => { @@ -23,8 +22,7 @@ module.exports = (api, options) => { } const cacheOptions = { - type: 'filesystem', - version: `${cliServiceVersion}` + type: 'filesystem' } if (fileConfigPath) { From 57c6be9126ecbf0c0a2ebb9d43abef91d2a44ceb Mon Sep 17 00:00:00 2001 From: jeneser Date: Wed, 14 Apr 2021 15:22:10 +0000 Subject: [PATCH 10/11] refactor: adjusting the position of options --- .../cli-service/lib/commands/build/index.js | 29 +++++++++++++------ .../@vue/cli-service/lib/commands/serve.js | 16 +++++++++- packages/@vue/cli-service/lib/config/base.js | 14 --------- 3 files changed, 35 insertions(+), 24 deletions(-) diff --git a/packages/@vue/cli-service/lib/commands/build/index.js b/packages/@vue/cli-service/lib/commands/build/index.js index 265a4bd551..c569439a46 100644 --- a/packages/@vue/cli-service/lib/commands/build/index.js +++ b/packages/@vue/cli-service/lib/commands/build/index.js @@ -109,6 +109,8 @@ async function build (args, api, options) { stopSpinner } = require('@vue/cli-shared-utils') const cliServiceVersion = require('@vue/cli-service/package.json').version + const cwd = api.getCwd() + const fileConfigPath = require('../../util/getFileConfigPath')(cwd) log() const mode = api.service.mode @@ -201,15 +203,24 @@ async function build (args, api, options) { if (args.cache) { modifyConfig(webpackConfig, config => { - config.cache.name = `${config.mode}-${args.target}-${Object.keys(config.entry).join('-')}${ - args.modern ? (args.modernBuild ? '-modern' : '-legacy') : '' - }` - config.cache.version = `${cliServiceVersion}|${JSON.stringify(args)}|${targetDir}|${ - Object.entries(process.env) - .filter(([key]) => key.startsWith('VUE_CLI_') || key.startsWith('VUE_APP_') || key === 'NODE_ENV' || key === 'BABEL_ENV') - .map(([key, value]) => `${key}-${value}`) - .join(';') - }` + config.cache = { + type: 'filesystem', + name: `${config.mode}-${args.target}-${Object.keys(config.entry).join('-')}${ + args.modern ? (args.modernBuild ? '-modern' : '-legacy') : '' + }`, + version: `${cliServiceVersion}|${JSON.stringify(args)}|${targetDir}|${ + Object.entries(process.env) + .filter(([key]) => key.startsWith('VUE_CLI_') || key.startsWith('VUE_APP_') || key === 'NODE_ENV' || key === 'BABEL_ENV') + .map(([key, value]) => `${key}-${value}`) + .join(';') + }` + } + if (fileConfigPath) { + config.cache.buildDependencies = { + ...(config.cache.buildDependencies || {}), + config: [fileConfigPath] + } + } }) } else { modifyConfig(webpackConfig, config => { diff --git a/packages/@vue/cli-service/lib/commands/serve.js b/packages/@vue/cli-service/lib/commands/serve.js index 5d2e00edb1..c9c38587c5 100644 --- a/packages/@vue/cli-service/lib/commands/serve.js +++ b/packages/@vue/cli-service/lib/commands/serve.js @@ -49,6 +49,10 @@ module.exports = (api, options) => { const validateWebpackConfig = require('../util/validateWebpackConfig') const isAbsoluteUrl = require('../util/isAbsoluteUrl') + const cwd = api.getCwd() + const cliServiceVersion = require('@vue/cli-service/package.json').version + const fileConfigPath = require('../util/getFileConfigPath')(cwd) + // configs that only matters for dev server api.chainWebpack(webpackConfig => { if (process.env.NODE_ENV !== 'production' && process.env.NODE_ENV !== 'test') { @@ -164,7 +168,17 @@ module.exports = (api, options) => { args.cache = args.cache == null ? defaults.cache : args.cache if (args.cache) { - webpackConfig.cache.name = `${webpackConfig.mode}-${Object.keys(webpackConfig.entry).join('-')}` + webpackConfig.cache = { + type: 'filesystem', + name: `${webpackConfig.mode}-${Object.keys(webpackConfig.entry).join('-')}`, + version: `${cliServiceVersion}` + } + if (fileConfigPath) { + webpackConfig.cache.buildDependencies = { + ...(webpackConfig.cache.buildDependencies || {}), + config: [fileConfigPath] + } + } } else { webpackConfig.cache = false } diff --git a/packages/@vue/cli-service/lib/config/base.js b/packages/@vue/cli-service/lib/config/base.js index fb246bb408..03ca58d231 100644 --- a/packages/@vue/cli-service/lib/config/base.js +++ b/packages/@vue/cli-service/lib/config/base.js @@ -7,7 +7,6 @@ module.exports = (api, options) => { const webpack = require('webpack') const webpackMajor = semver.major(webpack.version) const vueMajor = require('../util/getVueMajor')(cwd) - const fileConfigPath = require('../util/getFileConfigPath')(cwd) api.chainWebpack(webpackConfig => { const isLegacyBundle = process.env.VUE_CLI_MODERN_MODE && !process.env.VUE_CLI_MODERN_BUILD @@ -21,19 +20,6 @@ module.exports = (api, options) => { .resolve.set('fullySpecified', false) } - const cacheOptions = { - type: 'filesystem' - } - - if (fileConfigPath) { - cacheOptions.buildDependencies = { - config: [fileConfigPath] - } - } - - webpackConfig - .cache(cacheOptions) - webpackConfig .mode('development') .context(api.service.context) From 231c02faf0030b605c8da3921602e34aa093f8df Mon Sep 17 00:00:00 2001 From: jeneser Date: Thu, 15 Apr 2021 15:52:55 +0800 Subject: [PATCH 11/11] feat: variable and buildDependencies that affect compilation --- .../cli-service/lib/commands/build/index.js | 29 ++++++------------- .../@vue/cli-service/lib/commands/serve.js | 23 ++++++--------- packages/@vue/cli-service/lib/config/base.js | 15 ++++++++++ .../cli-service/lib/util/getSpecificEnv.js | 11 +++++++ 4 files changed, 44 insertions(+), 34 deletions(-) create mode 100644 packages/@vue/cli-service/lib/util/getSpecificEnv.js diff --git a/packages/@vue/cli-service/lib/commands/build/index.js b/packages/@vue/cli-service/lib/commands/build/index.js index c569439a46..133d5252ea 100644 --- a/packages/@vue/cli-service/lib/commands/build/index.js +++ b/packages/@vue/cli-service/lib/commands/build/index.js @@ -108,9 +108,7 @@ async function build (args, api, options) { logWithSpinner, stopSpinner } = require('@vue/cli-shared-utils') - const cliServiceVersion = require('@vue/cli-service/package.json').version - const cwd = api.getCwd() - const fileConfigPath = require('../../util/getFileConfigPath')(cwd) + const getSpecificEnv = require('../../util/getSpecificEnv') log() const mode = api.service.mode @@ -203,23 +201,14 @@ async function build (args, api, options) { if (args.cache) { modifyConfig(webpackConfig, config => { - config.cache = { - type: 'filesystem', - name: `${config.mode}-${args.target}-${Object.keys(config.entry).join('-')}${ - args.modern ? (args.modernBuild ? '-modern' : '-legacy') : '' - }`, - version: `${cliServiceVersion}|${JSON.stringify(args)}|${targetDir}|${ - Object.entries(process.env) - .filter(([key]) => key.startsWith('VUE_CLI_') || key.startsWith('VUE_APP_') || key === 'NODE_ENV' || key === 'BABEL_ENV') - .map(([key, value]) => `${key}-${value}`) - .join(';') - }` - } - if (fileConfigPath) { - config.cache.buildDependencies = { - ...(config.cache.buildDependencies || {}), - config: [fileConfigPath] - } + if (config.cache && typeof config.cache === 'object') { + const configVars = JSON.stringify({ ...args, targetDir }) + config.cache.name = + `${config.mode}-${args.target}` + + `-${Object.keys(config.entry).join('-')}` + + `${args.modern ? (args.modernBuild ? '-modern' : '-legacy') : ''}` + + `${config.cache.name ? '-' + config.cache.name : ''}` + config.cache.version = `${config.cache.version}|${configVars}|${getSpecificEnv()}` } }) } else { diff --git a/packages/@vue/cli-service/lib/commands/serve.js b/packages/@vue/cli-service/lib/commands/serve.js index c9c38587c5..a101ca3351 100644 --- a/packages/@vue/cli-service/lib/commands/serve.js +++ b/packages/@vue/cli-service/lib/commands/serve.js @@ -48,10 +48,7 @@ module.exports = (api, options) => { const launchEditorMiddleware = require('launch-editor-middleware') const validateWebpackConfig = require('../util/validateWebpackConfig') const isAbsoluteUrl = require('../util/isAbsoluteUrl') - - const cwd = api.getCwd() - const cliServiceVersion = require('@vue/cli-service/package.json').version - const fileConfigPath = require('../util/getFileConfigPath')(cwd) + const getSpecificEnv = require('../util/getSpecificEnv') // configs that only matters for dev server api.chainWebpack(webpackConfig => { @@ -168,16 +165,14 @@ module.exports = (api, options) => { args.cache = args.cache == null ? defaults.cache : args.cache if (args.cache) { - webpackConfig.cache = { - type: 'filesystem', - name: `${webpackConfig.mode}-${Object.keys(webpackConfig.entry).join('-')}`, - version: `${cliServiceVersion}` - } - if (fileConfigPath) { - webpackConfig.cache.buildDependencies = { - ...(webpackConfig.cache.buildDependencies || {}), - config: [fileConfigPath] - } + if (webpackConfig.cache && typeof webpackConfig.cache === 'object') { + const configVars = JSON.stringify({ ...args }) + + webpackConfig.cache.name = + `${webpackConfig.mode}` + + `-${Object.keys(webpackConfig.entry).join('-')}` + + `${webpackConfig.cache.name ? '-' + webpackConfig.cache.name : ''}` + webpackConfig.cache.version = `${webpackConfig.cache.version}|${configVars}|${getSpecificEnv()}` } } else { webpackConfig.cache = false diff --git a/packages/@vue/cli-service/lib/config/base.js b/packages/@vue/cli-service/lib/config/base.js index 03ca58d231..f477c0568c 100644 --- a/packages/@vue/cli-service/lib/config/base.js +++ b/packages/@vue/cli-service/lib/config/base.js @@ -7,6 +7,8 @@ module.exports = (api, options) => { const webpack = require('webpack') const webpackMajor = semver.major(webpack.version) const vueMajor = require('../util/getVueMajor')(cwd) + const fileConfigPath = require('../util/getFileConfigPath')(cwd) + const cliServiceVersion = require('@vue/cli-service/package.json').version api.chainWebpack(webpackConfig => { const isLegacyBundle = process.env.VUE_CLI_MODERN_MODE && !process.env.VUE_CLI_MODERN_BUILD @@ -20,7 +22,20 @@ module.exports = (api, options) => { .resolve.set('fullySpecified', false) } + const cacheOptions = { + type: 'filesystem', + version: `${cliServiceVersion}`, + buildDependencies: { + config: [require.resolve('../../webpack.config')] + } + } + + if (fileConfigPath) { + cacheOptions.buildDependencies.config.push(fileConfigPath) + } + webpackConfig + .cache(cacheOptions) .mode('development') .context(api.service.context) .entry('app') diff --git a/packages/@vue/cli-service/lib/util/getSpecificEnv.js b/packages/@vue/cli-service/lib/util/getSpecificEnv.js new file mode 100644 index 0000000000..642ba6b4ec --- /dev/null +++ b/packages/@vue/cli-service/lib/util/getSpecificEnv.js @@ -0,0 +1,11 @@ +module.exports = function getSpecificEnv () { + return Object.keys(process.env).reduce( + (prev, key) => { + if (key.startsWith('VUE_CLI_') || key.startsWith('VUE_APP_') || key === 'NODE_ENV' || key === 'BABEL_ENV') { + return `${prev}|${key}=${process.env[key]}` + } + return prev + }, + '' + ) +}