iT邦幫忙

2023 iThome 鐵人賽

DAY 13
0
Modern Web

Micro-Frontend 的新夥伴:Astro.js 的應用與研究系列 第 13

[Day 13] Custom Client Directives - 自定義 hydrated 時機

  • 分享至 

  • xImage
  •  

在 day-06 我們表列了很多 , client:* Directives , 說明 Astro 提供不同類型的 js hydrate 時機

複習一下有

  • client:load - 頁面載入時 hydrate
  • client:idle - 頁面有空閒時 , 才做 hydrate , 用 requestIdleCallback 控制
  • client:visible - 元件可被看見時 hydrate , 用 IntersectionObserver 控制
  • client:media - 根據 media-query 的條件做 hydrate
  • client:only - 由各程式語言做 CSR , Astro 不產生元件的 html 內容 , 因此不用 hydrate

其實還有一種 , 那就是今天要討論的 Custom Client Directives

下面定義一個 client:click - 元件在點擊後 hydrate

addClientDirective option
Section titled addClientDirective option
Added in: astro@2.6.0
Type: (directive: ClientDirectiveConfig ) => void;

Adds a custom client directive to be used in .astro files.

Note that directive entrypoints are only bundled through esbuild and should be kept small so they don’t slow down component hydration.

Example usage:

// ------- astro.config.mjs -------- //
import { defineConfig } from 'astro/config';
import clickDirective from './astro-click-directive/register.js'

// https://astro.build/config
export default defineConfig({
  integrations: [
    clickDirective()
  ],
});
// ------- astro-click-directive/register.js -------- //
/**
 * @type {() => import('astro').AstroIntegration}
 */
export default () => ({
  name: "client:click",
  hooks: {
    "astro:config:setup": ({ addClientDirective }) => {
      addClientDirective({
        name: "click",
        entrypoint: "./astro-click-directive/click.js",
      });
    },
  },
});
// ------- astro-click-directive/click.js -------- //
/**
 * Hydrate on first click on the window
 * @type {import('astro').ClientDirective}
 */
export default (load, opts, el) => {
  window.addEventListener('click', async () => {
    const hydrate = await load()
    await hydrate()
  }, { once: true })
}

You can also add types for the directives in your library’s type definition file:

// ------- astro-click-directive/index.d.ts -------- //
import 'astro'
declare module 'astro' {
  interface AstroClientDirectives {
    'client:click'?: boolean
  }
}

參考資料


上一篇
[Day 12] Astro Showcase
下一篇
[Day 13] Astro Routing
系列文
Micro-Frontend 的新夥伴:Astro.js 的應用與研究20
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言