From 1b8ea086372701b723d4e306b68a4b1c44fcfe16 Mon Sep 17 00:00:00 2001 From: Malash Date: Wed, 29 Nov 2023 17:35:02 +0800 Subject: [PATCH] fix Webpack cache invalidation --- packages/cli/src/config/webpack.config.ts | 18 ++++++++++++++++-- packages/cli/src/index.ts | 9 +++++---- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/packages/cli/src/config/webpack.config.ts b/packages/cli/src/config/webpack.config.ts index 69de850..3d302be 100644 --- a/packages/cli/src/config/webpack.config.ts +++ b/packages/cli/src/config/webpack.config.ts @@ -7,6 +7,8 @@ import type { NonUndefined } from 'utility-types'; import { GojiWebpackPluginOptions, GojiWebpackPlugin } from '@goji/webpack-plugin'; import nodeLibsBrowser from 'node-libs-browser'; import resolve from 'resolve'; +// eslint-disable-next-line import/no-extraneous-dependencies +import { version as gojiCliVersion } from '@goji/cli/package.json'; import { version as babelCoreVersion } from '@babel/core/package.json'; import { version as babelLoaderVersion } from 'babel-loader/package.json'; import postcssConfig from './postcssConfig'; @@ -36,6 +38,7 @@ const getNodeLibsFallback = () => { export const getWebpackConfig = ({ basedir, + gojiConfigFile, outputPath, target, nodeEnv, @@ -46,6 +49,7 @@ export const getWebpackConfig = ({ parallel, }: { basedir: string; + gojiConfigFile?: string; outputPath?: string; target: GojiTarget; nodeEnv: string; @@ -121,8 +125,18 @@ export const getWebpackConfig = ({ type: 'filesystem', idleTimeout: 0, idleTimeoutForInitialStore: 0, - // prevent re-using cache for different target - version: target, + // prevent re-using cache for different target / GojiJS versions + version: [target, gojiCliVersion].join('-'), + buildDependencies: { + config: [ + // `webpack.config.js` should be included + // https://webpack.js.org/configuration/cache/#cachebuilddependencies + // https://github.com/webpack/webpack-cli/blob/ef09fee7185e5c80efd3de1c98260e61f1e63ba0/packages/webpack-cli/src/webpack-cli.ts#L2279-L2300 + __filename, + // `goji.config.js` should be included if exists + ...(gojiConfigFile ? [gojiConfigFile] : []), + ], + }, }, stats: { preset: 'minimal', diff --git a/packages/cli/src/index.ts b/packages/cli/src/index.ts index 8a2c54e..424cdc5 100644 --- a/packages/cli/src/index.ts +++ b/packages/cli/src/index.ts @@ -22,17 +22,17 @@ interface GojiConfig { } const GOJI_CONFIG_FILE_NAME = 'goji.config'; -const requireGojiConfig = (basedir: string): GojiConfig => { +const requireGojiConfig = (basedir: string): [string | undefined, GojiConfig] => { let resolvedPath: string; try { resolvedPath = resolve.sync(path.join(basedir, GOJI_CONFIG_FILE_NAME)); } catch (error) { console.info(`\`goji.config.js\` not found in folder ${basedir}, using default config.`); - return {}; + return [undefined, {}]; } // eslint-disable-next-line global-require, import/no-dynamic-require - return require(resolvedPath); + return [resolvedPath, require(resolvedPath)]; }; const main = async () => { @@ -49,7 +49,7 @@ const main = async () => { process.env.NODE_ENV = cliConfig.production ? 'production' : 'development'; process.env.GOJI_TARGET = cliConfig.target; - const gojiConfig = requireGojiConfig(basedir); + const [gojiConfigFile, gojiConfig] = requireGojiConfig(basedir); // eslint-disable-next-line global-require const babelConfig = require('./config/babel.config'); if (gojiConfig.configureBabel) { @@ -59,6 +59,7 @@ const main = async () => { const watch = cliConfig.watch ?? gojiConfig.watch ?? !cliConfig.production; const webpackConfig = getWebpackConfig({ basedir, + gojiConfigFile, outputPath: gojiConfig.outputPath, target: cliConfig.target, nodeEnv: cliConfig.production ? 'production' : 'development',