Skip to content

Commit

Permalink
Try out esbuild-wasm with smaller react pragmas
Browse files Browse the repository at this point in the history
  • Loading branch information
askoufis committed Nov 3, 2023
1 parent 74be8e3 commit ffa1527
Show file tree
Hide file tree
Showing 5 changed files with 41 additions and 37 deletions.
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,6 @@
"@babel/preset-env": "^7.20.2",
"@babel/preset-react": "^7.18.6",
"@babel/preset-typescript": "^7.18.6",
"@babel/standalone": "^7.20.6",
"@soda/friendly-errors-webpack-plugin": "^1.8.1",
"@types/base64-url": "^2.2.0",
"@types/codemirror": "^5.60.5",
Expand All @@ -83,6 +82,7 @@
"css-loader": "^6.7.2",
"current-git-branch": "^1.1.0",
"dedent": "^0.7.0",
"esbuild-wasm": "^0.19.5",
"fast-glob": "^3.2.12",
"find-up": "^5.0.0",
"fuzzy": "^0.1.3",
Expand Down Expand Up @@ -134,6 +134,7 @@
},
"packageManager": "pnpm@7.18.1",
"volta": {
"pnpm": "7.18.1",
"node": "16.13.0"
}
}
15 changes: 8 additions & 7 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 3 additions & 2 deletions src/Playroom/Frames/Frames.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,9 @@ export default function Frames({ code, themes, widths }: FramesProps) {

useEffect(() => {
try {
const newCode = compileJsx(code);
setRenderCode(newCode);
compileJsx(code).then(({ code: newCode }) => {
setRenderCode(newCode);
});
} catch (e) {}
}, [code]);

Expand Down
37 changes: 22 additions & 15 deletions src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { renderElement } from './render';
import Playroom from './Playroom/Playroom';
import { StoreProvider } from './StoreContext/StoreContext';
import playroomConfig from './config';
import * as esbuild from 'esbuild-wasm';

const polyfillIntersectionObserver = () =>
typeof window.IntersectionObserver !== 'undefined'
Expand All @@ -26,21 +27,27 @@ polyfillIntersectionObserver().then(() => {
Object.entries(components).filter(([_, value]) => value)
);

renderElement(
<StoreProvider themes={themeNames} widths={widths}>
<Playroom
components={filteredComponents}
widths={widths}
themes={themeNames}
snippets={
typeof snippets.default !== 'undefined'
? snippets.default
: snippets
}
/>
</StoreProvider>,
outlet
);
esbuild
.initialize({
wasmURL: 'https://unpkg.com/esbuild-wasm/esbuild.wasm',
})
.then(() => {
renderElement(
<StoreProvider themes={themeNames} widths={widths}>
<Playroom
components={filteredComponents}
widths={widths}
themes={themeNames}
snippets={
typeof snippets.default !== 'undefined'
? snippets.default
: snippets
}
/>
</StoreProvider>,
outlet
);
});
};
renderPlayroom();

Expand Down
18 changes: 6 additions & 12 deletions src/utils/compileJsx.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { transform } from '@babel/standalone';
import { transform as esbuildTransform } from 'esbuild-wasm';

export const ReactFragmentPragma = 'R_F';
export const ReactCreateElementPragma = 'R_cE';
Expand All @@ -7,17 +7,11 @@ export const openFragmentTag = '<>';
export const closeFragmentTag = '</>';

export const compileJsx = (code: string) =>
transform(`${openFragmentTag}${code.trim()}${closeFragmentTag}`, {
presets: [
[
'react',
{
pragma: ReactCreateElementPragma,
pragmaFrag: ReactFragmentPragma,
},
],
],
}).code;
esbuildTransform(`${openFragmentTag}${code.trim()}${closeFragmentTag}`, {
loader: 'jsx',
jsxFactory: ReactCreateElementPragma,
jsxFragment: ReactFragmentPragma,
});

export const validateCode = (code: string) => {
try {
Expand Down

0 comments on commit ffa1527

Please sign in to comment.