Skip to content
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

Open
wants to merge 25 commits into
base: main
Choose a base branch
from

Conversation

yasu551
Copy link
Collaborator

@yasu551 yasu551 commented May 7, 2024

Comment on lines 19 to 20
描画中、Turbo ドライブはリクエストしているドキュメントの`<body>`の内容をレスポンスのドキュメントの`<body>`で置き換えます。`<head>`の内容もマージし、必要に応じて`<html>`要素の`lang`属性を更新します。`<head>`要素を置き換える代わりにマージするポイントは、`<title>`または`<meta>`タグが変わった時にそれらは期待どおり更新され、アセットのリンクが変わらない時にそのリンクに対して再び処理しないところです。

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment on lines +83 to +119
## 描画のカスタム

ドキュメント全体に対して `turbo:before-render` イベントリスナーを追加し、 `event.detail.render` プロパティをオーバーライドすることで、アプリケーションの描画プロセスをカスタマイズできます。

例えば、[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>

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment on lines 169 to 193
## アクセス前に確認ダイアログを表示する

リンクに `data-turbo-confirm` 属性を付けると、アクセス前に確認ダイアログが表示できます。

```html
<a href="/articles" data-turbo-confirm="このページから離れますか?">Back to articles</a>
<a href="/articles/54" data-turbo-method="delete" data-turbo-confirm="本当に記事を削除しますか?">Delete the article</a>
```

確認時に呼ぶメソッドは `Turbo.setConfirmMethod` を使って、変更できます。確認時に呼ぶメソッドのデフォルトは、ブラウザに組み込まれてる `confirm` です。

<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>

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment on lines 234 to 286
## ビュートランジション

[ビュートランジション API]を[サポートしているブラウザ]では、Turboはページ間を移動するときにビュートランジションをトリガーします。

Turbo は、現在と次のページの両方に以下の `<meta>` 要素があるときに、ビュートランジションをトリガーします。

```html
<meta name="view-transition" content="same-origin" />
```

Turbo は `<html>` 要素に `data-turbo-visit-direction` 属性を追加することで、トランジションの方向を指定できます。その属性の値として以下のものを使えます。

- `forward`: ページを全て変える方向
- `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>
Copy link
Collaborator Author

@yasu551 yasu551 Jun 17, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment on lines 410 to 508

## ホバーでリンク先のプリフェッチ

Turbo は、ユーザーがリンクをクリックする前に発生した`mouseenter` イベントでリンク先を自動で読み込みます。これにより、リンク・ナビゲーションの待ち時間が短縮されます。通常、クリック・ナビゲーション単位で500から800ミリ秒の速度が向上します。

リンク先のプリフェッチは、Turbo v8からデフォルトで有効になっています。ただ、以下のメタタグをページに追加すれば、無効化できます。

```html
<meta name="turbo-prefetch" content="false">
```

ユーザーが少しの間だけリンクをホバーしただけでリンク先をプリフェッチしないように、Turbo はリンク先をプリフェッチする前に100ミリ秒待ちます。

HTML要素、あるいは、その祖先に `data-turbo-prefetch="false"`をつけることで、プリフェッチ機能を要素ごとに無効化できます。

```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>
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment on lines 509 to 579

## リンク先をキャッシュにプリロード

[data-turbo-preload] 属性を使えば、リンク先をTurbo ドライブのキャッシュにプリロードできます。

これにより、ページに初めてアクセスする前でもページのプレビューが提供され、ページアクセスが高速に感じられます。これはアプリケーション上で最も重要なページのプリロードに使えます。過剰な使用は、不要なコンテントを読み込むことになるので、避けてください。

すべての `<a>` 要素がプリロードされるわけではありません。以下のような `[data-turbo-preload]` 属性を持つリンクはプリロードされません。

* 他のドメインにアクセスするリンク
* ある `<turbo-frame>` 要素に対して適用される `[data-turbo-frame]` 属性を持つリンク
* 先祖要素の `<turbo-frame>` に対して適用されるリンク
* `[data-turbo="false"]` 属性を持つリンク
* `[data-turbo-stream]` 属性を持つリンク
* `[data-turbo-method]` 属性を持つリンク
* 先祖要素が `[data-turbo="false"]` 属性を持つリンク
* 先祖要素が `[data-turbo-prefetch="false"]` 属性を持つリンク

<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>
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@yasu551 yasu551 marked this pull request as ready for review June 18, 2024 00:08
@yasu551 yasu551 marked this pull request as draft June 18, 2024 01:11
turbo/handbook/drive.md Outdated Show resolved Hide resolved
## 描画の一時停止

アプリケーションは描画を一時停止して、実行前に追加で下準備をすることができます
アプリケーションは描画を一時停止して、続行する前に追加で下準備をすることができます
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@@ -198,11 +316,9 @@ Turbo.session.drive = false

## アセット変更時のリロード

前述した通り、Turbo ドライブは `<head>` 要素のコンテントをマージします。しかし、CSS または JavaScript が変更された場合、これらCSS、JavaScriptのマージは既存のものを評価した上で行われます。大抵、このマージは厄介なコンフリクトを引き起こします。そのような場合、Ajaxではない標準のリクエストで新しいドキュメントを完全な形で取得する必要があります。
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.



アセット要素を `data-turbo-track="reload"` をつけてアノテーションし、アセットのURLにバージョン識別番号をつけます。識別子は番号でも、最終更新日時でもよいですし、アセットの内容のダイジェストならもっといいでしょう。次の例のようにします。
これは、アセット要素に `data-turbo-track="reload"` をつけてアノテーションし、アセットのURLにバージョン識別番号をつけるだけで実現できます。識別子は番号でも、最終更新日時でもよいですし、アセットの内容のダイジェストならもっといいでしょう。次の例のようにします。
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@yasu551 yasu551 marked this pull request as ready for review July 9, 2024 01:28
Copy link
Contributor

@akira888 akira888 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

front matter に order の追加をお願いします!

order : 2

turbo/handbook/drive.md Outdated Show resolved Hide resolved
turbo/handbook/drive.md Outdated Show resolved Hide resolved
turbo/handbook/drive.md Outdated Show resolved Hide resolved
turbo/handbook/drive.md Outdated Show resolved Hide resolved

Turbo は `<html>` 要素に `data-turbo-visit-direction` 属性を追加することで、トランジションの方向を指定できます。その属性の値として以下のものを使えます。

- `forward`: ページを全て変える方向
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

すべて変えるかどうかは、わからない?
新規ページというか、ページが進んだとき(戻ってないとき)のdirectionなのかなと思ったのですがどうでしょうか。
(良くわからないので、手元で動作確認してみます)

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

確かにそうですね。
トランジションの方向については、正確に理解できていないので、実際に使ってみてから修正します。

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ちょっと試してみました。
ページの進む(or 戻る)というような方向ではなく、TurboのVisitアクションのタイプ(advance, replace, or restore)によってビュートランジションを実行するかを指定できる、ということらしいです。

fef0b92

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

動作確認ありがとうございます!なるほど、、勉強になりました

turbo/handbook/drive.md Outdated Show resolved Hide resolved
turbo/handbook/drive.md Outdated Show resolved Hide resolved
turbo/handbook/drive.md Outdated Show resolved Hide resolved
turbo/handbook/drive.md Outdated Show resolved Hide resolved
turbo/handbook/drive.md Outdated Show resolved Hide resolved
turbo/handbook/drive.md Outdated Show resolved Hide resolved
* `[data-turbo-method]` 属性を持つリンク
* 先祖要素が `[data-turbo="false"]` 属性を持つリンク
* 先祖要素が `[data-turbo-prefetch="false"]` 属性を持つリンク

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

https://github.com/everyleaf/hotwire_ja/pull/65/files#diff-035a8e57b1c8014d17b31b3b57e9d8670e594a097c959b3755f544d23fbd5aa2R876 の訳がぬけていそうです! 🙏🏻

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.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

追加しました!
5cc6824

* 先祖要素が `[data-turbo="false"]` 属性を持つリンク
* 先祖要素が `[data-turbo-prefetch="false"]` 属性を持つリンク

また、[フレームの事前読み込み]や[フレームの遅延読み込み]を使ったページでも、プリロードはうまく噛み合います。ページの構造をプリロードし、興味があるコンテンツを読み込んでいる間、読み込んでいる状態を示すことができるからです。
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

a meaningfulの表現がないように思いましたので提案です

Suggested change
また、[フレームの事前読み込み][フレームの遅延読み込み]を使ったページでも、プリロードはうまく噛み合います。ページの構造をプリロードし、興味があるコンテンツを読み込んでいる間、読み込んでいる状態を示すことができるからです
また、[フレームの事前読み込み][フレームの遅延読み込み]を使ったページでも、プリロードはうまく噛み合います。ページの構造をプリロードし、興味があるコンテンツを読み込んでいる間、ユーザーに意味のある読み込み状態を示すことができるからです

Copy link
Collaborator

@otegami otegami left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

翻訳ありがとうございます。細かい点で気になったところをコメントしました。
強い意見ではないので、良さそうなところだけ取り入れてもらえればと思います。

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

既存の原文の入っていないところにも、原文を追加していただきありがとうございます 🙏🏾 (すごく助かります。)


細かいのですが、原文側のセクションタイトルの部分が抜けてしまっているようなので、
合わせて追加していただけると嬉しいです。


</details>

## 描画のカスタム
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[nits] 動詞 + 名詞の形なので、そのニュアンスを出してみるのはどうでしょう?

Suggested change
## 描画のカスタム
## 描画処理をカスタマイズする


## 描画のカスタム

ドキュメント全体に対して `turbo:before-render` イベントリスナーを追加し、 `event.detail.render` プロパティをオーバーライドすることで、アプリケーションの描画プロセスをカスタマイズできます。
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • overrideは、上書きと訳されている例のほうが多いので合わせてあげると良さそうです。
  • processは、処理みたいに訳してあげると統一性がありそうでしょうか?

@@ -97,6 +221,23 @@ document.addEventListener('turbo:before-render', async (event) => {
})
```

<details>
<summary>原文</summary>

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
## Pausing Rendering
Applications can pause rendering and make additional preparations before continuing.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

追加していただいた原文の部分が抜けていそうです。

## 異なるメソッドでアクセスを行う

デフォルトでは、リンクのクリックはサーバへ `GET` リクエストを送ります。しかし、これを `data-turbo-method` で変更することができます。

```html
<a href="/articles/54" data-turbo-method="delete">Delete the article</a>
<a href="/articles/54" data-turbo-method="delete">記事を削除する</a>
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍🏾 Good catch!


</details>

## ビュートランジション
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

少し違和感を感じなくもないのですが、「ビュー遷移 API」と訳されているようなので、合わせてあげると良さそうですかね。


## ビュートランジション

[ビュートランジション API]を[サポートしているブラウザ]では、Turbo はページ間を移動するときにビュートランジションをトリガーします。
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[nits]
triggerを発火と訳すと他の部分と一貫性があって良さそうに思いました。


Turbo ドライブは、あるページから別のページへの遷移時に `<head>` 内のアセット要素のURLを追跡し、URLが変更されていればフル・リロードを発行します。これによってユーザーは、最新のアプリケーションのスクリプトやスタイルを入手できます
これは、アセット要素に `data-turbo-track="reload"` をつけてアノテーションし、アセットのURLにバージョン識別番号をつけるだけで実現できます。識別子は番号でも、最終更新日時でもよいですし、アセットの内容のダイジェストならもっといいでしょう。次の例のようにします
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
これは、アセット要素に `data-turbo-track="reload"` をつけてアノテーションし、アセットのURLにバージョン識別番号をつけるだけで実現できます。識別子は番号でも、最終更新日時でもよいですし、アセットの内容のダイジェストならもっといいでしょう。次の例のようにします
これは、アセット要素に `data-turbo-track="reload"` をつけてアノテーションし、アセットのURLにバージョン識別番号をつけるだけで実現できます。識別子は番号でも、最終更新日時でもよいですし、次の例のようにアセットの内容のダイジェストならもっといいでしょう

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants