Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

RSC: build: Read paths from getPaths() #10084

Merged
merged 1 commit into from
Mar 1, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 1 addition & 8 deletions packages/vite/src/buildFeServer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,14 +40,7 @@ export const buildFeServer = async ({ verbose, webDir }: BuildOptions = {}) => {
throw new Error('RSC entries file not found')
}

await buildRscFeServer({
viteConfigPath,
webHtml: rwPaths.web.html,
entries: rwPaths.web.entries,
webDist: rwPaths.web.dist,
webDistServer: rwPaths.web.distServer,
webDistServerEntries: rwPaths.web.distServerEntries,
})
await buildRscFeServer()

// Write a route manifest
return await buildRouteManifest()
Expand Down
36 changes: 6 additions & 30 deletions packages/vite/src/buildRscFeServer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,54 +5,30 @@ import { rscBuildCopyCssAssets } from './rsc/rscBuildCopyCssAssets'
import { rscBuildRwEnvVars } from './rsc/rscBuildRwEnvVars'
import { rscBuildServer } from './rsc/rscBuildServer'

interface Args {
viteConfigPath: string
webHtml: string
entries: string
webDist: string
webDistServer: string
webDistServerEntries: string
}

export const buildRscFeServer = async ({
viteConfigPath,
webHtml,
entries,
webDist,
webDistServer,
webDistServerEntries,
}: Args) => {
export const buildRscFeServer = async () => {
// Analyze all files and generate a list of RSCs and RSFs
const { clientEntryFiles, serverEntryFiles } = await rscBuildAnalyze(
viteConfigPath
)
const { clientEntryFiles, serverEntryFiles } = await rscBuildAnalyze()

// Generate the client bundle
const clientBuildOutput = await rscBuildClient(
webHtml,
webDist,
clientEntryFiles
)
const clientBuildOutput = await rscBuildClient(clientEntryFiles)

// Generate the server output
const serverBuildOutput = await rscBuildServer(
entries,
clientEntryFiles,
serverEntryFiles,
{}
)

// Copy CSS assets from server to client
await rscBuildCopyCssAssets(serverBuildOutput, webDist, webDistServer)
await rscBuildCopyCssAssets(serverBuildOutput)

// Mappings from server to client asset file names
await rscBuildClientEntriesMappings(
clientBuildOutput,
serverBuildOutput,
clientEntryFiles,
webDistServerEntries
clientEntryFiles
)

// Make RW specific env vars, like RWJS_ENV, available to server components
await rscBuildRwEnvVars(webDistServerEntries)
await rscBuildRwEnvVars()
}
8 changes: 6 additions & 2 deletions packages/vite/src/rsc/rscBuildAnalyze.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import { rscAnalyzePlugin } from './rscVitePlugins'
* Starts building the AST in entries.ts
* Doesn't output any files, only collects a list of RSCs and RSFs
*/
export async function rscBuildAnalyze(viteConfigPath: string) {
export async function rscBuildAnalyze() {
console.log('\n')
console.log('1. rscBuildAnalyze')
console.log('==================\n')
Expand All @@ -27,8 +27,12 @@ export async function rscBuildAnalyze(viteConfigPath: string) {
throw new Error('RSC entries file not found')
}

if (!rwPaths.web.viteConfig) {
throw new Error('Vite config not found')
}

await viteBuild({
configFile: viteConfigPath,
configFile: rwPaths.web.viteConfig,
root: rwPaths.base,
plugins: [
react(),
Expand Down
10 changes: 3 additions & 7 deletions packages/vite/src/rsc/rscBuildClient.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,7 @@ import { rscIndexPlugin } from './rscVitePlugins'
* buildFeServer -> buildRscFeServer -> rscBuildClient
* Generate the client bundle
*/
export async function rscBuildClient(
webHtml: string,
webDist: string,
clientEntryFiles: Record<string, string>
) {
export async function rscBuildClient(clientEntryFiles: Record<string, string>) {
console.log('\n')
console.log('2. rscBuildClient')
console.log('=================\n')
Expand All @@ -46,14 +42,14 @@ export async function rscBuildClient(
rscIndexPlugin(),
],
build: {
outDir: webDist,
outDir: rwPaths.web.dist,
emptyOutDir: true, // Needed because `outDir` is not inside `root`
// TODO (RSC) Enable this when we switch to a server-first approach
// emptyOutDir: false, // Already done when building server
rollupOptions: {
onwarn: onWarn,
input: {
main: webHtml,
main: rwPaths.web.html,
...clientEntryFiles,
},
preserveEntrySignatures: 'exports-only',
Expand Down
9 changes: 6 additions & 3 deletions packages/vite/src/rsc/rscBuildClientEntriesFile.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import fs from 'fs/promises'

import { getPaths } from '@redwoodjs/project-config'

import type { rscBuildClient } from './rscBuildClient'
import type { rscBuildServer } from './rscBuildServer'

Expand All @@ -11,13 +13,14 @@ import type { rscBuildServer } from './rscBuildServer'
export function rscBuildClientEntriesMappings(
clientBuildOutput: Awaited<ReturnType<typeof rscBuildClient>>,
serverBuildOutput: Awaited<ReturnType<typeof rscBuildServer>>,
clientEntryFiles: Record<string, string>,
webDistServerEntries: string
clientEntryFiles: Record<string, string>
) {
console.log('\n')
console.log('5. rscBuildClientEntriesMapping')
console.log('===============================\n')

const rwPaths = getPaths()

const clientEntries: Record<string, string> = {}
for (const item of clientBuildOutput) {
const { name, fileName } = item
Expand Down Expand Up @@ -47,7 +50,7 @@ export function rscBuildClientEntriesMappings(
console.log('clientEntries', clientEntries)

return fs.appendFile(
webDistServerEntries,
rwPaths.web.distServerEntries,
`export const clientEntries=${JSON.stringify(clientEntries)};`
)
}
12 changes: 7 additions & 5 deletions packages/vite/src/rsc/rscBuildCopyCssAssets.ts
Original file line number Diff line number Diff line change
@@ -1,21 +1,23 @@
import fs from 'fs/promises'
import path from 'path'

import { getPaths } from '@redwoodjs/project-config'

import type { rscBuildServer } from './rscBuildServer'

/**
* RSC build. Step 4.
* Copy CSS assets from server to client
*/
export function rscBuildCopyCssAssets(
serverBuildOutput: Awaited<ReturnType<typeof rscBuildServer>>,
webDist: string,
webDistServer: string
serverBuildOutput: Awaited<ReturnType<typeof rscBuildServer>>
) {
console.log('\n')
console.log('4. rscBuildCopyCssAssets')
console.log('========================\n')

const rwPaths = getPaths()

// TODO (RSC) Some css is now duplicated in two files (i.e. for client
// components). Probably don't want that.
// Also not sure if this works on "soft" rerenders (i.e. not a full page
Expand All @@ -27,8 +29,8 @@ export function rscBuildCopyCssAssets(
})
.map((cssAsset) => {
return fs.copyFile(
path.join(webDistServer, cssAsset.fileName),
path.join(webDist, cssAsset.fileName)
path.join(rwPaths.web.distServer, cssAsset.fileName),
path.join(rwPaths.web.dist, cssAsset.fileName)
)
})
)
Expand Down
8 changes: 6 additions & 2 deletions packages/vite/src/rsc/rscBuildRwEnvVars.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import fs from 'fs/promises'

import { getPaths } from '@redwoodjs/project-config'

/**
* RSC build. Step 6.
* Make RW specific env vars available to server components.
Expand All @@ -8,13 +10,15 @@ import fs from 'fs/promises'
* The import of entries.js that we're adding this to is handled by the
* RSC worker we've got set up
*/
export async function rscBuildRwEnvVars(webDistServerEntries: string) {
export async function rscBuildRwEnvVars() {
console.log('\n')
console.log('6. rscBuildRwEnvVars')
console.log('====================\n')

const rwPaths = getPaths()

await fs.appendFile(
webDistServerEntries,
rwPaths.web.distServerEntries,
`

globalThis.RWJS_API_GRAPHQL_URL = RWJS_ENV.RWJS_API_GRAPHQL_URL
Expand Down
21 changes: 8 additions & 13 deletions packages/vite/src/rsc/rscBuildServer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import react from '@vitejs/plugin-react'
import { build as viteBuild } from 'vite'

import { getWebSideDefaultBabelConfig } from '@redwoodjs/babel-config'
import { getConfig, getPaths } from '@redwoodjs/project-config'
import { getPaths } from '@redwoodjs/project-config'

import { getEnvVarDefinitions } from '../envVarDefinitions'
import { onWarn } from '../lib/onWarn'
Expand All @@ -17,7 +17,6 @@ import { rscTransformPlugin } from './rscVitePlugins'
* Generate the client bundle
*/
export async function rscBuildServer(
entriesFile: string,
clientEntryFiles: Record<string, string>,
serverEntryFiles: Record<string, string>,
customModules: Record<string, string>
Expand All @@ -26,23 +25,19 @@ export async function rscBuildServer(
console.log('3. rscBuildServer')
console.log('=================\n')

const rwPaths = getPaths()

if (!rwPaths.web.entries) {
throw new Error('RSC entries file not found')
}

const input = {
entries: entriesFile,
entries: rwPaths.web.entries,
...clientEntryFiles,
...serverEntryFiles,
...customModules,
}

console.log('input', input)

const rwPaths = getPaths()
const rwConfig = getConfig()

console.log(
'rscBuildServer.ts RWJS_EXP_RSC',
rwConfig.experimental?.rsc?.enabled
)

const serverBuildOutput = await viteBuild({
// ...configFileConfig,
root: rwPaths.web.src,
Expand Down
Loading