Skip to content

Commit 66c09a4

Browse files
authored
impr: reduce initial loading time of settings page (@fehmer) (#5583)
1 parent d7f9a4d commit 66c09a4

8 files changed

Lines changed: 91 additions & 5 deletions

File tree

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,3 +125,4 @@ copyAnticheatToDev.sh
125125

126126
# ignore generated fonts
127127
frontend/src/webfonts-generated
128+
frontend/static/webfonts-preview

frontend/package-lock.json

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

frontend/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
"normalize.css": "8.0.1",
5151
"postcss": "8.4.27",
5252
"sass": "1.70.0",
53+
"subset-font": "2.3.0",
5354
"typescript": "5.3.3",
5455
"vite": "5.1.2",
5556
"vite-bundle-visualizer": "1.0.1",

frontend/scripts/font-preview.mjs

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import * as fs from "fs";
2+
import * as path from "path";
3+
import { fileURLToPath } from "url";
4+
import Fonts from "../static/fonts/_list.json" assert { type: "json" };
5+
import subsetFont from "subset-font";
6+
7+
const __filename = fileURLToPath(import.meta.url);
8+
const __dirname = path.dirname(__filename);
9+
10+
export async function generatePreviewFonts(debug) {
11+
const srcDir = __dirname + "/../static/webfonts";
12+
const targetDir = __dirname + "/../static/webfonts-preview";
13+
fs.mkdirSync(targetDir, { recursive: true });
14+
15+
const srcFiles = fs.readdirSync(srcDir);
16+
17+
for (const font of Fonts) {
18+
if (font.systemFont) continue;
19+
20+
const display = font.display || font.name;
21+
22+
const fileNames = srcFiles.filter((it) =>
23+
it.startsWith(font.name.replaceAll(" ", "") + "-")
24+
);
25+
26+
if (fileNames.length !== 1)
27+
throw new Error(
28+
`cannot find font file for ${font.name}. Candidates: ${fileNames}`
29+
);
30+
const fileName = fileNames[0];
31+
32+
generateSubset(
33+
srcDir + "/" + fileName,
34+
targetDir + "/" + fileName,
35+
display
36+
);
37+
if (debug) {
38+
console.log(
39+
`Processing ${font.name} with file ${fileName} to display "${display}".`
40+
);
41+
}
42+
}
43+
}
44+
45+
async function generateSubset(source, target, name, debug) {
46+
const font = fs.readFileSync(source);
47+
const subset = await subsetFont(font, name, {
48+
targetFormat: "woff2",
49+
});
50+
fs.writeFileSync(target, subset);
51+
}
52+
//detect if we run this as a main
53+
if (import.meta.url.endsWith(process.argv[1])) {
54+
generatePreviewFonts(true);
55+
}

frontend/src/styles/fonts.scss

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,11 +105,25 @@ $font-defauls: (
105105
@each $font, $settings in $fonts {
106106
$config: map-merge($font-defauls, $settings);
107107
$src: "/webfonts/" + map-get($config, "src") + "." + map-get($config, "ext");
108+
$previewDir: "webfonts-preview";
109+
@if variable-exists(previewFontsPath) {
110+
$previewDir: $previewFontsPath;
111+
}
112+
108113
@font-face {
109114
font-family: $font;
110115
font-style: map-get($config, "style");
111116
font-weight: map-get($config, "weight");
112117
font-display: map-get($config, "display");
113118
src: url($src) format(map-get($config, "format"));
114119
}
120+
121+
@font-face {
122+
font-family: $font + " Preview";
123+
font-style: map-get($config, "style");
124+
font-weight: map-get($config, "weight");
125+
font-display: map-get($config, "display");
126+
src: url("/" + $previewDir + "/" + map-get($config, "src") + ".woff2")
127+
format("woff2");
128+
}
115129
}

frontend/src/ts/pages/settings.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -636,7 +636,7 @@ async function fillSettingsPage(): Promise<void> {
636636
Config.fontFamily === font.name ? " active" : ""
637637
}" style="font-family:${
638638
font.display !== undefined ? font.display : font.name
639-
}" data-config-value="${font.name.replace(/ /g, "_")}">${
639+
} Preview" data-config-value="${font.name.replace(/ /g, "_")}">${
640640
font.display !== undefined ? font.display : font.name
641641
}</button>`;
642642
}

frontend/static/fonts/_list.json

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,8 @@
3434
},
3535
{
3636
"name": "Comic Sans MS",
37-
"display": "Helvetica"
37+
"display": "Helvetica",
38+
"systemFont": true
3839
},
3940
{
4041
"name": "Oxygen"
@@ -46,7 +47,8 @@
4647
"name": "Itim"
4748
},
4849
{
49-
"name": "Courier"
50+
"name": "Courier",
51+
"systemFont": true
5052
},
5153
{
5254
"name": "Comfortaa"
@@ -77,7 +79,8 @@
7779
"name": "Ubuntu Mono"
7880
},
7981
{
80-
"name": "Georgia"
82+
"name": "Georgia",
83+
"systemFont": true
8184
},
8285
{
8386
"name": "Cascadia Mono"

frontend/vite.config.js

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import autoprefixer from "autoprefixer";
1010
import "dotenv/config";
1111
import { fontawesomeSubset } from "fontawesome-subset";
1212
import { getFontawesomeConfig } from "./scripts/fontawesome.mjs";
13+
import { generatePreviewFonts } from "./scripts/font-preview.mjs";
1314

1415
function pad(numbers, maxLength, fillString) {
1516
return numbers.map((number) =>
@@ -146,7 +147,10 @@ const DEV_CONFIG = {
146147
css: {
147148
preprocessorOptions: {
148149
scss: {
149-
additionalData: `$fontAwesomeOverride:"@fortawesome/fontawesome-free/webfonts";`,
150+
additionalData: `
151+
$fontAwesomeOverride:"@fortawesome/fontawesome-free/webfonts";
152+
$previewFontsPath:"webfonts";
153+
`,
150154
},
151155
},
152156
},
@@ -165,6 +169,13 @@ const BUILD_CONFIG = {
165169
});
166170
},
167171
},
172+
{
173+
name: "vite-plugin-webfonts-preview",
174+
apply: "build",
175+
buildStart() {
176+
generatePreviewFonts();
177+
},
178+
},
168179
splitVendorChunkPlugin(),
169180
VitePWA({
170181
injectRegister: "networkfirst",

0 commit comments

Comments
 (0)