Skip to content

Commit

Permalink
wip: build manager
Browse files Browse the repository at this point in the history
  • Loading branch information
hi-ogawa committed Sep 29, 2024
1 parent 59b86d8 commit 61faa36
Showing 1 changed file with 54 additions and 7 deletions.
61 changes: 54 additions & 7 deletions examples/web-worker/vite.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,33 +36,63 @@ export default defineConfig((_env) => ({
build: {
outDir: "dist/worker",
minify: false,
modulePreload: false,
rollupOptions: {
input: {
unused: `data:text/javascript,console.log("unused")`,
_unused: "data:text/javascript,console.log(`unused`)",
},
},
},
},
},

builder: {
// sharedConfigBuild: true,
async buildApp(builder) {
// TODO
// extra build to discover worker imports
// TODO: need to discvoer worker in worker as well
manager.workerScan = true;
await builder.build(builder.environments["client"]!);
manager.workerScan = false;

await builder.build(builder.environments["worker"]!);
// await builder.build(builder.environments["client"]!);
},
},
}));

// singleton to survive multiple environment builds
const manager = new (class PluginStateManager {
workerScan = false;
workerEntries = new Set<string>();
workerReferenceIdMap = new Map<string, string>();
})();

export function vitePluginWorkerRunner(): Plugin[] {
const workerEntryPlugin: Plugin = {
name: vitePluginWorkerRunner.name + ":entry",
const workerImportPlugin: Plugin = {
name: vitePluginWorkerRunner.name + ":import",
sharedDuringBuild: true,
transform(_code, id) {
// rewrite ?worker-runner import
if (id.endsWith("?worker-runner")) {
const workerUrl = id.replace("?worker-runner", "?worker-runner-file");
return `export default ${JSON.stringify(workerUrl)}`;
// dev: pass url directly to `new Worker("<id>?worker-runner-file")`
if (this.environment.mode === "dev") {
return `export default ${JSON.stringify(workerUrl)}`;
}
// build:
if (this.environment.mode === "build") {
if (manager.workerScan) {
// client -> worker (scan)
manager.workerEntries.add(id.replace("?worker-runner", ""));
} else if (this.environment.name === "worker") {
// worker -> worker (build)
// TODO
} else if (this.environment.name === "client") {
// client -> worker (build)
// TODO
}
}
return `export default "todo-build"`;
}

// rewrite worker entry to import it from runner
Expand All @@ -89,5 +119,22 @@ export function vitePluginWorkerRunner(): Plugin[] {
},
};

return [workerEntryPlugin];
const workerBuildPlugin: Plugin = {
name: vitePluginWorkerRunner.name + ":build",
apply: "build",
sharedDuringBuild: true,
buildStart() {
if (this.environment.name === "worker") {
for (const entry of manager.workerEntries) {
const referenceId = this.emitFile({
type: "chunk",
id: entry,
});
manager.workerReferenceIdMap.set(entry, referenceId);
}
}
},
};

return [workerImportPlugin, workerBuildPlugin];
}

0 comments on commit 61faa36

Please sign in to comment.