Skip to content

Commit 6333ede

Browse files
feat: streaming rendering added
1 parent 82d71a6 commit 6333ede

File tree

3 files changed

+98
-2
lines changed

3 files changed

+98
-2
lines changed

src/components/ReactCodeBlock/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ const ReactCodeBlock = ({ value, linesInPrimary = [], linesInSecondary = [] }) =
3535
}}
3636
language='jsx'
3737
// TODO: delete when release
38-
// showLineNumbers
38+
showLineNumbers
3939
style={okaidia}>
4040
{value}
4141
</SyntaxHighlighter>

src/hoc/GitHubMarkdownWrapper/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ const GitHubMarkdownWrapper = ({ children, className }) => {
2525
<div className={clsx('markdown-body', className)}>
2626
{children}
2727
</div>
28-
);
28+
);
2929
};
3030

3131
export default GitHubMarkdownWrapper;

src/utils/data/concepts.js

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -357,6 +357,102 @@ textDescription:`
357357
linesInPrimary: [4, 5, 10, 11, 12, 13, 15, 16, 17, 38, 39, 42, 43, 44, 45, 49, 54, 55, 56]
358358
},
359359
{
360+
id: 'streaming-rendering',
361+
optionName: 'Streaming Rendering',
362+
codeSnippet:
363+
`// server/index.js
364+
import express from 'express';
365+
import React from 'react';
366+
import { ChunkExtractor } from '@loadable/server';
367+
import { renderToNodeStream } from 'react-dom/server';
368+
369+
const app = express();
370+
371+
app.get('*', (req, res) => {
372+
res.write('<html><head><title>Test</title></head><body>');
373+
const statsFile = path.resolve('../dist/loadable-stats.json');
374+
const extractor = new ChunkExtractor({statsFile});
375+
const jsx = extractor.collectChunks(<App />);
376+
const stream = renderToNodeStream(jsx);
377+
378+
stream.pipe(res, {end: false});
379+
stream.on('end', () =>
380+
res.end(\`\${chunkExtractor.getScriptTags()}</body></html>\`)
381+
);
382+
});
383+
...
384+
385+
// client/index.js
386+
import React from 'react';
387+
import { hydrate } from 'react-dom';
388+
import { loadableReady } from '@loadable/component';
389+
import App from './App';
390+
391+
loadableReady(() => {
392+
const root = document.getElementById('root');
393+
hydrate(<App />, root);
394+
});
395+
396+
// client/App.js
397+
import React from 'react';
398+
import loadable from '@loadable/component';
399+
import Messages from './Messages';
400+
import MessageForm from './MessageForm';
401+
import ErrorBoundary from './ErrorBoundary';
402+
403+
const EmojiPicker = loadable(() => import('./EmojiPicker'), {
404+
fallback: <p>Loading...</p>
405+
});
406+
407+
const Chats = () => {
408+
...
409+
return (
410+
<ErrorBoundary>
411+
<div>
412+
<Messages />
413+
<MessageForm />
414+
{isEmojiPickerOpen && (
415+
<EmojiPicker />
416+
)}
417+
</div>
418+
</ErrorBoundary>
419+
);
420+
};
421+
422+
const App = () => (
423+
<div>
424+
...
425+
<Chats />
426+
</div>
427+
);
428+
429+
export default App;`,
430+
textDescription:`
431+
1. Install [@loadable/babel-plugin](https://www.npmjs.com/package/@loadable/babel-plugin) and setup \`.babelrc\` in order to transpile your server-side code.
432+
\`\`\`
433+
// .babelrc
434+
{
435+
"plugins": ["@loadable/babel-plugin"]
436+
}
437+
\`\`\`
438+
2. Install [@loadable/webpack-plugin](https://www.npmjs.com/package/@loadable/webpack-plugin) and setup \`webpack\` to generate the stats file \`loadable-stats.json\`.
439+
\`\`\`
440+
// webpack.config.js
441+
const LoadablePlugin = require('@loadable/webpack-plugin');
442+
443+
module.exports = {
444+
// ...
445+
plugins: [new LoadablePlugin()],
446+
}
447+
\`\`\`
448+
449+
#### References:
450+
* [(Loadable Components doc) Server Side Rendering / Streaming rendering](https://loadable-components.com/docs/server-side-rendering/#streaming-rendering)
451+
* [(React docs) ReactDOMServer / renderToNodeStream()](https://reactjs.org/docs/react-dom-server.html#rendertonodestream)
452+
`,
453+
linesInPrimary: [10, 11, 12, 13, 14, 16, 17, 18, 19]
454+
},
455+
{
360456
id: 'import-on-visibility',
361457
optionName: 'Import on visibility',
362458
codeSnippet:

0 commit comments

Comments
 (0)