fully-react
Version:
React Server for Vite
121 lines (120 loc) • 3.33 kB
JavaScript
// src/rsc-worker.ts
import { build, createServer } from "vite";
import { existsSync, readFileSync } from "node:fs";
import { fileURLToPath } from "node:url";
import { join } from "node:path";
import { parentPort } from "node:worker_threads";
var server;
parentPort?.addListener("message", handleMessage);
parentPort?.postMessage("ready");
async function handleMessage(msg) {
const event = JSON.parse(msg);
if (event.type === "render") {
let streamToMessageChannel2 = function(stream, onMessage) {
const forwardReader = stream.getReader();
const textDecoder = new TextDecoder();
function read() {
forwardReader.read().then(({ done, value }) => {
if (done) {
onMessage("end");
} else {
onMessage(textDecoder.decode(value));
read();
}
});
}
read();
};
var streamToMessageChannel = streamToMessageChannel2;
if (!server) {
server = await createServer({
optimizeDeps: {
// It's recommended to disable deps optimization
disabled: true
},
plugins: [
{
name: "fully-react-hmr",
handleHotUpdate(ctx) {
console.log(ctx);
parentPort?.postMessage(JSON.stringify({ type: "reload" }));
}
}
]
});
await server.pluginContainer.buildStart({});
}
const { default: entry } = await server.ssrLoadModule(
fileURLToPath(new URL("./entry-rsc.development.js", import.meta.url))
);
try {
const stream = await entry(event.src, event.props);
streamToMessageChannel2(stream, (msg2) => {
parentPort?.postMessage(JSON.stringify({ chunk: msg2, id: event.id }));
});
} catch (e) {
console.error(e);
}
} else if (event.type === "build") {
await build({
build: {
ssr: true,
target: "node18",
manifest: true,
ssrManifest: true,
minify: process.env.MINIFY === "true",
rollupOptions: {
treeshake: true,
external: [
"node:path",
"node:fs",
"node:async_hooks",
"node:url",
"@prisma/client",
"@auth/core",
"fs",
"path",
"url"
]
}
},
resolve: {
conditions: ["node", "import", "react-server", "production"]
},
ssr: {
noExternal: true
}
});
const root = process.cwd();
let clientModules = [];
let serverModules = [];
if (existsSync(join(root, "dist", "react-server", "client-manifest.json"))) {
clientModules = JSON.parse(
readFileSync(
join(root, "dist", "react-server", "client-manifest.json"),
{
encoding: "utf8"
}
)
);
}
if (existsSync(join(root, "dist", "react-server", "server-manifest.json"))) {
serverModules = JSON.parse(
readFileSync(
join(root, "dist", "react-server", "server-manifest.json"),
{
encoding: "utf8"
}
)
);
}
parentPort?.postMessage(
JSON.stringify({
id: event.id,
status: "built",
clientModules,
serverModules
})
);
}
}