feat: bootloader in frontend package (embed)

This commit is contained in:
anatawa12 2025-08-13 00:51:44 +09:00
parent af011562bd
commit 0ec4f87ef8
No known key found for this signature in database
GPG Key ID: 9CA909848B8E4EA6
6 changed files with 15 additions and 6 deletions

View File

@ -188,6 +188,7 @@ export type Config = {
frontendBootLoader: { file: string };
frontendManifestExists: boolean;
frontendEmbedEntry: { file: string | null };
frontendEmbedBootLoader: { file: string };
frontendEmbedManifestExists: boolean;
mediaProxy: string;
externalMediaProxyEnabled: boolean;
@ -239,7 +240,7 @@ export function loadConfig(): Config {
: { 'src/_boot_.ts': { file: null }, 'src/_bootloader.ts': { file: 'src/_bootloader.ts' } };
const frontendEmbedManifest = frontendEmbedManifestExists ?
JSON.parse(fs.readFileSync(`${_dirname}/../../../built/_frontend_embed_vite_/manifest.json`, 'utf-8'))
: { 'src/boot.ts': { file: null } };
: { 'src/boot.ts': { file: null }, 'src/_bootloader.ts': { file: 'src/_bootloader.ts' } };
const config = yaml.load(fs.readFileSync(path, 'utf-8')) as Source;
@ -316,6 +317,7 @@ export function loadConfig(): Config {
frontendBootLoader: frontendManifest['src/_bootloader.ts'],
frontendManifestExists: frontendManifestExists,
frontendEmbedEntry: frontendEmbedManifest['src/boot.ts'],
frontendEmbedBootLoader: frontendEmbedManifest['src/_bootloader.ts'],
frontendEmbedManifestExists: frontendEmbedManifestExists,
perChannelMaxNoteCacheCount: config.perChannelMaxNoteCacheCount ?? 1000,
perUserNotificationsMaxCount: config.perUserNotificationsMaxCount ?? 500,

View File

@ -2,6 +2,7 @@ block vars
block loadClientEntry
- const entry = config.frontendEmbedEntry;
- const bootLoader = config.frontendEmbedBootLoader;
doctype html
@ -47,8 +48,7 @@ html(class='embed')
script(type='application/json' id='misskey_embedCtx' data-generated-at=now)
!= embedCtx
script
include ../boot.embed.js
script(type='module', src=`/embed_vite/${bootLoader.file}`)
body
noscript: p

View File

@ -6,6 +6,7 @@
type FIXME = any;
declare const _LANGS_: string[][];
declare const _LANG_IDS_: string[];
declare const _VERSION_: string;
declare const _ENV_: string;
declare const _DEV_: boolean;

View File

@ -5,6 +5,10 @@
'use strict';
interface Window {
CLIENT_ENTRY: string | undefined;
}
// ブロックの中に入れないと、定義した変数がブラウザのグローバルスコープに登録されてしまい邪魔なので
(async () => {
window.onerror = (e) => {
@ -32,7 +36,7 @@
}
//#region Detect language & fetch translations
const supportedLangs = LANGS;
const supportedLangs = _LANG_IDS_;
/** @type { string } */
let lang = localStorage.getItem('lang');
if (lang == null || !supportedLangs.includes(lang)) {
@ -55,7 +59,7 @@
//#region Script
async function importAppScript() {
await import(CLIENT_ENTRY ? `/embed_vite/${CLIENT_ENTRY.replace('scripts', lang)}` : '/embed_vite/src/_boot_.ts')
await import(`/embed_vite/${(window.CLIENT_ENTRY ?? 'src/boot.ts').replace('scripts', lang)}`)
.catch(async e => {
console.error(e);
renderError('APP_IMPORT');

View File

@ -121,6 +121,7 @@ export function getConfig(): UserConfig {
define: {
_VERSION_: JSON.stringify(meta.version),
_LANGS_: JSON.stringify(Object.entries(locales).map(([k, v]) => [k, v._lang_])),
_LANG_IDS_: JSON.stringify(Object.keys(locales)),
_ENV_: JSON.stringify(process.env.NODE_ENV),
_DEV_: process.env.NODE_ENV !== 'production',
_PERF_PREFIX_: JSON.stringify('Misskey:'),
@ -139,6 +140,7 @@ export function getConfig(): UserConfig {
input: {
i18n: './src/i18n.ts',
entry: './src/boot.ts',
bootloader: './src/_bootloader.ts',
},
external: externalPackages.map(p => p.match),
preserveEntrySignatures: 'allow-extension',

View File

@ -54,7 +54,7 @@ async function buildBackendScript() {
for (const file of [
//'./packages/backend/src/server/web/boot.js',
'./packages/backend/src/server/web/boot.embed.js',
//'./packages/backend/src/server/web/boot.embed.js',
'./packages/backend/src/server/web/bios.js',
'./packages/backend/src/server/web/cli.js',
'./packages/backend/src/server/web/error.js',