1
1
import { isServer } from "./postprocess/misc" ;
2
2
import * as SPAs from "../../config/spa.config" ;
3
+ import logger from "./logger" ;
4
+
5
+ //#region SEO
3
6
4
7
const regexPath1Literal = `/${ SPAs . getRedirectName ( ) } (.html)?$` ;
5
8
const regexPath1 = new RegExp ( regexPath1Literal , "i" ) ;
@@ -20,3 +23,39 @@ export const getTitle = (pageTitle?: string): string => {
20
23
const ret = ! ! pageTitle ? `${ SPAs . appTitle } - ${ pageTitle } ` : SPAs . appTitle ;
21
24
return ret + ( CF_PAGES ? " (Jamstack build)" : " (Full stack build)" ) ;
22
25
}
26
+
27
+ //#endregion
28
+
29
+ //#region Performance Benchmarking
30
+
31
+ const perfLiterals = [ "fetch" , "click" , "end" , "measure" , "mark" ] ;
32
+
33
+ export const perfStart = ( name : "click" | "fetch" ) => {
34
+ const perf = window ?. performance ;
35
+ perf ?. mark ( name ) ;
36
+ }
37
+
38
+ export const perfEnd = ( ) : undefined | number => {
39
+ if ( typeof ( window ?. performance ?. getEntriesByName ) !== "function" ) {
40
+ return undefined ;
41
+ }
42
+
43
+ const perf = window . performance ;
44
+ const fetchEntries = perf . getEntriesByName ( perfLiterals [ 0 ] , perfLiterals [ 4 ] ) ;
45
+ const clickEntries = perf . getEntriesByName ( perfLiterals [ 1 ] , perfLiterals [ 4 ] ) ;
46
+ const clickEntriesLen = Math . min ( ...[ clickEntries . length , 1 ] ) ;
47
+
48
+ if ( clickEntriesLen === 0 && fetchEntries . length === 0 ) {
49
+ return undefined ;
50
+ }
51
+
52
+ perf . mark ( perfLiterals [ 2 ] ) ;
53
+ perf . measure ( perfLiterals [ 3 ] , perfLiterals [ clickEntriesLen ] , perfLiterals [ 2 ] ) ;
54
+ const duration = performance . getEntriesByType ( perfLiterals [ 3 ] ) [ 0 ] . duration ;
55
+ logger . info ( `${ clickEntriesLen === 0 ? "Updating" : "Transition to" } internal SPA page ${ clickEntriesLen === 0 ? "after fetch " : "" } took ${ Math . round ( duration ) } msec` ) ;
56
+ perf . clearMarks ( ) ;
57
+ perf . clearMeasures ( ) ;
58
+ return duration ;
59
+ }
60
+
61
+ //#endregion
0 commit comments