Skip to content

Commit 40e74d5

Browse files
authored
breaking: server bundling (#36)
* wip: server bundling * rename rsc-renderer to rsc-handler * refactor rsc-plugin * prefetcher in dev * wip prefetcherRSC in builder * wip: naive build * still wip comment * eliminate server entries and simplify * 3-pass build * prerender with bad design... * wip wip buildRSC * use getBuilder in example 01-06 * wip remove prefetcher and prerenderer * migrate router for new api, still wip * refactor avoid double promise.all * wip: graceful shutdown & use client in router client * refactor without CMD * @fs hack * uninstall tsx * trying to fix some issues * wip * Revert "wip" This reverts commit be0bcd6. * take care of node_modules client modules * Revert "take care of node_modules client modules" This reverts commit cd9a909. * wip: transpile node_modules for server * hack for react-server-dom-webpack * use vite module graph for client entries in DEV * wip: a workaround for router for now * we need node 18 * configurable routes path * do not set search prop for intermediate routes (tentative) * uninstall nodemon * support hmr and server reload * no need to check root importers, and it does not work with router * add comments * clean up unused code * run prettier
1 parent 5115df4 commit 40e74d5

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+1483
-1153
lines changed

.swcrc

+1-2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,5 @@
44
"syntax": "typescript"
55
},
66
"target": "esnext"
7-
},
8-
"minify": true
7+
}
98
}

cli.js

+1-11
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,4 @@
11
#!/usr/bin/env node
22

3-
import { Worker } from "node:worker_threads";
4-
53
const cmd = process.argv[2];
6-
process.env.WAKUWORK_CMD = cmd;
7-
const execArgv = [
8-
...(cmd === "dev" ? ["--experimental-loader", "tsx"] : []),
9-
"--experimental-loader",
10-
"wakuwork/node-loader",
11-
"--experimental-loader",
12-
"react-server-dom-webpack/node-loader",
13-
];
14-
new Worker(new URL(`dist/cli-${cmd}.js`, import.meta.url), { execArgv });
4+
import(`./dist/cli-${cmd}.js`);

examples/01_counter/entries.ts

+5-16
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { GetEntry, Prefetcher, Prerenderer } from "wakuwork/server";
1+
import type { GetEntry, GetBuilder } from "wakuwork/server";
22

33
export const getEntry: GetEntry = async (id) => {
44
switch (id) {
@@ -9,21 +9,10 @@ export const getEntry: GetEntry = async (id) => {
99
}
1010
};
1111

12-
export const prefetcher: Prefetcher = async (path) => {
13-
switch (path) {
14-
case "/":
15-
return {
16-
entryItems: [["App", { name: "Wakuwork" }]],
17-
clientModules: [(await import("./src/Counter.js")).Counter],
18-
};
19-
default:
20-
return {};
21-
}
22-
};
23-
24-
export const prerenderer: Prerenderer = async () => {
12+
export const getBuilder: GetBuilder = async () => {
2513
return {
26-
entryItems: [["App", { name: "Wakuwork" }]],
27-
paths: ["/"],
14+
"/": {
15+
elements: [["App", { name: "Wakuwork" }]],
16+
},
2817
};
2918
};

examples/01_counter/package.json

-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
"react": "18.3.0-canary-aef7ce554-20230503",
1313
"react-dom": "18.3.0-canary-aef7ce554-20230503",
1414
"react-server-dom-webpack": "18.3.0-canary-aef7ce554-20230503",
15-
"tsx": "^3.12.7",
1615
"wakuwork": "~0.9.4"
1716
},
1817
"devDependencies": {

examples/02_async/entries.ts

+5-16
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { GetEntry, Prefetcher, Prerenderer } from "wakuwork/server";
1+
import type { GetEntry, GetBuilder } from "wakuwork/server";
22

33
export const getEntry: GetEntry = async (id) => {
44
switch (id) {
@@ -9,21 +9,10 @@ export const getEntry: GetEntry = async (id) => {
99
}
1010
};
1111

12-
export const prefetcher: Prefetcher = async (path) => {
13-
switch (path) {
14-
case "/":
15-
return {
16-
entryItems: [["App", { name: "Wakuwork" }]],
17-
clientModules: [(await import("./src/Counter.js")).Counter],
18-
};
19-
default:
20-
return {};
21-
}
22-
};
23-
24-
export const prerenderer: Prerenderer = async () => {
12+
export const getBuilder: GetBuilder = async () => {
2513
return {
26-
entryItems: [["App", { name: "Wakuwork" }]],
27-
paths: ["/"],
14+
"/": {
15+
elements: [["App", { name: "Wakuwork" }]],
16+
},
2817
};
2918
};

examples/02_async/package.json

-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
"react": "18.3.0-canary-aef7ce554-20230503",
1313
"react-dom": "18.3.0-canary-aef7ce554-20230503",
1414
"react-server-dom-webpack": "18.3.0-canary-aef7ce554-20230503",
15-
"tsx": "^3.12.7",
1615
"wakuwork": "~0.9.4"
1716
},
1817
"devDependencies": {

examples/03_promise/entries.ts

+5-16
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { GetEntry, Prefetcher, Prerenderer } from "wakuwork/server";
1+
import type { GetEntry, GetBuilder } from "wakuwork/server";
22

33
export const getEntry: GetEntry = async (id) => {
44
switch (id) {
@@ -9,21 +9,10 @@ export const getEntry: GetEntry = async (id) => {
99
}
1010
};
1111

12-
export const prefetcher: Prefetcher = async (path) => {
13-
switch (path) {
14-
case "/":
15-
return {
16-
entryItems: [["App", { name: "Wakuwork" }]],
17-
clientModules: [(await import("./src/Counter.js")).Counter],
18-
};
19-
default:
20-
return {};
21-
}
22-
};
23-
24-
export const prerenderer: Prerenderer = async () => {
12+
export const getBuilder: GetBuilder = async () => {
2513
return {
26-
entryItems: [["App", { name: "Wakuwork" }]],
27-
paths: ["/"],
14+
"/": {
15+
elements: [["App", { name: "Wakuwork" }]],
16+
},
2817
};
2918
};

examples/03_promise/package.json

-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
"react": "18.3.0-canary-aef7ce554-20230503",
1313
"react-dom": "18.3.0-canary-aef7ce554-20230503",
1414
"react-server-dom-webpack": "18.3.0-canary-aef7ce554-20230503",
15-
"tsx": "^3.12.7",
1615
"wakuwork": "~0.9.4"
1716
},
1817
"devDependencies": {

examples/04_callserver/entries.ts

+5-16
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { GetEntry, Prefetcher, Prerenderer } from "wakuwork/server";
1+
import type { GetEntry, GetBuilder } from "wakuwork/server";
22

33
export const getEntry: GetEntry = async (id) => {
44
switch (id) {
@@ -9,21 +9,10 @@ export const getEntry: GetEntry = async (id) => {
99
}
1010
};
1111

12-
export const prefetcher: Prefetcher = async (path) => {
13-
switch (path) {
14-
case "/":
15-
return {
16-
entryItems: [["App", { name: "Wakuwork" }]],
17-
clientModules: [(await import("./src/Counter.js")).Counter],
18-
};
19-
default:
20-
return {};
21-
}
22-
};
23-
24-
export const prerenderer: Prerenderer = async () => {
12+
export const getBuilder: GetBuilder = async () => {
2513
return {
26-
entryItems: [["App", { name: "Wakuwork" }]],
27-
paths: ["/"],
14+
"/": {
15+
elements: [["App", { name: "Wakuwork" }]],
16+
},
2817
};
2918
};

examples/04_callserver/package.json

-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
"react": "18.3.0-canary-aef7ce554-20230503",
1313
"react-dom": "18.3.0-canary-aef7ce554-20230503",
1414
"react-server-dom-webpack": "18.3.0-canary-aef7ce554-20230503",
15-
"tsx": "^3.12.7",
1615
"wakuwork": "~0.9.4"
1716
},
1817
"devDependencies": {

examples/05_mutation/entries.ts

+5-16
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { GetEntry, Prefetcher, Prerenderer } from "wakuwork/server";
1+
import type { GetEntry, GetBuilder } from "wakuwork/server";
22

33
export const getEntry: GetEntry = async (id) => {
44
switch (id) {
@@ -9,21 +9,10 @@ export const getEntry: GetEntry = async (id) => {
99
}
1010
};
1111

12-
export const prefetcher: Prefetcher = async (path) => {
13-
switch (path) {
14-
case "/":
15-
return {
16-
entryItems: [["App", { name: "Wakuwork" }]],
17-
clientModules: [(await import("./src/Counter.js")).Counter],
18-
};
19-
default:
20-
return {};
21-
}
22-
};
23-
24-
export const prerenderer: Prerenderer = async () => {
12+
export const getBuilder: GetBuilder = async () => {
2513
return {
26-
entryItems: [["App", { name: "Wakuwork" }]],
27-
paths: ["/"],
14+
"/": {
15+
elements: [["App", { name: "Wakuwork" }]],
16+
},
2817
};
2918
};

examples/05_mutation/package.json

-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
"react": "18.3.0-canary-aef7ce554-20230503",
1313
"react-dom": "18.3.0-canary-aef7ce554-20230503",
1414
"react-server-dom-webpack": "18.3.0-canary-aef7ce554-20230503",
15-
"tsx": "^3.12.7",
1615
"wakuwork": "~0.9.4"
1716
},
1817
"devDependencies": {

examples/06_nesting/entries.ts

+13-27
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { GetEntry, Prefetcher, Prerenderer } from "wakuwork/server";
1+
import type { GetEntry, GetBuilder } from "wakuwork/server";
22

33
export const getEntry: GetEntry = async (id) => {
44
switch (id) {
@@ -11,32 +11,18 @@ export const getEntry: GetEntry = async (id) => {
1111
}
1212
};
1313

14-
export const prefetcher: Prefetcher = async (path) => {
15-
switch (path) {
16-
case "/":
17-
return {
18-
entryItems: [
19-
["App", { name: "Wakuwork" }],
20-
["InnerApp", { count: 0 }],
21-
],
22-
clientModules: [(await import("./src/Counter.js")).Counter],
23-
};
24-
default:
25-
return {};
26-
}
27-
};
28-
29-
export const prerenderer: Prerenderer = async () => {
14+
export const getBuilder: GetBuilder = async () => {
3015
return {
31-
entryItems: [
32-
["App", { name: "Wakuwork" }],
33-
["InnerApp", { count: 0 }],
34-
["InnerApp", { count: 1 }],
35-
["InnerApp", { count: 2 }],
36-
["InnerApp", { count: 3 }],
37-
["InnerApp", { count: 4 }],
38-
["InnerApp", { count: 5 }],
39-
],
40-
paths: ["/"],
16+
"/": {
17+
elements: [
18+
["App", { name: "Wakuwork" }],
19+
["InnerApp", { count: 0 }],
20+
["InnerApp", { count: 1 }, true],
21+
["InnerApp", { count: 2 }, true],
22+
["InnerApp", { count: 3 }, true],
23+
["InnerApp", { count: 4 }, true],
24+
["InnerApp", { count: 5 }, true],
25+
],
26+
},
4127
};
4228
};

examples/06_nesting/package.json

-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
"react": "18.3.0-canary-aef7ce554-20230503",
1313
"react-dom": "18.3.0-canary-aef7ce554-20230503",
1414
"react-server-dom-webpack": "18.3.0-canary-aef7ce554-20230503",
15-
"tsx": "^3.12.7",
1615
"wakuwork": "~0.9.4"
1716
},
1817
"devDependencies": {

examples/07_router/entries.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import url from "node:url";
33

44
import { fileRouter } from "wakuwork/router/server";
55

6-
export const { getEntry, prefetcher, prerenderer } = fileRouter(
7-
path.join(path.dirname(url.fileURLToPath(import.meta.url)), "routes")
6+
export const { getEntry, getBuilder, getCustomModules } = fileRouter(
7+
path.dirname(url.fileURLToPath(import.meta.url)),
8+
"routes"
89
);

examples/07_router/package.json

-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
"react": "18.3.0-canary-aef7ce554-20230503",
1313
"react-dom": "18.3.0-canary-aef7ce554-20230503",
1414
"react-server-dom-webpack": "18.3.0-canary-aef7ce554-20230503",
15-
"tsx": "^3.12.7",
1615
"wakuwork": "~0.9.4"
1716
},
1817
"devDependencies": {

package.json

+6-9
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
},
1111
"exports": {
1212
"./package.json": "./package.json",
13-
"./node-loader": "./dist/node-loader.js",
1413
".": {
1514
"types": "./dist/main.d.ts",
1615
"default": "./dist/main.js"
@@ -48,29 +47,30 @@
4847
"compile:types": "tsc --project tsconfig.build.json",
4948
"test": "tsc --project . --noEmit",
5049
"e2e": "cd e2e/01 && playwright test && cd ../02 && playwright test",
51-
"examples:dev": "WAKUWORK_CONFIG=\"{\\\"devServer\\\":{\\\"dir\\\":\\\"./examples/${NAME}\\\"}}\" nodemon --ext ts,tsx --ignore ./examples/${NAME}/src/Counter.tsx --exec 'npm run compile:code && ./cli.js dev'",
50+
"examples:dev": "npm run compile:code && WAKUWORK_CONFIG=\"{\\\"devServer\\\":{\\\"dir\\\":\\\"./examples/${NAME}\\\"}}\" ./cli.js dev",
5251
"examples:dev:01_counter": "NAME=01_counter npm run examples:dev",
5352
"examples:dev:02_async": "NAME=02_async npm run examples:dev",
5453
"examples:dev:03_promise": "NAME=03_promise npm run examples:dev",
5554
"examples:dev:04_callserver": "NAME=04_callserver npm run examples:dev",
5655
"examples:dev:05_mutation": "NAME=05_mutation npm run examples:dev",
5756
"examples:dev:06_nesting": "NAME=06_nesting npm run examples:dev",
5857
"examples:dev:07_router": "NAME=07_router npm run examples:dev",
59-
"examples:prd": "npm run compile:code && WAKUWORK_CONFIG=\"{\\\"build\\\":{\\\"dir\\\":\\\"./examples/${NAME}\\\"}}\" ./cli.js build && WAKUWORK_CONFIG=\"{\\\"prdServer\\\":{\\\"dir\\\":\\\"./examples/${NAME}/dist\\\"}}\" ./cli.js start",
58+
"examples:build": "npm run compile:code && WAKUWORK_CONFIG=\"{\\\"build\\\":{\\\"dir\\\":\\\"./examples/${NAME}\\\"}}\" ./cli.js build",
59+
"examples:prd": "npm run examples:build && WAKUWORK_CONFIG=\"{\\\"prdServer\\\":{\\\"dir\\\":\\\"./examples/${NAME}/dist\\\"}}\" ./cli.js start",
6060
"examples:prd:01_counter": "NAME=01_counter npm run examples:prd",
6161
"examples:prd:02_async": "NAME=02_async npm run examples:prd",
6262
"examples:prd:03_promise": "NAME=03_promise npm run examples:prd",
6363
"examples:prd:04_callserver": "NAME=04_callserver npm run examples:prd",
6464
"examples:prd:05_mutation": "NAME=05_mutation npm run examples:prd",
6565
"examples:prd:06_nesting": "NAME=06_nesting npm run examples:prd",
6666
"examples:prd:07_router": "NAME=07_router npm run examples:prd",
67-
"website:dev": "WAKUWORK_CONFIG=\"{\\\"devServer\\\":{\\\"dir\\\":\\\"./website\\\"}}\" nodemon --ext ts,tsx --exec 'npm run compile:code && ./cli.js dev'",
67+
"website:dev": "npm run compile:code && WAKUWORK_CONFIG=\"{\\\"devServer\\\":{\\\"dir\\\":\\\"./website\\\"}}\" ./cli.js dev",
6868
"website:build": "npm run compile:code && WAKUWORK_CONFIG=\"{\\\"build\\\":{\\\"dir\\\":\\\"./website\\\"}}\" ./cli.js build",
6969
"website:prd": "npm run website:build && WAKUWORK_CONFIG=\"{\\\"prdServer\\\":{\\\"dir\\\":\\\"./website/dist\\\"}}\" ./cli.js start"
7070
},
7171
"license": "MIT",
7272
"engines": {
73-
"node": ">=16.17.0"
73+
"node": ">=18.0.0"
7474
},
7575
"dependencies": {
7676
"@swc/core": "1.3.56",
@@ -89,19 +89,16 @@
8989
"@types/react": "^18.2.5",
9090
"@types/react-dom": "^18.2.3",
9191
"autoprefixer": "^10.4.14",
92-
"nodemon": "^2.0.22",
9392
"postcss": "^8.4.23",
9493
"react": "18.3.0-canary-aef7ce554-20230503",
9594
"react-dom": "18.3.0-canary-aef7ce554-20230503",
9695
"react-server-dom-webpack": "18.3.0-canary-aef7ce554-20230503",
9796
"tailwindcss": "^3.3.2",
98-
"tsx": "^3.12.7",
9997
"typescript": "^5.0.4",
10098
"wakuwork": "link:."
10199
},
102100
"peerDependencies": {
103101
"react": "18.3.0-canary-aef7ce554-20230503",
104-
"react-server-dom-webpack": "18.3.0-canary-aef7ce554-20230503",
105-
"tsx": "^3.12.6"
102+
"react-server-dom-webpack": "18.3.0-canary-aef7ce554-20230503"
106103
}
107104
}

0 commit comments

Comments
 (0)