-
Notifications
You must be signed in to change notification settings - Fork 8
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Turboハンドブックのdriveを最新化 #65
base: main
Are you sure you want to change the base?
Changes from 9 commits
77f2857
3111a3f
2c53449
06a555e
104ac55
d6e754e
6c07d6e
36aa142
815156c
ebe80a3
d841473
5def414
b9dcc48
3c003b9
1f9cf69
044b56e
1a3d1dd
7f2c1f5
404c6d4
b0a54a5
4f2d3ce
e33dae4
cce6e3c
5cc6824
fef0b92
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
|
@@ -16,6 +16,8 @@ Turbo ドライブは、ページ・ナビゲーションを、ある*アクシ | |||||
|
||||||
アクセスは、ページの描画のために、クリックから始まるすべてのナビゲーション・ライフサイクルを要求します。そのサイクルには、ブラウザ履歴の更新や、ネットワーク・リクエストの発行、キャッシュからのページのコピーの再構築、最終的なレスポンスの描画、スクロール位置の更新も含まれます。 | ||||||
|
||||||
描画中、Turbo ドライブはリクエストしているドキュメントの`<body>`の内容をレスポンスのドキュメントの`<body>`で置き換えます。`<head>`の内容もマージし、必要に応じて`<html>`要素の`lang`属性を更新します。`<head>`要素を置き換える代わりにマージするポイントは、`<title>`または`<meta>`タグが変わった時にそれらは期待どおり更新され、アセットのリンクが変わらない時にそのリンクに対して再び処理しないところです。 | ||||||
yakitorii marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||
|
||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. |
||||||
アクセスには二つの種類があります。_アプリケーション・アクセス_、_advance_ あるいは _replace_ のアクションを伴うものと、_リストア・アクセス_、_restore_ のアクションを伴うものです。 | ||||||
|
||||||
## アプリケーション・アクセス | ||||||
|
@@ -78,16 +80,53 @@ Application visits can be canceled before they start, regardless of whether they | |||||
|
||||||
リストア・アクセスは、`turbo:before-visit` を発火しないのでキャンセルすることができません。 Turbo ドライブは、リストア・アクセスを、*すでに存在する*アクセス履歴への応答の場合に発行します。よくあるのは、ブラウザバックやブラウザで前に進む場合です。 | ||||||
|
||||||
## 描画のカスタム | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. [nits] 動詞 + 名詞の形なので、そのニュアンスを出してみるのはどうでしょう?
Suggested change
|
||||||
|
||||||
ドキュメント全体に対して `turbo:before-render` イベントリスナーを追加し、 `event.detail.render` プロパティをオーバーライドすることで、アプリケーションの描画プロセスをカスタマイズできます。 | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
|
||||||
|
||||||
例えば、[morphdom]で、リクエストを投げたドキュメントの `<body>` 要素を、レスポンスのドキュメントにある `<body>` 要素にマージできます。 | ||||||
|
||||||
```javascript | ||||||
import morphdom from "morphdom" | ||||||
|
||||||
addEventListener("turbo:before-render", (event) => { | ||||||
event.detail.render = (currentElement, newElement) => { | ||||||
morphdom(currentElement, newElement) | ||||||
} | ||||||
}) | ||||||
``` | ||||||
|
||||||
[morphdom]: https://github.com/patrick-steele-idem/morphdom | ||||||
|
||||||
<details> | ||||||
<summary>原文</summary> | ||||||
|
||||||
Applications can customize the rendering process by adding a document-wide `turbo:before-render` event listener and overriding the `event.detail.render` property. | ||||||
|
||||||
For example, you could merge the response document's `<body>` element into the requesting document's `<body>` element with [morphdom](https://github.com/patrick-steele-idem/morphdom): | ||||||
|
||||||
```javascript | ||||||
import morphdom from "morphdom" | ||||||
|
||||||
addEventListener("turbo:before-render", (event) => { | ||||||
event.detail.render = (currentElement, newElement) => { | ||||||
morphdom(currentElement, newElement) | ||||||
} | ||||||
}) | ||||||
``` | ||||||
|
||||||
</details> | ||||||
|
||||||
Comment on lines
+169
to
+205
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. |
||||||
## 描画の一時停止 | ||||||
|
||||||
アプリケーションは描画を一時停止して、実行前に追加で下準備をすることができます。 | ||||||
アプリケーションは描画を一時停止して、続行する前に追加で下準備をすることができます。 | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. |
||||||
|
||||||
`turbo:before-render` イベントを待ち受けることで、描画が始まろうとする瞬間に気づくことができます。そこで、`event.preventDefault()` で描画を停止させましょう。下準備が終わったら、`event.detail.resume()` を呼ぶことで描画を再開します。 | ||||||
|
||||||
アクセスにexitのアニメーションを追加する例です。 | ||||||
|
||||||
```javascript | ||||||
document.addEventListener('turbo:before-render', async (event) => { | ||||||
document.addEventListener("turbo:before-render", async (event) => { | ||||||
event.preventDefault() | ||||||
|
||||||
await animateOut() | ||||||
|
@@ -105,11 +144,11 @@ document.addEventListener('turbo:before-render', async (event) => { | |||||
リクエストに `Authorization` ヘッダを設定する例です。 | ||||||
|
||||||
```javascript | ||||||
document.addEventListener('turbo:before-fetch-request', async (event) => { | ||||||
document.addEventListener("turbo:before-fetch-request", async (event) => { | ||||||
event.preventDefault() | ||||||
|
||||||
const token = await getSessionToken(window.app) | ||||||
event.detail.fetchOptions.headers['Authorization'] = `Bearer ${token}` | ||||||
event.detail.fetchOptions.headers["Authorization"] = `Bearer ${token}` | ||||||
|
||||||
event.detail.resume() | ||||||
}) | ||||||
|
@@ -127,6 +166,31 @@ document.addEventListener('turbo:before-fetch-request', async (event) => { | |||||
|
||||||
アクセシビリティの観点からも、 GET 以外のリクエストには実際のフォームとボタンを使うのが望ましいでしょう。 | ||||||
|
||||||
## アクセス前に確認ダイアログを表示する | ||||||
|
||||||
リンクに `data-turbo-confirm` 属性を付けると、アクセス前に確認ダイアログが表示できます。 | ||||||
|
||||||
```html | ||||||
<a href="/articles" data-turbo-confirm="このページから離れますか?">Back to articles</a> | ||||||
yasu551 marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||
<a href="/articles/54" data-turbo-method="delete" data-turbo-confirm="本当に記事を削除しますか?">Delete the article</a> | ||||||
``` | ||||||
|
||||||
確認時に呼ぶメソッドは `Turbo.setConfirmMethod` を使って、変更できます。確認時に呼ぶメソッドのデフォルトは、ブラウザに組み込まれてる `confirm` です。 | ||||||
yasu551 marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||
|
||||||
<details> | ||||||
<summary>原文</summary> | ||||||
|
||||||
Decorate links with `data-turbo-confirm`, and confirmation will be required for a visit to proceed. | ||||||
|
||||||
```html | ||||||
<a href="/articles" data-turbo-confirm="Do you want to leave this page?">Back to articles</a> | ||||||
<a href="/articles/54" data-turbo-method="delete" data-turbo-confirm="Are you sure you want to delete the article?">Delete the article</a> | ||||||
``` | ||||||
|
||||||
Use `Turbo.setConfirmMethod` to change the method that gets called for confirmation. The default is the browser's built in `confirm`. | ||||||
|
||||||
</details> | ||||||
|
||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. |
||||||
## 特定のリンク/フォームでの Turbo ドライブの無効化 | ||||||
|
||||||
Turbo ドライブは、対象となる要素かその親要素で `data-turbo="false"` を宣言することで、要素単位で無効化することができます。 | ||||||
|
@@ -167,6 +231,60 @@ import { Turbo } from "@hotwired/turbo-rails" | |||||
Turbo.session.drive = false | ||||||
``` | ||||||
|
||||||
## ビュートランジション | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 少し違和感を感じなくもないのですが、「ビュー遷移 API」と訳されているようなので、合わせてあげると良さそうですかね。 |
||||||
|
||||||
[ビュートランジション API]を[サポートしているブラウザ]では、Turboはページ間を移動するときにビュートランジションをトリガーします。 | ||||||
yasu551 marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||
|
||||||
Turbo は、現在と次のページの両方に以下の `<meta>` 要素があるときに、ビュートランジションをトリガーします。 | ||||||
|
||||||
```html | ||||||
<meta name="view-transition" content="same-origin" /> | ||||||
``` | ||||||
|
||||||
Turbo は `<html>` 要素に `data-turbo-visit-direction` 属性を追加することで、トランジションの方向を指定できます。その属性の値として以下のものを使えます。 | ||||||
yasu551 marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||
|
||||||
- `forward`: ページを全て変える方向 | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. すべて変えるかどうかは、わからない? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 確かにそうですね。 There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. ちょっと試してみました。 There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 動作確認ありがとうございます!なるほど、、勉強になりました |
||||||
- `back`: ページを前のページに戻す方向 | ||||||
- `none`: ページの一部を置き換える方向 | ||||||
|
||||||
この属性を使えば、トランジション中で実行されるアニメーションをカスタマイズできます。 | ||||||
|
||||||
```css | ||||||
html[data-turbo-visit-direction="forward"]::view-transition-old(sidebar):only-child { | ||||||
animation: slide-to-right 0.5s ease-out; | ||||||
} | ||||||
``` | ||||||
|
||||||
[サポートしているブラウザ]: https://caniuse.com/?search=View%20Transition%20API | ||||||
[ビュートランジション API]: https://developer.mozilla.org/ja/docs/Web/API/View_Transitions_API | ||||||
|
||||||
<details> | ||||||
<summary>原文</summary> | ||||||
|
||||||
In [browsers that support](https://caniuse.com/?search=View%20Transition%20API) the [View Transition API](https://developer.mozilla.org/en-US/docs/Web/API/View_Transitions_API) Turbo can trigger view transitions when navigating between pages. | ||||||
|
||||||
Turbo triggers a view transition when both the current and the next page have this meta tag: | ||||||
|
||||||
``` | ||||||
<meta name="view-transition" content="same-origin" /> | ||||||
``` | ||||||
|
||||||
Turbo also adds a `data-turbo-visit-direction` attribute to the `<html>` element to indicate the direction of the transition. The attribute can have one of the following values: | ||||||
|
||||||
- `forward` in advance visits. | ||||||
- `back` in restoration visits. | ||||||
- `none` in replace visits. | ||||||
|
||||||
You can use this attribute to customize the animations that are performed during a transition: | ||||||
|
||||||
```css | ||||||
html[data-turbo-visit-direction="forward"]::view-transition-old(sidebar):only-child { | ||||||
animation: slide-to-right 0.5s ease-out; | ||||||
} | ||||||
``` | ||||||
|
||||||
</details> | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. |
||||||
|
||||||
## 進行状況を表示する | ||||||
|
||||||
Turbo ドライブのナビゲーション中、ブラウザはその進行状況インジケータを表示しません。 Turbo ドライブは、リクエスト発行中のフィードバックを示すため、CSS ベースのプログレスバーを導入しています。 | ||||||
|
@@ -198,11 +316,9 @@ Turbo.session.drive = false | |||||
|
||||||
## アセット変更時のリロード | ||||||
|
||||||
前述した通り、Turbo ドライブは `<head>` 要素のコンテントをマージします。しかし、CSS または JavaScript が変更された場合、これらCSS、JavaScriptのマージは既存のものを評価した上で行われます。大抵、このマージは厄介なコンフリクトを引き起こします。そのような場合、Ajaxではない標準のリクエストで新しいドキュメントを完全な形で取得する必要があります。 | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. |
||||||
|
||||||
Turbo ドライブは、あるページから別のページへの遷移時に `<head>` 内のアセット要素のURLを追跡し、URLが変更されていればフル・リロードを発行します。これによってユーザーは、最新のアプリケーションのスクリプトやスタイルを入手できます。 | ||||||
|
||||||
|
||||||
アセット要素を `data-turbo-track="reload"` をつけてアノテーションし、アセットのURLにバージョン識別番号をつけます。識別子は番号でも、最終更新日時でもよいですし、アセットの内容のダイジェストならもっといいでしょう。次の例のようにします。 | ||||||
これは、アセット要素に `data-turbo-track="reload"` をつけてアノテーションし、アセットのURLにバージョン識別番号をつけるだけで実現できます。識別子は番号でも、最終更新日時でもよいですし、アセットの内容のダイジェストならもっといいでしょう。次の例のようにします。 | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
|
||||||
```html | ||||||
<head> | ||||||
|
@@ -289,4 +405,173 @@ Turbo が POST リクエストに通常の200ステータスの応答を許さ | |||||
## フォーム送信後のストリーミング | ||||||
|
||||||
サーバーはフォームの送信に対して、レスポンス・ボディ内の一つ以上の `<turbo-stream>` 要素を伴う `Content-Type: text/vnd.turbo-stream.html` [Turboストリーム](/turbo/handbook/streams)メッセージで応答することもあります。この応答によって、ナビゲーションなしに、ページの複数箇所を更新することができます。 | ||||||
|
||||||
## ホバーでリンク先のプリフェッチ | ||||||
yasu551 marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||
|
||||||
Turbo は、ユーザーがリンクをクリックする前に発生した`mouseenter` イベントでリンク先を自動で読み込みます。これにより、リンク・ナビゲーションの待ち時間が短縮されます。通常、クリック・ナビゲーション単位で500から800ミリ秒の速度が向上します。 | ||||||
yasu551 marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||
|
||||||
リンク先のプリフェッチは、Turbo v8からデフォルトで有効になっています。ただ、以下のメタタグをページに追加すれば、無効化できます。 | ||||||
yasu551 marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||
|
||||||
```html | ||||||
<meta name="turbo-prefetch" content="false"> | ||||||
``` | ||||||
|
||||||
ユーザーが少しの間だけリンクをホバーしただけでリンク先をプリフェッチしないように、Turbo はリンク先をプリフェッチする前に100ミリ秒待ちます。 | ||||||
|
||||||
HTML要素、あるいは、その祖先に `data-turbo-prefetch="false"`をつけることで、プリフェッチ機能を要素ごとに無効化できます。 | ||||||
yasu551 marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||
|
||||||
```html | ||||||
<html> | ||||||
<head> | ||||||
<meta name="turbo-prefetch" content="true"> | ||||||
</head> | ||||||
<body> | ||||||
<a href="/articles">Articles</a> <!-- このリンク先はプリフェッチされます --> | ||||||
<a href="/about" data-turbo-prefetch="false">About</a> <!-- このリンク先はプリフェッチされません --> | ||||||
<div data-turbo-prefetch="false"`> | ||||||
<!-- このdiv内のリンクはプリフェッチされません --> | ||||||
</div> | ||||||
</body> | ||||||
</html> | ||||||
``` | ||||||
|
||||||
`turbo:before-prefetch` イベントをインターセプトして `event.preventDefault()` を呼ぶことで、プログラムでプリフェッチ機能を無効化できます。 | ||||||
|
||||||
```javascript | ||||||
document.addEventListener("turbo:before-prefetch", (event) => { | ||||||
if (isSavingData() || hasSlowInternet()) { | ||||||
event.preventDefault() | ||||||
} | ||||||
}) | ||||||
|
||||||
function isSavingData() { | ||||||
return navigator.connection?.saveData | ||||||
} | ||||||
|
||||||
function hasSlowInternet() { | ||||||
return navigator.connection?.effectiveType === "slow-2g" || | ||||||
navigator.connection?.effectiveType === "2g" | ||||||
} | ||||||
``` | ||||||
|
||||||
|
||||||
<details> | ||||||
<summary>原文</summary> | ||||||
|
||||||
Turbo can also speed up perceived link navigation latency by automatically loading links on `mouseenter` events, and before the user clicks the link. This usually leads to a speed bump of 500-800ms per click navigation. | ||||||
|
||||||
Prefetching links is enabled by default since Turbo v8, but you can disable it by adding this meta tag to your page: | ||||||
|
||||||
```html | ||||||
<meta name="turbo-prefetch" content="false"> | ||||||
``` | ||||||
|
||||||
To avoid prefetching links that the user is briefly hovering, Turbo waits 100ms after the user hovers over the link before prefetching it. But you may want to disable the prefetching behavior on certain links leading to pages with expensive rendering. | ||||||
|
||||||
You can disable the behavior on a per-element basis by annotating the element or any of its ancestors with `data-turbo-prefetch="false"`. | ||||||
|
||||||
```html | ||||||
<html> | ||||||
<head> | ||||||
<meta name="turbo-prefetch" content="true"> | ||||||
</head> | ||||||
<body> | ||||||
<a href="/articles">Articles</a> <!-- This link is prefetched --> | ||||||
<a href="/about" data-turbo-prefetch="false">About</a> <!-- Not prefetched --> | ||||||
<div data-turbo-prefetch="false"`> | ||||||
<!-- Links inside this div will not be prefetched --> | ||||||
</div> | ||||||
</body> | ||||||
</html> | ||||||
``` | ||||||
|
||||||
You can also disable the behaviour programatically by intercepting the `turbo:before-prefetch` event and calling `event.preventDefault()`. | ||||||
|
||||||
```javascript | ||||||
document.addEventListener("turbo:before-prefetch", (event) => { | ||||||
if (isSavingData() || hasSlowInternet()) { | ||||||
event.preventDefault() | ||||||
} | ||||||
}) | ||||||
|
||||||
function isSavingData() { | ||||||
return navigator.connection?.saveData | ||||||
} | ||||||
|
||||||
function hasSlowInternet() { | ||||||
return navigator.connection?.effectiveType === "slow-2g" || | ||||||
navigator.connection?.effectiveType === "2g" | ||||||
} | ||||||
``` | ||||||
</details> | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. |
||||||
|
||||||
## リンク先をキャッシュにプリロード | ||||||
|
||||||
[data-turbo-preload] 属性を使えば、リンク先をTurbo ドライブのキャッシュにプリロードできます。 | ||||||
yasu551 marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||
|
||||||
これにより、ページに初めてアクセスする前でもページのプレビューが提供され、ページアクセスが高速に感じられます。これはアプリケーション上で最も重要なページのプリロードに使えます。過剰な使用は、不要なコンテントを読み込むことになるので、避けてください。 | ||||||
yasu551 marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||
|
||||||
すべての `<a>` 要素がプリロードされるわけではありません。以下のような `[data-turbo-preload]` 属性を持つリンクはプリロードされません。 | ||||||
akira888 marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||
|
||||||
* 他のドメインにアクセスするリンク | ||||||
* ある `<turbo-frame>` 要素に対して適用される `[data-turbo-frame]` 属性を持つリンク | ||||||
* 先祖要素の `<turbo-frame>` に対して適用されるリンク | ||||||
* `[data-turbo="false"]` 属性を持つリンク | ||||||
* `[data-turbo-stream]` 属性を持つリンク | ||||||
* `[data-turbo-method]` 属性を持つリンク | ||||||
* 先祖要素が `[data-turbo="false"]` 属性を持つリンク | ||||||
* 先祖要素が `[data-turbo-prefetch="false"]` 属性を持つリンク | ||||||
|
||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. https://github.com/everyleaf/hotwire_ja/pull/65/files#diff-035a8e57b1c8014d17b31b3b57e9d8670e594a097c959b3755f544d23fbd5aa2R876 の訳がぬけていそうです! 🙏🏻
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 追加しました! |
||||||
<br><br> | ||||||
|
||||||
プリロードされた `<a>` 要素は [turbo:before-fetch-request] と [turbo:before-fetch-response] イベントをディスパッチすることに注意してください。`turbo:before-fetch-request` イベントがプリロードにより発生したのかそれとも他のメカニズムにより発生したのかの区別は、リクエストの `X-Sec-Purpose` ヘッダーに `"prefetch"`がセットされているかどうかで確認できます(`X-Sec-Purpose` ヘッダーの値は `event.detail.fetchOptions.headers["X-Sec-Purpose"]` プロパティから取得できます)。 | ||||||
|
||||||
```js | ||||||
addEventListener("turbo:before-fetch-request", (event) => { | ||||||
if (event.detail.fetchOptions.headers["X-Sec-Purpose"] === "prefetch") { | ||||||
// 追加のプリロード設定を行う | ||||||
} else { | ||||||
// 何かを行う | ||||||
} | ||||||
}) | ||||||
``` | ||||||
|
||||||
|
||||||
[data-turbo-preload]: /hotwire_ja/turbo/reference/attributes#data-attributes | ||||||
[turbo:before-fetch-request]: /hotwire_ja/turbo/reference/events#turbo%3Abefore-fetch-request | ||||||
[turbo:before-fetch-response]: /hotwire_ja/turbo/reference/events#turbo%3Abefore-fetch-response | ||||||
|
||||||
<details> | ||||||
<summary>原文</summary> | ||||||
|
||||||
Preload links into Turbo Drive's cache using the [data-turbo-preload][] boolean attribute. | ||||||
|
||||||
This will make page transitions feel lightning fast by providing a preview of a page even before the first visit. Use it to preload the most important pages in your application. Avoid over usage, as it will lead to loading content that is not needed. | ||||||
|
||||||
Not every `<a>` element can be preloaded. The `[data-turbo-preload]` attribute | ||||||
won't have any effect on links that: | ||||||
|
||||||
* navigate to another domain | ||||||
* have a `[data-turbo-frame]` attribute that drives a `<turbo-frame>` element | ||||||
* drive an ancestor `<turbo-frame>` element | ||||||
* have the `[data-turbo="false"]` attribute | ||||||
* have the `[data-turbo-stream]` attribute | ||||||
* have a `[data-turbo-method]` attribute | ||||||
* have an ancestor with the `[data-turbo="false"]` attribute | ||||||
* have an ancestor with the `[data-turbo-prefetch="false"]` attribute | ||||||
|
||||||
It also dovetails nicely with pages that leverage [Eager-Loading Frames](/reference/frames#eager-loaded-frame) or [Lazy-Loading Frames](/reference/frames#lazy-loaded-frame). As you can preload the structure of the page and show the user a meaningful loading state while the interesting content loads. | ||||||
<br><br> | ||||||
|
||||||
Note that preloaded `<a>` elements will dispatch [turbo:before-fetch-request](/reference/events) and [turbo:before-fetch-response](/reference/events) events. To distinguish a preloading `turbo:before-fetch-request` initiated event from an event initiated by another mechanism, check whether the request's `X-Sec-Purpose` header (read from the `event.detail.fetchOptions.headers["X-Sec-Purpose"]` property) is set to `"prefetch"`: | ||||||
|
||||||
```js | ||||||
addEventListener("turbo:before-fetch-request", (event) => { | ||||||
if (event.detail.fetchOptions.headers["X-Sec-Purpose"] === "prefetch") { | ||||||
// do additional preloading setup… | ||||||
} else { | ||||||
// do something else… | ||||||
} | ||||||
}) | ||||||
``` | ||||||
</details> | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
既存の原文の入っていないところにも、原文を追加していただきありがとうございます 🙏🏾 (すごく助かります。)
細かいのですが、原文側のセクションタイトルの部分が抜けてしまっているようなので、
合わせて追加していただけると嬉しいです。