Skip to content

Commit bdfa90c

Browse files
committed
perf: babel-transform for jsx only
1 parent 7d80ea2 commit bdfa90c

File tree

4 files changed

+52
-47
lines changed

4 files changed

+52
-47
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
"typescript": "3.5.2"
4141
},
4242
"scripts": {
43-
"deploy": "npm run build && gh-pages -d ./build -b master -r https://github.com/coldemo/coldemo.github.io",
43+
"deploy": "npm run build && gh-pages -d ./build -b master -r git@github.com:coldemo/coldemo.github.io.git",
4444
"dev": "npm start",
4545
"start": "react-scripts start",
4646
"build": "react-scripts build",

src/playground/Playground.tsx

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import {
3131
loadCss,
3232
appendJs,
3333
appendCss,
34+
wrapCode,
3435
} from './util';
3536

3637
Object.assign(window, {
@@ -124,18 +125,24 @@ export let Playground: React.FC = () => {
124125

125126
Object.assign(window, { setRendering }); // without side-effect
126127

127-
let doPreview = useCallback(async (code: string) => {
128-
if (!code) return;
129-
setCompiling(true);
130-
try {
131-
let res = await babelTransform(code);
132-
setPreview(res);
133-
} catch (err) {
134-
displayError(err);
135-
} finally {
136-
setCompiling(false);
137-
}
138-
}, []);
128+
let doPreview = useCallback(
129+
async (code: string) => {
130+
if (!code) return;
131+
setCompiling(true);
132+
try {
133+
let res = wrapCode(code);
134+
if (file && file.endsWith('.jsx')) {
135+
res = await babelTransform(res);
136+
}
137+
setPreview(res);
138+
} catch (err) {
139+
displayError(err);
140+
} finally {
141+
setCompiling(false);
142+
}
143+
},
144+
[file]
145+
);
139146

140147
// let persistEditor = useCallback((code: string) => {
141148
// localStorage.setItem(storeKeyCode, code);

src/playground/babelMaster.ts

Lines changed: 1 addition & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,7 @@
11
let worker = new Worker('./babel-worker.js');
22

3-
let wrapCode = (code: string) => {
4-
return `
5-
(async () => {
6-
setRendering(true)
7-
// mountNode.innerHTML = '' // can cause error in react
8-
ReactDOM.unmountComponentAtNode(mountNode)
9-
try {
10-
let { useRef, useMemo, useState, useEffect, useLayoutEffect, useReducer, useContext, useCallback, useImperativeHandle } = React
11-
;;${code};;
12-
13-
let isVueLike = _.isPlainObject(App)
14-
if (isVueLike) {
15-
if (!mountNode.children[0]) {
16-
let innerNode = document.createElement('div')
17-
mountNode.appendChild(innerNode)
18-
}
19-
let curr = mountNode.children[0]
20-
new Vue(App).$mount(curr)
21-
} else {
22-
ReactDOM.render(<App />, mountNode)
23-
}
24-
} catch (err) {
25-
console.error(['displayError', err])
26-
displayError(err)
27-
} finally {
28-
setRendering(false)
29-
}
30-
})()
31-
`.trim();
32-
};
33-
343
export let babelTransform = async (code: string): Promise<string> => {
354
return new Promise((resolve, reject) => {
36-
let fullCode = wrapCode(code);
37-
385
worker.onerror = e => {
396
console.error(['worker onerror', e]);
407
reject(new Error(`worker onerror - ${code.slice(0, 100)}`));
@@ -48,6 +15,6 @@ export let babelTransform = async (code: string): Promise<string> => {
4815
resolve(res.data as string);
4916
}
5017
};
51-
worker.postMessage(fullCode);
18+
worker.postMessage(code);
5219
});
5320
};

src/playground/util.tsx

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,3 +80,34 @@ export let appendCss = (code: string) => {
8080
el.innerHTML = code;
8181
window.mountNode.appendChild(el);
8282
};
83+
84+
export let wrapCode = (code: string) => {
85+
return `
86+
(async () => {
87+
setRendering(true)
88+
// mountNode.innerHTML = '' // can cause error in react
89+
ReactDOM.unmountComponentAtNode(mountNode)
90+
try {
91+
let { useRef, useMemo, useState, useEffect, useLayoutEffect, useReducer, useContext, useCallback, useImperativeHandle } = React
92+
;;${code};;
93+
94+
let isVueLike = _.isPlainObject(App)
95+
if (isVueLike) {
96+
if (!mountNode.children[0]) {
97+
let innerNode = document.createElement('div')
98+
mountNode.appendChild(innerNode)
99+
}
100+
let curr = mountNode.children[0]
101+
new Vue(App).$mount(curr)
102+
} else {
103+
ReactDOM.render(React.createElement(App), mountNode)
104+
}
105+
} catch (err) {
106+
console.error(['displayError', err])
107+
displayError(err)
108+
} finally {
109+
setRendering(false)
110+
}
111+
})()
112+
`.trim();
113+
};

0 commit comments

Comments
 (0)