diff --git a/packages/vite/src/node/build.ts b/packages/vite/src/node/build.ts index db20ba374bed4c..0f51e90cb0c796 100644 --- a/packages/vite/src/node/build.ts +++ b/packages/vite/src/node/build.ts @@ -452,7 +452,12 @@ export async function build( async function doBuild( inlineConfig: InlineConfig = {} ): Promise { - const config = await resolveConfig(inlineConfig, 'build', 'production') + const config = await resolveConfig( + inlineConfig, + 'build', + 'production', + 'production' + ) const options = config.build const ssr = !!options.ssr const libOptions = options.lib diff --git a/packages/vite/src/node/cli.ts b/packages/vite/src/node/cli.ts index 8a3ece51a08a66..4dc2354079bb7f 100644 --- a/packages/vite/src/node/cli.ts +++ b/packages/vite/src/node/cli.ts @@ -242,8 +242,7 @@ cli configFile: options.config, logLevel: options.logLevel }, - 'build', - 'development' + 'build' ) await optimizeDeps(config, options.force, true) } catch (e) { diff --git a/packages/vite/src/node/config.ts b/packages/vite/src/node/config.ts index 558819b1d008f6..2a269090f88c1f 100644 --- a/packages/vite/src/node/config.ts +++ b/packages/vite/src/node/config.ts @@ -372,21 +372,17 @@ export type ResolveFn = ( export async function resolveConfig( inlineConfig: InlineConfig, command: 'build' | 'serve', - defaultMode = 'development' + defaultMode = 'development', + defaultNodeEnv = 'development' ): Promise { let config = inlineConfig let configFileDependencies: string[] = [] let mode = inlineConfig.mode || defaultMode // some dependencies e.g. @vue/compiler-* relies on NODE_ENV for getting - // production-specific behavior, so set it here even though we haven't - // resolve the final mode yet - if (mode === 'production') { - process.env.NODE_ENV = 'production' - } - // production env would not work in serve, fallback to development - if (command === 'serve' && process.env.NODE_ENV === 'production') { - process.env.NODE_ENV = 'development' + // production-specific behavior, so set it early on + if (!process.env.NODE_ENV) { + process.env.NODE_ENV = defaultNodeEnv } const configEnv = { diff --git a/packages/vite/src/node/preview.ts b/packages/vite/src/node/preview.ts index 8148b34110022b..69f50afa74d04b 100644 --- a/packages/vite/src/node/preview.ts +++ b/packages/vite/src/node/preview.ts @@ -76,7 +76,12 @@ export type PreviewServerHook = ( export async function preview( inlineConfig: InlineConfig = {} ): Promise { - const config = await resolveConfig(inlineConfig, 'serve', 'production') + const config = await resolveConfig( + inlineConfig, + 'serve', + 'production', + 'production' + ) const app = connect() as Connect.Server const httpServer = await resolveHttpServer( diff --git a/packages/vite/src/node/server/index.ts b/packages/vite/src/node/server/index.ts index df748f2fd15844..db76f2852678d5 100644 --- a/packages/vite/src/node/server/index.ts +++ b/packages/vite/src/node/server/index.ts @@ -310,7 +310,7 @@ export interface ResolvedServerUrls { export async function createServer( inlineConfig: InlineConfig = {} ): Promise { - const config = await resolveConfig(inlineConfig, 'serve', 'development') + const config = await resolveConfig(inlineConfig, 'serve') const { root, server: serverConfig } = config const httpsOptions = await resolveHttpsConfig(config.server.https) const { middlewareMode } = serverConfig diff --git a/playground/json/server.js b/playground/json/server.js index 01f7e1482aa9e8..0f14a6925181e2 100644 --- a/playground/json/server.js +++ b/playground/json/server.js @@ -3,7 +3,7 @@ const fs = require('node:fs') const path = require('node:path') const express = require('express') -const isTest = process.env.NODE_ENV === 'test' || !!process.env.VITE_TEST_BUILD +const isTest = process.env.VITEST async function createServer( root = process.cwd(), diff --git a/playground/legacy/__tests__/client-and-ssr/serve.ts b/playground/legacy/__tests__/client-and-ssr/serve.ts index becca5fc123b8b..ab330d9e493ed2 100644 --- a/playground/legacy/__tests__/client-and-ssr/serve.ts +++ b/playground/legacy/__tests__/client-and-ssr/serve.ts @@ -8,17 +8,8 @@ export const port = ports['legacy/client-and-ssr'] export async function serve(): Promise<{ close(): Promise }> { const { build } = await import('vite') - // In a CLI app it is possible that you may run `build` several times one after another - // For example, you may want to override an option specifically for the SSR build - // And you may have a CLI app built for that purpose to make a more concise API - // An unexpected behaviour is for the plugin-legacy to override the process.env.NODE_ENV value - // And any build after the first client build that called plugin-legacy will misbehave and - // build with process.env.NODE_ENV=production, rather than your CLI's env: NODE_ENV=myWhateverEnv my-cli-app build - // The issue is with plugin-legacy's index.ts file not explicitly passing mode: process.env.NODE_ENV to vite's build function - // This causes vite to call resolveConfig with defaultMode = 'production' and mutate process.env.NODE_ENV to 'production' - await build({ - mode: process.env.NODE_ENV, + mode: 'test', root: rootDir, logLevel: 'silent', build: { @@ -28,7 +19,7 @@ export async function serve(): Promise<{ close(): Promise }> { }) await build({ - mode: process.env.NODE_ENV, + mode: 'test', root: rootDir, logLevel: 'silent', build: { diff --git a/playground/optimize-missing-deps/server.js b/playground/optimize-missing-deps/server.js index 641c128afbbe26..0685d0148eff43 100644 --- a/playground/optimize-missing-deps/server.js +++ b/playground/optimize-missing-deps/server.js @@ -3,7 +3,7 @@ const fs = require('node:fs') const path = require('node:path') const express = require('express') -const isTest = process.env.NODE_ENV === 'test' || !!process.env.VITE_TEST_BUILD +const isTest = process.env.VITEST async function createServer(root = process.cwd(), hmrPort) { const resolve = (p) => path.resolve(__dirname, p) diff --git a/playground/ssr-deps/__tests__/ssr-deps.spec.ts b/playground/ssr-deps/__tests__/ssr-deps.spec.ts index 9e7932001b3ace..a98bf5bcd76299 100644 --- a/playground/ssr-deps/__tests__/ssr-deps.spec.ts +++ b/playground/ssr-deps/__tests__/ssr-deps.spec.ts @@ -102,7 +102,9 @@ test('msg from external using external entry', async () => { test('msg from linked no external', async () => { await page.goto(url) - expect(await page.textContent('.linked-no-external')).toMatch('Hello World!') + expect(await page.textContent('.linked-no-external')).toMatch( + `Hello World from ${process.env.NODE_ENV}!` + ) }) test('msg from linked no external', async () => { diff --git a/playground/ssr-deps/linked-no-external/index.js b/playground/ssr-deps/linked-no-external/index.js index 8322345e2aa5df..fd63958570d556 100644 --- a/playground/ssr-deps/linked-no-external/index.js +++ b/playground/ssr-deps/linked-no-external/index.js @@ -1,5 +1,7 @@ export const hello = function () { // make sure linked package is not externalized so Vite features like // import.meta.env works (or handling TS files) - return import.meta.env.DEV && 'Hello World!' + return `Hello World from ${ + import.meta.env.DEV ? 'development' : 'production' + }!` } diff --git a/playground/ssr-deps/server.js b/playground/ssr-deps/server.js index d82f80c599583b..08a8b331495882 100644 --- a/playground/ssr-deps/server.js +++ b/playground/ssr-deps/server.js @@ -6,7 +6,7 @@ import express from 'express' const __dirname = path.dirname(fileURLToPath(import.meta.url)) -const isTest = process.env.NODE_ENV === 'test' || !!process.env.VITE_TEST_BUILD +const isTest = process.env.VITEST export async function createServer(root = process.cwd(), hmrPort) { const resolve = (p) => path.resolve(__dirname, p) diff --git a/playground/ssr-deps/src/app.js b/playground/ssr-deps/src/app.js index 3afb1b00caf5ab..e82cf6045cd675 100644 --- a/playground/ssr-deps/src/app.js +++ b/playground/ssr-deps/src/app.js @@ -79,7 +79,7 @@ export async function render(url, rootDir) { html += `\n

message from external-using-external-entry: ${externalUsingExternalEntryMessage}

` const linkedNoExternalMessage = linkedNoExternal() - html += `\n

message from linked-no-external: ${linkedNoExternalMessage}

` + html += `\n

linked-no-external msg: ${linkedNoExternalMessage}

` html += `\n

message from dep-virtual: ${virtualMessage}

` diff --git a/playground/ssr-html/server.js b/playground/ssr-html/server.js index 7549fbf07cc388..02d613ed49004f 100644 --- a/playground/ssr-html/server.js +++ b/playground/ssr-html/server.js @@ -4,7 +4,7 @@ import { fileURLToPath } from 'node:url' import express from 'express' const __dirname = path.dirname(fileURLToPath(import.meta.url)) -const isTest = process.env.NODE_ENV === 'test' || !!process.env.VITE_TEST_BUILD +const isTest = process.env.VITEST const DYNAMIC_SCRIPTS = `