summaryrefslogtreecommitdiff
path: root/packages/frontend/src/components
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2023-12-15 15:37:19 +0900
committersyuilo <Syuilotan@yahoo.co.jp>2023-12-15 15:37:19 +0900
commiteacc2040a1a3ef1c28af5293a163289e7ec1958a (patch)
treec59589a755f7c20240b3b1a69562f3e0781b1945 /packages/frontend/src/components
parentperf: early return users/notes and users/featured-notes if me is blocked by r... (diff)
downloadmisskey-eacc2040a1a3ef1c28af5293a163289e7ec1958a.tar.gz
misskey-eacc2040a1a3ef1c28af5293a163289e7ec1958a.tar.bz2
misskey-eacc2040a1a3ef1c28af5293a163289e7ec1958a.zip
perf(frontend): introduce MkLazy for lazy loading
Diffstat (limited to 'packages/frontend/src/components')
-rw-r--r--packages/frontend/src/components/global/MkLazy.vue53
-rw-r--r--packages/frontend/src/components/index.ts3
2 files changed, 56 insertions, 0 deletions
diff --git a/packages/frontend/src/components/global/MkLazy.vue b/packages/frontend/src/components/global/MkLazy.vue
new file mode 100644
index 0000000000..6d7ff4ca49
--- /dev/null
+++ b/packages/frontend/src/components/global/MkLazy.vue
@@ -0,0 +1,53 @@
+<!--
+SPDX-FileCopyrightText: syuilo and other misskey contributors
+SPDX-License-Identifier: AGPL-3.0-only
+-->
+
+<template>
+<div ref="rootEl" :class="$style.root">
+ <div v-if="!showing" :class="$style.placeholder"></div>
+ <slot v-else></slot>
+</div>
+</template>
+
+<script lang="ts" setup>
+import { nextTick, onMounted, onActivated, onBeforeUnmount, ref, shallowRef } from 'vue';
+
+const rootEl = shallowRef<HTMLDivElement>();
+const showing = ref(false);
+
+const observer = new IntersectionObserver(
+ (entries) => {
+ if (entries.some((entry) => entry.isIntersecting)) {
+ showing.value = true;
+ }
+ },
+);
+
+onMounted(() => {
+ nextTick(() => {
+ observer.observe(rootEl.value!);
+ });
+});
+
+onActivated(() => {
+ nextTick(() => {
+ observer.observe(rootEl.value!);
+ });
+});
+
+onBeforeUnmount(() => {
+ observer.disconnect();
+});
+</script>
+
+<style lang="scss" module>
+.root {
+ display: block;
+}
+
+.placeholder {
+ display: block;
+ min-height: 150px;
+}
+</style>
diff --git a/packages/frontend/src/components/index.ts b/packages/frontend/src/components/index.ts
index c740d181f9..a3e13c3a50 100644
--- a/packages/frontend/src/components/index.ts
+++ b/packages/frontend/src/components/index.ts
@@ -25,6 +25,7 @@ import MkPageHeader from './global/MkPageHeader.vue';
import MkSpacer from './global/MkSpacer.vue';
import MkFooterSpacer from './global/MkFooterSpacer.vue';
import MkStickyContainer from './global/MkStickyContainer.vue';
+import MkLazy from './global/MkLazy.vue';
export default function(app: App) {
for (const [key, value] of Object.entries(components)) {
@@ -53,6 +54,7 @@ export const components = {
MkSpacer: MkSpacer,
MkFooterSpacer: MkFooterSpacer,
MkStickyContainer: MkStickyContainer,
+ MkLazy: MkLazy,
};
declare module '@vue/runtime-core' {
@@ -77,5 +79,6 @@ declare module '@vue/runtime-core' {
MkSpacer: typeof MkSpacer;
MkFooterSpacer: typeof MkFooterSpacer;
MkStickyContainer: typeof MkStickyContainer;
+ MkLazy: typeof MkLazy;
}
}