Skip to content

Commit 3465a96

Browse files
committed
fix: dev server error
1 parent c78f61f commit 3465a96

2 files changed

Lines changed: 74 additions & 89 deletions

File tree

src/hooks/use-bundle.ts

Lines changed: 5 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -1,96 +1,13 @@
1-
import { useAtom, useSetAtom, useStore } from "jotai";
1+
import { useSetAtom } from "jotai";
22
import { useCallback } from "react";
3-
import { bundle } from "@/lib/bundle";
4-
import {
5-
type BundleResult,
6-
bindingLoadedAtom,
7-
bindingLoadingAtom,
8-
bundleResultAtom,
9-
isBundlingAtom,
10-
latestBundleRequestIdAtom,
11-
type SourceFile,
12-
} from "@/store/bundler";
13-
import { activeOutputFileAtom } from "@/store/editor";
14-
import { rspackVersionAtom } from "@/store/version";
15-
16-
function createBundleFailure(message: string): BundleResult {
17-
return {
18-
duration: 0,
19-
output: [],
20-
formattedOutput: [],
21-
success: false,
22-
errors: [message],
23-
warnings: [],
24-
sourcemaps: new Map(),
25-
modules: [],
26-
chunks: [],
27-
chunkGroups: [],
28-
};
29-
}
3+
import { bundleActionAtom, type SourceFile } from "@/store/bundler";
304

315
export default function useBundle() {
32-
const [bindingLoadedVersion, setBindingLoadedVersion] = useAtom(bindingLoadedAtom);
33-
const setBindingLoading = useSetAtom(bindingLoadingAtom);
34-
35-
const setIsBundling = useSetAtom(isBundlingAtom);
36-
const setBundleResult = useSetAtom(bundleResultAtom);
37-
const [activeOutputFile, setActiveOutputFile] = useAtom(activeOutputFileAtom);
38-
const [rspackVersion] = useAtom(rspackVersionAtom);
39-
const store = useStore();
6+
const runBundle = useSetAtom(bundleActionAtom);
407

418
const handleBundle = useCallback(
42-
async (files: SourceFile[], versionOverride?: string) => {
43-
const requestId = store.get(latestBundleRequestIdAtom) + 1;
44-
store.set(latestBundleRequestIdAtom, requestId);
45-
const targetVersion = versionOverride ?? rspackVersion;
46-
const shouldLoadBinding = bindingLoadedVersion !== targetVersion;
47-
const isLatestRequest = () => requestId === store.get(latestBundleRequestIdAtom);
48-
49-
setIsBundling(true);
50-
if (shouldLoadBinding) {
51-
setBindingLoading(true);
52-
}
53-
54-
try {
55-
const result = await bundle(files, targetVersion);
56-
if (!isLatestRequest()) {
57-
return;
58-
}
59-
60-
setBundleResult(result);
61-
62-
if (shouldLoadBinding) {
63-
setBindingLoadedVersion(targetVersion);
64-
}
65-
66-
if (result.output.length > 0 && activeOutputFile >= result.output.length) {
67-
setActiveOutputFile(0);
68-
}
69-
} catch (error) {
70-
if (!isLatestRequest()) {
71-
return;
72-
}
73-
74-
const message = error instanceof Error ? error.message : "Failed to load rspack binding";
75-
setBundleResult(createBundleFailure(message));
76-
} finally {
77-
if (isLatestRequest()) {
78-
setBindingLoading(false);
79-
setIsBundling(false);
80-
}
81-
}
82-
},
83-
[
84-
activeOutputFile,
85-
bindingLoadedVersion,
86-
rspackVersion,
87-
setActiveOutputFile,
88-
setIsBundling,
89-
setBundleResult,
90-
setBindingLoadedVersion,
91-
setBindingLoading,
92-
store,
93-
],
9+
(files: SourceFile[], versionOverride?: string) => runBundle({ files, versionOverride }),
10+
[runBundle],
9411
);
9512

9613
return handleBundle;

src/store/bundler.ts

Lines changed: 69 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
import { atom } from "jotai";
2+
import { bundle } from "@/lib/bundle";
23
import type {
34
RspackChunkGroupInfo,
45
RspackChunkInfo,
56
RspackModuleDeps,
67
} from "@/lib/bundle/dependency";
78
import { deserializeShareData } from "@/lib/share";
9+
import { activeOutputFileAtom } from "./editor";
810
import { getPresetFiles, PresetBasicLibrary } from "./presets";
9-
import { getSafeInitRspackVersion } from "./version";
11+
import { getSafeInitRspackVersion, rspackVersionAtom } from "./version";
1012

1113
export interface SourceFile {
1214
filename: string;
@@ -26,6 +28,21 @@ export interface BundleResult {
2628
chunkGroups: RspackChunkGroupInfo[]; // chunk group graph data
2729
}
2830

31+
function createBundleFailure(message: string): BundleResult {
32+
return {
33+
duration: 0,
34+
output: [],
35+
formattedOutput: [],
36+
success: false,
37+
errors: [message],
38+
warnings: [],
39+
sourcemaps: new Map(),
40+
modules: [],
41+
chunks: [],
42+
chunkGroups: [],
43+
};
44+
}
45+
2946
function getInitFiles() {
3047
const hash = window.location.hash.slice(1);
3148
if (hash) {
@@ -45,3 +62,54 @@ export const latestBundleRequestIdAtom = atom(0);
4562
export const inputFilesAtom = atom<SourceFile[]>(getInitFiles());
4663
export const bundleResultAtom = atom<BundleResult | null>(null);
4764
export const enableFormatCode = atom(true);
65+
66+
export const bundleActionAtom = atom(
67+
null,
68+
async (
69+
get,
70+
set,
71+
{ files, versionOverride }: { files: SourceFile[]; versionOverride?: string },
72+
) => {
73+
const requestId = get(latestBundleRequestIdAtom) + 1;
74+
set(latestBundleRequestIdAtom, requestId);
75+
76+
const targetVersion = versionOverride ?? (await get(rspackVersionAtom));
77+
const shouldLoadBinding = get(bindingLoadedAtom) !== targetVersion;
78+
const isLatestRequest = () => requestId === get(latestBundleRequestIdAtom);
79+
80+
set(isBundlingAtom, true);
81+
if (shouldLoadBinding) {
82+
set(bindingLoadingAtom, true);
83+
}
84+
85+
try {
86+
const result = await bundle(files, targetVersion);
87+
if (!isLatestRequest()) {
88+
return;
89+
}
90+
91+
set(bundleResultAtom, result);
92+
93+
if (shouldLoadBinding) {
94+
set(bindingLoadedAtom, targetVersion);
95+
}
96+
97+
const activeOutputFile = get(activeOutputFileAtom);
98+
if (result.output.length > 0 && activeOutputFile >= result.output.length) {
99+
set(activeOutputFileAtom, 0);
100+
}
101+
} catch (error) {
102+
if (!isLatestRequest()) {
103+
return;
104+
}
105+
106+
const message = error instanceof Error ? error.message : "Failed to load rspack binding";
107+
set(bundleResultAtom, createBundleFailure(message));
108+
} finally {
109+
if (isLatestRequest()) {
110+
set(bindingLoadingAtom, false);
111+
set(isBundlingAtom, false);
112+
}
113+
}
114+
},
115+
);

0 commit comments

Comments
 (0)