utquidem
Version:
The meta-framework suite designed from scratch for frontend-focused modern web development.
57 lines (44 loc) • 1.38 kB
text/typescript
import path from 'path';
import { ChunkExtractor } from '@loadable/server';
import { RenderHandler } from './type';
function getLoadableScripts(extractor: ChunkExtractor) {
const check = (scripts: string) =>
(scripts || '').includes('__LOADABLE_REQUIRED_CHUNKS___ext');
const scripts = extractor.getScriptTags();
if (!check(scripts)) {
return '';
}
return (
scripts
.split('</script>')
// 前两个 script为 loadable 必须的 script
.slice(0, 2)
.map(i => `${i}</script>`)
.join('')
);
}
export const toHtml: RenderHandler = (jsx, renderer, next) => {
const {
loadableManifest,
result: { chunksMap },
} = renderer;
if (!loadableManifest || chunksMap.js) {
return next(jsx);
}
const extractor = new ChunkExtractor({
statsFile: loadableManifest,
entrypoints: [renderer.entryName],
});
const html = next(extractor.collectChunks(jsx));
const chunks = extractor.getChunkAssets(extractor.chunks);
chunksMap.js = (chunksMap.js || '') + getLoadableScripts(extractor);
for (const v of chunks) {
const fileType = path.extname(v.url).slice(1);
if (fileType === 'js') {
chunksMap[fileType] += `<script src="${v.url}"></script>`;
} else if (fileType === 'css') {
chunksMap[fileType] += `<link href="${v.url}" rel="stylesheet" />`;
}
}
return html;
};