Skip to content
This repository was archived by the owner on Jan 11, 2023. It is now read-only.

Commit 965e589

Browse files
committed
Preload CSS and JS dependencies
1 parent f3e9fc4 commit 965e589

File tree

5 files changed

+53
-26
lines changed

5 files changed

+53
-26
lines changed

package-lock.json

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
"puppeteer": "^3.3.0",
4646
"require-relative": "^0.8.7",
4747
"rollup": "^1.17.0",
48+
"rollup-dependency-tree": "^0.0.1",
4849
"rollup-plugin-commonjs": "^10.0.1",
4950
"rollup-plugin-json": "^4.0.0",
5051
"rollup-plugin-node-resolve": "^5.2.0",

runtime/src/server/middleware/get_page_handler.ts

Lines changed: 33 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -50,44 +50,56 @@ export function get_page_handler(
5050
bundler: 'rollup' | 'webpack',
5151
shimport: string | null,
5252
assets: Record<string, string | string[]>,
53+
dependencies: Record<string, string[]>,
54+
css: {
55+
main: string | null,
56+
chunks: Record<string, string[]>
57+
},
5358
legacy_assets?: Record<string, string>
54-
} = get_build_info();
59+
} = get_build_info();
5560

5661
res.setHeader('Content-Type', 'text/html');
5762
res.setHeader('Cache-Control', dev ? 'no-cache' : 'max-age=600');
5863

5964
// preload main.js and current route
60-
// TODO detect other stuff we can preload? images, CSS, fonts?
61-
let preloaded_chunks = Array.isArray(build_info.assets.main) ? build_info.assets.main : [build_info.assets.main];
65+
// TODO detect other stuff we can preload like fonts?
66+
let preload_files = Array.isArray(build_info.assets.main) ? build_info.assets.main : [build_info.assets.main];
6267
if (!error && !is_service_worker_index) {
6368
page.parts.forEach(part => {
6469
if (!part) return;
6570

6671
// using concat because it could be a string or an array. thanks webpack!
67-
preloaded_chunks = preloaded_chunks.concat(build_info.assets[part.name]);
72+
preload_files = preload_files.concat(build_info.assets[part.name]);
6873
});
6974
}
7075

76+
let es6_preload = false;
7177
if (build_info.bundler === 'rollup') {
72-
// TODO add dependencies and CSS
73-
const link = preloaded_chunks
74-
.filter(file => file && !file.match(/\.map$/))
75-
.map(file => `<${req.baseUrl}/client/${file}>;rel="modulepreload"`)
76-
.join(', ');
77-
78-
res.setHeader('Link', link);
79-
} else {
80-
const link = preloaded_chunks
81-
.filter(file => file && !file.match(/\.map$/))
82-
.map((file) => {
83-
const as = /\.css$/.test(file) ? 'style' : 'script';
84-
return `<${req.baseUrl}/client/${file}>;rel="preload";as="${as}"`;
85-
})
86-
.join(', ');
87-
88-
res.setHeader('Link', link);
78+
79+
es6_preload = true;
80+
81+
const route = page.parts[page.parts.length - 1].file;
82+
83+
// JS
84+
preload_files = preload_files.concat(build_info.dependencies[route]);
85+
86+
// CSS
87+
preload_files = preload_files.concat(build_info.css.main);
88+
preload_files = preload_files.concat(build_info.css.chunks[route]);
8989
}
9090

91+
const link = preload_files
92+
.filter((v, i, a) => a.indexOf(v) === i) // remove any duplicates
93+
.filter(file => file && !file.match(/\.map$/)) // exclude source maps
94+
.map((file) => {
95+
const as = /\.css$/.test(file) ? 'style' : 'script';
96+
const rel = es6_preload && as === 'script' ? 'modulepreload' : 'preload';
97+
return `<${req.baseUrl}/client/${file}>;rel="${rel}";as="${as}"`;
98+
})
99+
.join(', ');
100+
101+
res.setHeader('Link', link);
102+
91103
let session;
92104
try {
93105
session = await session_getter(req, res);

src/core/create_compilers/RollupResult.ts

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import * as path from 'path';
22
import colors from 'kleur';
33
import pb from 'pretty-bytes';
4+
import transitiveDeps from 'rollup-dependency-tree';
45
import RollupCompiler from './RollupCompiler';
56
import extract_css from './extract_css';
67
import { left_pad } from '../../utils';
@@ -13,6 +14,7 @@ export default class RollupResult implements CompileResult {
1314
warnings: CompileError[];
1415
chunks: Chunk[];
1516
assets: Record<string, string>;
17+
dependencies: Record<string, string[]>;
1618
css_files: CssFile[];
1719
css: {
1820
main: string,
@@ -36,8 +38,6 @@ export default class RollupResult implements CompileResult {
3638

3739
this.css_files = compiler.css_files;
3840

39-
// TODO populate this properly. We don't have named chunks, as in
40-
// webpack, but we can have a route -> [chunk] map or something
4141
this.assets = {};
4242

4343
if (typeof compiler.input === 'string') {
@@ -54,6 +54,8 @@ export default class RollupResult implements CompileResult {
5454
}
5555
}
5656

57+
this.dependencies = transitiveDeps(compiler.chunks);
58+
5759
this.summary = compiler.chunks.map(chunk => {
5860
const size_color = chunk.code.length > 150000 ? colors.bold().red : chunk.code.length > 50000 ? colors.bold().yellow : colors.bold().white;
5961
const size_label = left_pad(pb(chunk.code.length), 10);
@@ -89,12 +91,18 @@ export default class RollupResult implements CompileResult {
8991
}
9092

9193
to_json(manifest_data: ManifestData, dirs: Dirs): BuildInfo {
92-
// TODO extract_css has side-effects that don't belong
93-
// in a method called to_json
94+
const dependencies = {};
95+
Object.entries(this.dependencies).forEach(([key, value]) => {
96+
dependencies[path.relative(dirs.routes, key)] = value;
97+
});
98+
9499
return {
95100
bundler: 'rollup',
96101
shimport: require('shimport/package.json').version,
97102
assets: this.assets,
103+
dependencies,
104+
105+
// TODO extract_css has side-effects that don't belong in a method called to_json
98106
css: extract_css(this, manifest_data.components, dirs, this.sourcemap)
99107
};
100108
}

src/core/create_compilers/interfaces.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,10 @@ export type BuildInfo = {
3131
bundler: string;
3232
shimport: string;
3333
assets: Record<string, string>;
34+
dependencies: Record<string, string[]>;
3435
legacy_assets?: Record<string, string>;
3536
css: {
3637
main: string | null,
3738
chunks: Record<string, string[]>
3839
}
39-
}
40+
}

0 commit comments

Comments
 (0)