diff options
| author | tamaina <tamaina@hotmail.co.jp> | 2022-12-30 12:00:50 +0900 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-12-30 12:00:50 +0900 |
| commit | 8b46edeccf5a8907afbb871e3eb5b3b8eef967a8 (patch) | |
| tree | 1411e540282c4b0d2365d3a2c7e01902a3403a3a /packages/frontend/src/scripts | |
| parent | fix(client): fix position calculation of nested context menu (diff) | |
| download | sharkey-8b46edeccf5a8907afbb871e3eb5b3b8eef967a8.tar.gz sharkey-8b46edeccf5a8907afbb871e3eb5b3b8eef967a8.tar.bz2 sharkey-8b46edeccf5a8907afbb871e3eb5b3b8eef967a8.zip | |
enhance: Proxy custom emojis to reduce image size and accelerate the frontend (#9431)
* fix(server): /emoji to accept `@.` host expression
* fix(client): use MkEmoji for custom emoji in MkEmojiPicker
* change convertToWebp
* nanka iroiro
* remove
* fix
* nearLosslessは労多くして益少なしなのでやめる
* do not cleanup tmp for development
* update sharp.js to 0.31.3
* mixed: true
* fix MkAutocomplete of 912791b3ab
* clean up
* https://github.com/misskey-dev/misskey/pull/9431#discussion_r1059215943
Diffstat (limited to 'packages/frontend/src/scripts')
| -rw-r--r-- | packages/frontend/src/scripts/get-static-image-url.ts | 19 | ||||
| -rw-r--r-- | packages/frontend/src/scripts/media-proxy.ts | 34 | ||||
| -rw-r--r-- | packages/frontend/src/scripts/url.ts | 5 |
3 files changed, 38 insertions, 20 deletions
diff --git a/packages/frontend/src/scripts/get-static-image-url.ts b/packages/frontend/src/scripts/get-static-image-url.ts deleted file mode 100644 index cbd1761983..0000000000 --- a/packages/frontend/src/scripts/get-static-image-url.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { url as instanceUrl } from '@/config'; -import * as url from '@/scripts/url'; - -export function getStaticImageUrl(baseUrl: string): string { - const u = new URL(baseUrl); - if (u.href.startsWith(`${instanceUrl}/proxy/`)) { - // もう既にproxyっぽそうだったらsearchParams付けるだけ - u.searchParams.set('static', '1'); - return u.href; - } - - // 拡張子がないとキャッシュしてくれないCDNがあるのでダミーの名前を指定する - const dummy = `${encodeURIComponent(`${u.host}${u.pathname}`)}.webp`; - - return `${instanceUrl}/proxy/${dummy}?${url.query({ - url: u.href, - static: '1', - })}`; -} diff --git a/packages/frontend/src/scripts/media-proxy.ts b/packages/frontend/src/scripts/media-proxy.ts index aaf7f9e610..bea164e7c8 100644 --- a/packages/frontend/src/scripts/media-proxy.ts +++ b/packages/frontend/src/scripts/media-proxy.ts @@ -1,7 +1,15 @@ -import { query } from '@/scripts/url'; +import { query, appendQuery } from '@/scripts/url'; import { url } from '@/config'; export function getProxiedImageUrl(imageUrl: string, type?: 'preview'): string { + if (imageUrl.startsWith(`${url}/proxy/`) || imageUrl.startsWith('/proxy/')) { + // もう既にproxyっぽそうだったらsearchParams付けるだけ + return appendQuery(imageUrl, query({ + fallback: '1', + ...(type ? { [type]: '1' } : {}), + })); + } + return `${url}/proxy/image.webp?${query({ url: imageUrl, fallback: '1', @@ -13,3 +21,27 @@ export function getProxiedImageUrlNullable(imageUrl: string | null | undefined, if (imageUrl == null) return null; return getProxiedImageUrl(imageUrl, type); } + +export function getStaticImageUrl(baseUrl: string): string { + const u = baseUrl.startsWith('http') ? new URL(baseUrl) : new URL(baseUrl, url); + + if (u.href.startsWith(`${url}/proxy/`)) { + // もう既にproxyっぽそうだったらsearchParams付けるだけ + u.searchParams.set('static', '1'); + return u.href; + } + + if (u.href.startsWith(`${url}/emoji/`)) { + // もう既にemojiっぽそうだったらsearchParams付けるだけ + u.searchParams.set('static', '1'); + return u.href; + } + + // 拡張子がないとキャッシュしてくれないCDNがあるのでダミーの名前を指定する + const dummy = `${encodeURIComponent(`${u.host}${u.pathname}`)}.webp`; + + return `${url}/proxy/${dummy}?${query({ + url: u.href, + static: '1', + })}`; +} diff --git a/packages/frontend/src/scripts/url.ts b/packages/frontend/src/scripts/url.ts index 86735de9f0..b6a997449a 100644 --- a/packages/frontend/src/scripts/url.ts +++ b/packages/frontend/src/scripts/url.ts @@ -1,3 +1,8 @@ +/* objを検査して + * 1. 配列に何も入っていない時はクエリを付けない + * 2. プロパティがundefinedの時はクエリを付けない + * (new URLSearchParams(obj)ではそこまで丁寧なことをしてくれない) + */ export function query(obj: Record<string, any>): string { const params = Object.entries(obj) .filter(([, v]) => Array.isArray(v) ? v.length : v !== undefined) |