From 983feb2cdc5180dc46c3f5fc5b99baaa8d6b7078 Mon Sep 17 00:00:00 2001 From: yoho <907415276@qq.com> Date: Sun, 20 Feb 2022 00:06:03 +0800 Subject: [PATCH] fix: cannot reassign process.env.NODE_ENV in ssr (#6989) --- packages/vite/src/node/plugins/define.ts | 39 +++++++++++++++--------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/packages/vite/src/node/plugins/define.ts b/packages/vite/src/node/plugins/define.ts index f26df9e4d99405..187cacf54ab1c8 100644 --- a/packages/vite/src/node/plugins/define.ts +++ b/packages/vite/src/node/plugins/define.ts @@ -42,9 +42,11 @@ export function definePlugin(config: ResolvedConfig): Plugin { function generatePattern( ssr: boolean - ): [Record, RegExp] { + ): [Record, RegExp | null] { const processEnv: Record = {} - if (!ssr || config.ssr?.target === 'webworker') { + const isNeedProcessEnv = !ssr || config.ssr?.target === 'webworker' + + if (isNeedProcessEnv) { Object.assign(processEnv, { 'process.env.': `({}).`, 'global.process.env.': `({}).`, @@ -53,24 +55,27 @@ export function definePlugin(config: ResolvedConfig): Plugin { } const replacements: Record = { - ...processNodeEnv, + ...(isNeedProcessEnv ? processNodeEnv : {}), ...userDefine, ...importMetaKeys, ...processEnv } - const pattern = new RegExp( - // Do not allow preceding '.', but do allow preceding '...' for spread operations - '(? { - return str.replace(/[-[\]/{}()*+?.\\^$|]/g, '\\$&') - }) - .join('|') + - // prevent trailing assignments - ')\\b(?!\\s*?=[^=])', - 'g' - ) + const replacementsKeys = Object.keys(replacements) + const pattern = replacementsKeys.length + ? new RegExp( + // Do not allow preceding '.', but do allow preceding '...' for spread operations + '(? { + return str.replace(/[-[\]/{}()*+?.\\^$|]/g, '\\$&') + }) + .join('|') + + // prevent trailing assignments + ')\\b(?!\\s*?=[^=])', + 'g' + ) + : null return [replacements, pattern] } @@ -98,6 +103,10 @@ export function definePlugin(config: ResolvedConfig): Plugin { const [replacements, pattern] = ssr ? ssrPattern : defaultPattern + if (!pattern) { + return null + } + if (ssr && !isBuild) { // ssr + dev, simple replace return code.replace(pattern, (_, match) => {