Skip to content

refactor: use builder in build#18432

Merged
patak-cat merged 5 commits into
vitejs:mainfrom
sapphi-red:refactor/use-builder-in-build
Oct 23, 2024
Merged

refactor: use builder in build#18432
patak-cat merged 5 commits into
vitejs:mainfrom
sapphi-red:refactor/use-builder-in-build

Conversation

@sapphi-red
Copy link
Copy Markdown
Member

Description

Alternative to #18028

  • Removes builder.entireApp and use builder: {} / builder: undefined (this one can be discussed separately if needed)
  • Introduce a internal concept of legacy builder that just works like build and use that from the CLI

This makes the createBuilder a bit complicated but the overall code size is smaller and improves CLI-JS API symmetry.

Migration Plans

This PR does not change any behavior. Later on we make builder: { sharedConfigBuild: true } to be the default and remove the codes related to the legacy builder.

  • For CSR only apps: no migration needed
  • For CSR + SSR apps using vite CLI
    1. No change is needed for Vite 6, but can opt-in to using builder by passing --app or setting builder: {} in the config
    2. When the legacy builder is removed, users can remove --app but that change is not necessary (we should just ignore the flag)
  • For CSR + SSR apps using build command
    1. No change is needed for Vite 6, but can opt-in to using builder by using createBuilder
    2. When the legacy builder is removed, users need to migrate to createBuilder from build

@sapphi-red
Copy link
Copy Markdown
Member Author

@patak-dev @bluwy What do you think about this one?

@sapphi-red sapphi-red added the feat: environment API Vite Environment API label Oct 23, 2024
Comment thread packages/vite/src/node/build.ts Outdated
Comment on lines +1548 to +1549
if (selectedEnvironmentName && selectedEnvironmentName !== environmentName)
continue
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe this would be more clear with a condition out of the for loop:

  function setupEnvironment(environmentName, environmentConfig) {
    const environment = await environmentConfig.build.createEnvironment(
      environmentName,
      environmentConfig,
    )
    await environment.init()
    environments[environmentName] = environment
  }

  if (selectedEnvironmentName) {
    setupEnvironment(selectedEnvironmentName, config)
  }
  else {
    // ... current for loop using setupEnvironment(environmentName, environmentConfig)
  }

Comment thread packages/vite/src/node/build.ts
@patak-cat
Copy link
Copy Markdown
Member

This approach looks good to me! Thanks Sapphi for exploring this option.

I was thinking we could move some props later on from build to builder, for example copyPublicDir, but we can delay this until everyone is using buildApp. This, thinking in a future where nobody wants to use Vite to build a single environment (and if they want, they just configure it with a single environment, but there is no more build() a part).
If we don't think that will ever be possible, maybe we could use { builder: { entireApp: true }} for the option, but using the implementation proposed here.

@bluwy
Copy link
Copy Markdown
Member

bluwy commented Oct 23, 2024

I like this approach too, so IIUC the programmatic API to reflect vite build and vite build --app would be createBuilder({}, null).buildApp()? It's a little clunky, but I think it's fine since it's only a stop gap for this major.

Once createBuilder() stabilizes, would we phase out build()?

@sapphi-red
Copy link
Copy Markdown
Member Author

so IIUC the programmatic API to reflect vite build and vite build --app would be createBuilder({}, null).buildApp()?

Yes.

Once createBuilder() stabilizes, would we phase out build()?

I think yes.

Copy link
Copy Markdown
Member

@patak-cat patak-cat left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks again Sapphi! I prefer this option to just removing entireApp. Just a note again that if we go with this one, we are already deciding that at one point we would like to remove build() and being able to "build a part of an app". Or we can still change our mind and accept a small breaking change for people that used builder: {} if we need to introduce entireApp. I'm fine with this.

@patak-cat patak-cat merged commit cc61d16 into vitejs:main Oct 23, 2024
@sapphi-red sapphi-red deleted the refactor/use-builder-in-build branch October 24, 2024 00:41
moonlitusun pushed a commit to moonlitusun/vite that referenced this pull request May 25, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

feat: environment API Vite Environment API

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants