1
0
forked from baron/baron-sso

모바일 로그인창 테스트 강화

This commit is contained in:
2026-05-27 11:46:11 +09:00
parent 53830b20d8
commit 368f4bbad8
17 changed files with 268 additions and 156 deletions

View File

@@ -18,17 +18,6 @@ const buildDir = process.argv[2] ?? join(__dirname, '..', 'build', 'web');
const bootstrapPath = join(buildDir, 'flutter_bootstrap.js');
const indexPath = join(buildDir, 'index.html');
const hashableEntrypoints = ['main.dart.js', 'main.dart.mjs', 'main.dart.wasm'];
const loginFontFallbackPreloads = [
'https://fonts.gstatic.com/s/roboto/v32/KFOmCnqEu92Fr1Me4GZLCzYlKw.woff2',
'https://fonts.gstatic.com/s/notosanskr/v36/PbyxFmXiEBPT4ITbgNA5Cgms3VYcOA-vvnIzzuoyeLGC5nwuDo-KBTUm6CryotyJROlrnQ.110.woff2',
'https://fonts.gstatic.com/s/notosanskr/v36/PbyxFmXiEBPT4ITbgNA5Cgms3VYcOA-vvnIzzuoyeLGC5nwuDo-KBTUm6CryotyJROlrnQ.113.woff2',
'https://fonts.gstatic.com/s/notosanskr/v36/PbyxFmXiEBPT4ITbgNA5Cgms3VYcOA-vvnIzzuoyeLGC5nwuDo-KBTUm6CryotyJROlrnQ.114.woff2',
'https://fonts.gstatic.com/s/notosanskr/v36/PbyxFmXiEBPT4ITbgNA5Cgms3VYcOA-vvnIzzuoyeLGC5nwuDo-KBTUm6CryotyJROlrnQ.115.woff2',
'https://fonts.gstatic.com/s/notosanskr/v36/PbyxFmXiEBPT4ITbgNA5Cgms3VYcOA-vvnIzzuoyeLGC5nwuDo-KBTUm6CryotyJROlrnQ.116.woff2',
'https://fonts.gstatic.com/s/notosanskr/v36/PbyxFmXiEBPT4ITbgNA5Cgms3VYcOA-vvnIzzuoyeLGC5nwuDo-KBTUm6CryotyJROlrnQ.117.woff2',
'https://fonts.gstatic.com/s/notosanskr/v36/PbyxFmXiEBPT4ITbgNA5Cgms3VYcOA-vvnIzzuoyeLGC5nwuDo-KBTUm6CryotyJROlrnQ.118.woff2',
'https://fonts.gstatic.com/s/notosanskr/v36/PbyxFmXiEBPT4ITbgNA5Cgms3VYcOA-vvnIzzuoyeLGC5nwuDo-KBTUm6CryotyJROlrnQ.119.woff2',
];
const compressibleExtensions = new Set([
'.css',
'.html',
@@ -89,18 +78,15 @@ const canvasKitConfig = 'config:{canvasKitBaseUrl:"canvaskit/"}';
bootstrap = bootstrap.replace(
/_flutter\.loader\.load\(\{\s*serviceWorkerSettings:\s*(\{[^{}]*\})\s*,\s*config:\s*\{[\s\S]*?serviceWorkerUrl[\s\S]*?\}\s*,\s*config:\s*\{[^}]*\}\s*\}\);/g,
(_match, settings) =>
`_flutter.loader.load({serviceWorkerSettings:${ensureServiceWorkerUrl(settings)},${canvasKitConfig}});`,
`_flutter.loader.load({${canvasKitConfig}});`,
);
bootstrap = bootstrap.replace(
/_flutter\.loader\.load\(\{\s*serviceWorkerSettings:\s*(\{[^{}]*\})\s*,\s*config:\s*\{[^}]*\}\s*\}\);/g,
(_match, settings) =>
`_flutter.loader.load({serviceWorkerSettings:${ensureServiceWorkerUrl(settings)},${canvasKitConfig}});`,
`_flutter.loader.load({${canvasKitConfig}});`,
);
bootstrap = bootstrap.replace(
/_flutter\.loader\.load\(\{\s*serviceWorkerSettings:\s*(\{[^{}]*\})\s*\}\);/g,
(_match, settings) =>
`_flutter.loader.load({serviceWorkerSettings:${ensureServiceWorkerUrl(settings)},${canvasKitConfig}});`,
`_flutter.loader.load({${canvasKitConfig}});`,
);
bootstrap = bootstrap.replace(
/_flutter\.loader\.load\(\);/g,
@@ -116,6 +102,9 @@ if (existsSync(indexPath)) {
let index = readFileSync(indexPath, 'utf8');
const preloadLinks = [
'<link rel="preload" href="flutter_bootstrap.js" as="script" />',
hashedEntrypoints.has('main.dart.js')
? `<link rel="preload" href="${hashedEntrypoints.get('main.dart.js')}" as="script" />`
: '',
hashedEntrypoints.has('main.dart.mjs')
? `<link rel="modulepreload" href="${hashedEntrypoints.get('main.dart.mjs')}" />`
: '',
@@ -124,22 +113,22 @@ if (existsSync(indexPath)) {
: '',
'<link rel="modulepreload" href="canvaskit/skwasm.js" />',
'<link rel="preload" href="canvaskit/skwasm.wasm" as="fetch" type="application/wasm" crossorigin />',
'<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />',
...loginFontFallbackPreloads.map(
(href) =>
`<link rel="preload" href="${href}" as="fetch" type="font/woff2" crossorigin />`,
),
]
.filter(Boolean)
.join('\n ');
index = index
.replace(/\n\s*<link rel="preload" href="flutter_bootstrap\.js" as="script" \/>/g, '')
.replace(/\n\s*<link rel="preload" href="main\.dart\.[^"]+\.js" as="script" \/>/g, '')
.replace(/\n\s*<link rel="modulepreload" href="main\.dart\.[^"]+\.mjs" \/>/g, '')
.replace(
/\n\s*<link rel="preload" href="main\.dart\.[^"]+\.wasm" as="fetch" type="application\/wasm" crossorigin \/>/g,
'',
)
.replace(
/\n\s*<link rel="preload" href="assets\/assets\/translations\/(?:en|ko)\.toml" as="fetch" crossorigin \/>/g,
'',
)
.replace(/\n\s*<link rel="modulepreload" href="canvaskit\/skwasm\.js" \/>/g, '')
.replace(
/\n\s*<link rel="preload" href="canvaskit\/skwasm\.wasm" as="fetch" type="application\/wasm" crossorigin \/>/g,
@@ -313,34 +302,4 @@ async function cacheFirst(request) {
`;
}
function ensureServiceWorkerUrl(settings) {
const serviceWorkerUrl = `"/flutter_service_worker.js?v=" + ${serviceWorkerVersionExpression(settings)}`;
if (/serviceWorkerUrl\s*:/.test(settings)) {
return settings.replace(
/serviceWorkerUrl\s*:\s*[^,\n}]+,?/,
`serviceWorkerUrl: ${serviceWorkerUrl},`,
);
}
const closingBraceIndex = settings.lastIndexOf('}');
if (closingBraceIndex < 0) {
return settings;
}
const beforeClosing = settings.slice(0, closingBraceIndex).trimEnd();
const afterClosing = settings.slice(closingBraceIndex);
const separator =
beforeClosing.endsWith('{') || beforeClosing.endsWith(',') ? '' : ',';
return `${beforeClosing}${separator}
serviceWorkerUrl: ${serviceWorkerUrl},
${afterClosing}`;
}
function serviceWorkerVersionExpression(settings) {
const match = settings.match(/serviceWorkerVersion\s*:\s*([^,\n}]+)/);
return (
match?.[1]?.replace(/\/\*[\s\S]*?\*\//g, '').trim() ??
'serviceWorkerVersion'
);
}
console.log(`[userfront] optimized ${basename(buildDir)} with hashed entrypoints and brotli assets`);