Skip to content

Commit aa46e2c

Browse files
authoredMay 27, 2017
Merge pull request #8 from Haeresis/data
Traduction `data.md`
2 parents b3874c6 + 84ccc85 commit aa46e2c

File tree

2 files changed

+62
-62
lines changed

2 files changed

+62
-62
lines changed
 

‎en/SUMMARY.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
- [Écrire du code universel (En)](universal.md)
33
- [Structure de code (En)](structure.md)
44
- [Routage et scission du code](routing.md)
5-
- [Pré-chargement et état (En)](data.md)
5+
- [Récupération de données et état (En)](data.md)
66
- [Hydratation côté client (En)](hydration.md)
77
- [Introduction à l'empaquetage (En)](bundle-renderer.md)
88
- [Configuration de pré-compilation (En)](build-config.md)

‎en/data.md

+61-61
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
1-
# Pré-chargement et état (En) <br><br> *Cette page est en cours de traduction française. Revenez une autre fois pour lire une traduction achevée ou [participez à la traduction française ici](https://github.com/vuejs-fr/vue-ssr-docs).*
1+
# Récupération de données et état
22

3-
## Data Store
3+
## Gestionnaire d'état des données
44

5-
During SSR, we are essentially rendering a "snapshot" of our app, so if the app relies on some asynchronous data, **these data need to be pre-fetched and resolved before we start the rendering process**.
5+
Pendant le SSR, nous allons essentiellement faire le rendu d'un « instantané » de notre application, aussi si votre application est liée à des données asynchrones, **ces données vont devoir être pré-chargées et résolues avant de débuter la phase de rendu**.
66

7-
Another concern is that on the client, the same data needs to be available before we mount the client side app - otherwise the client app would render using different state and the hydration would fail.
7+
Un autre point important côté client ; les mêmes données doivent être disponibles avant que l'application ne soit montée, autrement, l'application côté client va faire le rendu d'un état différent et l'hydratation va échouer.
88

9-
To address this, the fetched data needs to live outside the view components, in a dedicated data store, or a "state container". On the server, we can pre-fetch and fill data into the store before rendering. In addition, we will serialize and inline the state in the HTML. The client-side store can directly pick up the inlined state before we mount the app.
9+
Pour résoudre cela, les données pré-chargées doivent vivre en dehors de la vue du composant, dans un gestionnaire de données, ou dans un « gestionnaire d'état ». Côté serveur, nous pouvons pré-charger et remplir les données dans le gestionnaire de données avant le rendu. De plus, nous allons sérialiser et injecter l'état dans le HTML. Le gestionnaire de données côté client pourra directement récupérer l'état depuis le HTML avant que l'application ne soit montée.
1010

11-
We will be using the official state management library [Vuex](https://github.com/vuejs/vuex/) for this purpose. Let's create a `store.js` file, with some mocked logic for fetching an item based on an id:
11+
Nous allons utiliser le gestionnaire d'état officiel (« store ») de la bibliothèque [Vuex](https://github.com/vuejs/vuex/) pour cette partie. Créons un fichier `store.js`, avec divers jeux de logique pour pré-charger un élément en nous basant sur un identifiant :
1212

1313
``` js
1414
// store.js
@@ -17,8 +17,8 @@ import Vuex from 'vuex'
1717

1818
Vue.use(Vuex)
1919

20-
// Assume we have a universal API that returns Promises
21-
// and ignore the implementation details
20+
// Supposons que nous ayons une API universelle retournant
21+
// des Promesses (« Promise ») et ignorons les détails de l'implémentation
2222
import { fetchItem } from './api'
2323

2424
export function createStore () {
@@ -28,8 +28,8 @@ export function createStore () {
2828
},
2929
actions: {
3030
fetchItem ({ commit }, id) {
31-
// return the Promise via `store.dispatch()` so that we know
32-
// when the data has been fetched
31+
// retournant la Promesse via `store.dispatch()`, nous savons
32+
// quand les données ont été pré-chargées
3333
return fetchItem(id).then(item => {
3434
commit('setItem', { id, item })
3535
})
@@ -44,7 +44,7 @@ export function createStore () {
4444
}
4545
```
4646

47-
And update `app.js`:
47+
Et mettons à jour `app.js`:
4848

4949
``` js
5050
// app.js
@@ -55,32 +55,32 @@ import { createStore } from './store'
5555
import { sync } from 'vuex-router-sync'
5656

5757
export function createApp () {
58-
// create router and store instances
58+
// créer le routeur et l'instance du store
5959
const router = createRouter()
6060
const store = createStore()
6161

62-
// sync so that route state is available as part of the store
62+
// synchroniser pour que l'état de la route soit disponible en tant que donnée du store
6363
sync(store, router)
6464

65-
// create the app instance, injecting both the router and the store
65+
// créer l'instance de l'application, injecter le routeur et le store
6666
const app = new Vue({
6767
router,
6868
store,
6969
render: h => h(App)
7070
})
7171

72-
// expose the app, the router and the store.
72+
// exposer l'application, le routeur et le store.
7373
return { app, router, store }
7474
}
7575
```
7676

77-
## Logic Collocation with Components
77+
## Collocation logique avec les composants
7878

79-
So, where do we place the code that dispatches the data-fetching actions?
79+
Donc, où devons nous appeler le code en charge de l'action de récupération de données ?
8080

81-
The data we need to fetch is determined by the route visited - which also determines what components are rendered. In fact, the data needed for a given route is also the data needed by the components rendered at that route. So it would be natural to place the data fetching logic inside route components.
81+
Les données que nous avons besoin de pré-charger sont déterminées par la route visitée, qui va aussi déterminer quels composants vont être rendus. En fait, les données nécessaires a une route donnée sont aussi les données nécessaires aux composants pour être rendus pour une route. Aussi il serait naturel de placer la logique de récupération de données à l'intérieur des composants de route.
8282

83-
We will expose a custom static function `asyncData` on our route components. Note because this function will be called before the components are instantiated, it doesn't have access to `this`. The store and route information needs to be passed in as arguments:
83+
Nous allons exposer une fonction statique personnalisée `asyncData` sur nos composants de route. Notez que, puisque cette fonction va être appelée avant l'instanciation des composants, l'accès à `this` ne sera pas possible. Le store et les informations de route ont donc besoin d'être passés en tant qu'arguments :
8484

8585
``` html
8686
<!-- Item.vue -->
@@ -91,12 +91,12 @@ We will expose a custom static function `asyncData` on our route components. Not
9191
<script>
9292
export default {
9393
asyncData ({ store, route }) {
94-
// return the Promise from the action
94+
// retourner la Promesse depuis l'action
9595
return store.dispatch('fetchItem', route.params.id)
9696
},
9797
9898
computed: {
99-
// display the item from store state.
99+
// afficher l'élément depuis l'état du store.
100100
item () {
101101
return this.$store.state.items[this.$route.params.id]
102102
}
@@ -105,9 +105,9 @@ export default {
105105
</script>
106106
```
107107

108-
## Server Data Fetching
108+
## Récupération de données côté serveur
109109

110-
In `entry-server.js` we can get the components matched by a route with `router.getMatchedComponents()`, and call `asyncData` if the component exposes it. Then we need to attach resolved state to the render context.
110+
Dans `entry-server.js` nous pouvons obtenir les composants qui concordent avec une route grâce à `router.getMatchedComponents()`, et appeler `asyncData` si le composant l'expose. Nous avons ensuite besoin d'attacher l'état résolu au contexte de rendu.
111111

112112
``` js
113113
// entry-server.js
@@ -125,7 +125,7 @@ export default context => {
125125
return reject({ code: 404 })
126126
}
127127

128-
// call `asyncData()` on all matched route components
128+
// appeler `asyncData()` sur toutes les routes concordantes
129129
Promise.all(matchedComponents.map(Component => {
130130
if (Component.asyncData) {
131131
return Component.asyncData({
@@ -134,11 +134,11 @@ export default context => {
134134
})
135135
}
136136
})).then(() => {
137-
// After all preFetch hooks are resolved, our store is now
138-
// filled with the state needed to render the app.
139-
// When we attach the state to the context, and the `template` option
140-
// is used for the renderer, the state will automatically be
141-
// serialized and injected into the HTML as window.__INITIAL_STATE__.
137+
// Après que chaque hook de pré-chargement soit résolu, notre store est maintenant
138+
// rempli avec l'état nécessaire au rendu de l'application.
139+
// Quand nous attachons l'état au contexte, et que l'option `template`
140+
// est utilisée pour faire le rendu, l'état va automatiquement être
141+
// être sérialisé et injecté dans le HTML en tant que `window.__INITIAL_STATE__`.
142142
context.state = store.state
143143

144144
resolve(app)
@@ -148,7 +148,7 @@ export default context => {
148148
}
149149
```
150150

151-
When using `template`, `context.state` will automatically be embedded in the final HTML as `window.__INITIAL_STATE__` state. On the client, the store should pick up the state before mounting the application:
151+
En utilisant `template`, `context.state` va automatiquement être encapsulé dans le HTML final en tant qu'état `window.__INITIAL_STATE__`. Côté client, le store voudra récupérer cet état avant de monter l'application :
152152

153153
``` js
154154
// entry-client.js
@@ -160,32 +160,32 @@ if (window.__INITIAL_STATE__) {
160160
}
161161
```
162162

163-
## Client Data Fetching
163+
## Récupération de données côté client
164164

165-
On the client, there are two different approaches for handling data fetching:
165+
Côté client, il y a deux différentes approches pour gérer du récapération de données :
166166

167-
1. **Resolve data before route navigation:**
167+
1. **Résoudre les données avant de changer de route :**
168168

169-
With this strategy, the app will stay on the current view until the data needed by the incoming view has been resolved. The benefit is that the incoming view can directly render the full content when it's ready, but if the data fetching takes a long time, the user will feel "stuck" on the current view. It is therefore recommended to provide a data loading indicator if using this strategy.
169+
Avec cette stratégie, l'application va rester sur la vue courante jusqu'à ce que les données nécessaires à la vue suivante soient résolues. L'avantage est que la vue suivante pourra faire le rendu complet du contenu aussitôt qu'il sera prêt, mais si les données mettent trop de temps à charger, l'utilisateur va se sentir « bloquer » sur la vue courante. C'est pourquoi il est recommandé de fournir un indicateur de chargement si vous utilisez cette stratégie.
170170

171-
We can implement this strategy on the client by checking matched components and invoking their `asyncData` function inside a global route hook. Note we should register this hook after the initial route is ready so that we don't unnecessarily fetch the server-fetched data again.
171+
Nous pouvons implémenter cette stratégie côté client en vérifiant la concordance des composants et en exécutant leurs fonctions `asyncData` à l'intérieur du hook global du routeur. Notez que nous devrions enregistrer ce hook après que la route initiale ne soit prête et donc il n'est pas nécessaire de pré-charger de nouveau les données du serveur ayant déjà été pré-chargées.
172172

173173
``` js
174174
// entry-client.js
175175

176-
// ...omitting unrelated code
176+
// ...omission du code sans rapport
177177

178178
router.onReady(() => {
179-
// Add router hook for handling asyncData.
180-
// Doing it after initial route is resolved so that we don't double-fetch
181-
// the data that we already have. Using `router.beforeResolve()` so that all
182-
// async components are resolved.
179+
// Ajouter le hook du routeur pour gérer `asyncData`
180+
// Cela étant fait après la résolution de la route initial, évitons une double récupération de données
181+
// des données que nous avons déjà. Utilisation de `router.beforeResolve()`, ainsi tous
182+
// les composants asynchrones sont résolues.
183183
router.beforeResolve((to, from, next) => {
184184
const matched = router.getMatchedComponents(to)
185185
const prevMatched = router.getMatchedComponents(from)
186186

187-
// we only care about none-previously-rendered components,
188-
// so we compare them until the two matched lists differ
187+
// nous allons uniquement nous occuper des composants qui n'ont pas déjà été rendu
188+
// aussi nous allons les comparer jusqu'à ce que deux éléments concordant diffères
189189
let diffed = false
190190
const activated = matched.filter((c, i) => {
191191
return diffed || (diffed = (prevMatched[i] !== c))
@@ -195,15 +195,15 @@ On the client, there are two different approaches for handling data fetching:
195195
return next()
196196
}
197197

198-
// this is where we should trigger a loading indicator if there is one
198+
// c'est ici qu'il faudrait lancer un indicateur de chargement si nous en avions un
199199

200200
Promise.all(activated.map(c => {
201201
if (c.asyncData) {
202202
return c.asyncData({ store, route: to })
203203
}
204204
})).then(() => {
205205

206-
// stop loading indicator
206+
// arrêt de l'indicateur de chargement
207207

208208
next()
209209
}).catch(next)
@@ -213,20 +213,20 @@ On the client, there are two different approaches for handling data fetching:
213213
})
214214
```
215215

216-
2. **Fetch data after the matched view is rendered:**
216+
2. **Récupérer les données après que les vues concordantes soient rendues :**
217217

218-
This strategy places the client-side data-fetching logic in a view component's `beforeMount` function. This allows the views to switch instantly when a route navigation is triggered, so the app feels a bit more responsive. However, the incoming view will not have the full data available when it's rendered. It is therefore necessary to have a conditional loading state for each view component that uses this strategy.
218+
Cette stratégie place la logique de récupération de données côté client dans la fonction `beforeMount` de la vue du composant. Cela permet aux vues de changer instantanément quand un changement de route est enclenché, aussi l'application semblera un peu plus réactive. Cependant, la vue suivante n'aura pas l'intégralité de ses données disponibles lors du rendu. Il est donc nécessaire d'avoir un état de chargement conditionnel pour chaque vue de composant utilisant cette stratégie.
219219

220-
This can be achieved with a client-only global mixin:
220+
Cela peut être réalisé avec un mixin global uniquement côté client :
221221

222222
``` js
223223
Vue.mixin({
224224
beforeMount () {
225225
const { asyncData } = this.$options
226226
if (asyncData) {
227-
// assign the fetch operation to a promise
228-
// so that in components we can do `this.dataPromise.then(...)` to
229-
// perform other tasks after data is ready
227+
// assigner une opération de récupération de données à une Promesse
228+
// ainsi tout ce que nous devons faire dans un composant est `this.dataPromise.then(...)`
229+
// pour exécuter la suite des tâches une fois que les données sont prêtes
230230
this.dataPromise = asyncData({
231231
store: this.$store,
232232
route: this.$route
@@ -236,7 +236,7 @@ On the client, there are two different approaches for handling data fetching:
236236
})
237237
```
238238

239-
The two strategies are ultimately different UX decisions and should be picked based on the actual scenario of the app you are building. But regardless of which strategy you pick, the `asyncData` function should also be called when a route component is reused (same route, but params or query changed. e.g. from `user/1` to `user/2`). We can also handle this with a client-only global mixin:
239+
Les deux stratégies conduisent à une expérience utilisateur singulièrement différente et doivent être choisis en fonction du scénario de l'application que vous construisez. Mais indépendamment de votre choix de stratégie, la fonction `asyncData` devrait également être appelée quand la route d'un composant est de nouveau utilisée (même route, mais avec des paramètres ou une demande « query » différente comme par ex. avec `utilisateur/1` et `utilisateur/2`). Nous pouvons également réaliser ceci avec un mixin global uniquement côté client.
240240

241241
``` js
242242
Vue.mixin({
@@ -254,16 +254,16 @@ Vue.mixin({
254254
})
255255
```
256256

257-
## Store Code Splitting
257+
## Scission de code du Store
258258

259-
In a large application, our vuex store will likely be split into multiple modules. Of course, it is also possible to code-split these modules into corresponding route component chunks. Suppose we have the following store module:
259+
Dans une grosse application, notre store Vuex va très probablement être scinder dans de multiples modules. Bien sur, il est aussi possible de scinder le code de ces modules en fragments correspondant aux routes. Supposons que nous ayons le module store suivant :
260260

261261
``` js
262262
// store/modules/foo.js
263263
export default {
264264
namespaced: true,
265-
// IMPORTANT: state must be a function so the module can be
266-
// instantiated multiple times
265+
// IMPORTANT: l'état doit être une fonction sinon le module ne
266+
// pourra pas être instancié de multiples fois
267267
state: () => ({
268268
count: 0
269269
}),
@@ -276,7 +276,7 @@ export default {
276276
}
277277
```
278278

279-
We can use `store.registerModule` to lazy-register this module in a route component's `asyncData` hook:
279+
Nous pouvons utiliser `store.registerModule` pour enregistrer ce module à la volée dans le hook `asyncData` du composant :
280280

281281
``` html
282282
// inside a route component
@@ -285,7 +285,7 @@ We can use `store.registerModule` to lazy-register this module in a route compon
285285
</template>
286286

287287
<script>
288-
// import the module here instead of in `store/index.js`
288+
// importer le module d'ici et non de `store/index.js`
289289
import fooStoreModule from '../store/modules/foo'
290290
291291
export default {
@@ -294,8 +294,8 @@ export default {
294294
return store.dispatch('foo/inc')
295295
},
296296
297-
// IMPORTANT: avoid duplicate module registration on the client
298-
// when the route is visited multiple times.
297+
// IMPORTANT: il faut éviter le double enregistrement de module côté client
298+
// quand la route est visitée plusieurs fois.
299299
destroyed () {
300300
this.$store.unregisterModule('foo')
301301
},
@@ -309,8 +309,8 @@ export default {
309309
</script>
310310
```
311311

312-
Because the module is now a dependency of the route component, it will be moved into the route component's async chunk by webpack.
312+
Parce que le module est maintenant une dépendance du composant de route, il peut a présent être déplacer dans un fragment de composant de route par webpack.
313313

314314
---
315315

316-
Phew, that was a lot of code! This is because universal data-fetching is probably the most complex problem in a server-rendered app and we are laying the groundwork for easier further development. Once the boilerplate is set up, authoring individual components will be actually quite pleasant.
316+
Fiou, cela fait pas mal de code ! Cela est dû au fait que le pré-chargement universel est probablement le problème le plus complexe d'une application avec rendu côté serveur et nous avons poser les bases pour un développement futur plus simple. Maintenant que cette base est mise en place, modifier des composants individuellement sera en fait plutôt agréable.

0 commit comments

Comments
 (0)
Please sign in to comment.