Skip to content

Commit f994808

Browse files
authored
[Документація/Просунуті теми/Розбиття коду] Вичитка (#257)
* Бандлінг * Розбиття коду та import() * Заголовок * React.lazy * Розбиття коду на основі маршрутів * Іменовані експорти
1 parent 44b4793 commit f994808

1 file changed

Lines changed: 37 additions & 41 deletions

File tree

content/docs/code-splitting.md

Lines changed: 37 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
11
---
22
id: code-splitting
3-
title: Code-Splitting
3+
title: Розбиття коду
44
permalink: docs/code-splitting.html
55
---
66

7-
## Розбиття по модулям {#bundling}
7+
## Зшивання файлів {#bundling}
88

9-
Більшість React додатків мають власні розбиті за "бандлами" файли використовуючи такі інструменти, як
10-
[Webpack](https://webpack.js.org/), [Rollup](https://rollupjs.org/) або
9+
Файли більшості React-додатків зшиваються разом за допомогою таких інструментів, як
10+
[Webpack](https://webpack.js.org/), [Rollup](https://rollupjs.org/) та
1111
[Browserify](http://browserify.org/).
12-
Бандлінг – це процес імпортування файлів та об'єднання їх в один файл – бандл (модуль).
13-
Цей бандл може потім бути включений до веб-сторінки для завантаження всього додатку
12+
Зшивання (бандлінг) – це процес об'єднання імпортованих файлів в один файл – бандл.
13+
Цей бандл потім може бути включений до веб-сторінки для завантаження всього додатку
1414
одночасно.
1515

1616
#### Приклад {#example}
1717

18-
**App:**
18+
**Застосунок:**
1919

2020
```js
2121
// app.js
@@ -31,7 +31,7 @@ export function add(a, b) {
3131
}
3232
```
3333

34-
**Bundle:**
34+
**Бандл:**
3535

3636
```js
3737
function add(a, b) {
@@ -45,38 +45,36 @@ console.log(add(16, 26)); // 42
4545
>
4646
> Наприкінці ваші бандли будуть значно відрізнятися від наведених прикладів.
4747
48-
Якщо ви використовуєте [Create React App](https://create-react-app.dev/), [Next.js](https://nextjs.org/), [Gatsby](https://www.gatsbyjs.org/) чи подібний інструмент, ви матимете налаштування Webpack за замовчуванням для бандлінгу вашого
49-
додатку.
48+
Якщо ви використовуєте [Create React App](https://create-react-app.dev/), [Next.js](https://nextjs.org/), [Gatsby](https://www.gatsbyjs.org/) чи подібний інструмент, Webpack за замовчуванням налаштований для бандлінгу вашого додатку.
5049

51-
Якщо ви не використовуєте нічого з наведеного чи подібного, вам доведеться налаштовувати бандлінг самостійно. Для прикладів ознайомтеся зі
50+
Якщо ви не використовуєте нічого з наведеного чи подібного, вам доведеться налаштувати бандлінг самостійно. Для прикладів ознайомтеся зі
5251
[Встановленням](https://webpack.js.org/guides/installation/) та
53-
[Початком роботи](https://webpack.js.org/guides/getting-started/) на офіційній
52+
[Початком роботи](https://webpack.js.org/guides/getting-started/) в офіційній
5453
документації Webpack.
5554

5655
## Розбиття Коду {#code-splitting}
5756

58-
Розбиття по бандлам – це прекрасно, але з темпом росту вашого додатку, бандли теж зростають.
59-
Це особливо помітно, якщо ви встановили та використовуєте великі сторонні бібліотеки. Вам потрібно
60-
стежити за кодом, який потрапляє у ваш бандл для того, щоб в один момент не зробити цей бандл настільки
61-
великим, що для завантаження вашого додатку знадобиться чимало часу.
57+
Зшивання файлів – це прекрасно, але з ростом вашого додатку розмір бандлу теж зростатиме.
58+
Особливо якщо ви використовуєте великі сторонні бібліотеки. Вам потрібно
59+
стежити за кодом, який ви включаєте у свій бандл, щоб випадково не зробити його настільки великим, що завантаження вашого застосунку займатиме багато часу.
6260

63-
Щоб уникнути розростання бандла, варто почати "розділяти" ваш бандл.
64-
Поділ коду - це функціонал, який підтримується такими бандлерами,
61+
Щоб уникнути розростання бандла, варто заздалегідь почати його розбивати на шматки.
62+
Розбиття коду - це функціонал, який підтримується такими бандлерами,
6563
як [Webpack](https://webpack.js.org/guides/code-splitting/),
6664
[Rollup](https://rollupjs.org/guide/en/#code-splitting) та Browserify (з
6765
[factor-bundle](https://github.com/browserify/factor-bundle)), що можуть створювати
68-
декілька бандлів та завантажувати їх у разі потреби.
66+
декілька окремих бандлів, які можна динамічно завантажувати під час виконання застосунку.
6967

70-
Розбиття коду вашого додатку може допомогти поступово завантажити тільки те,
68+
Розбиття коду вашого додатку може допомогти "ліниво" завантажувати (lazy load) тільки те,
7169
що необхідно користувачеві в цей момент. Це може значно покращити продуктивність вашого
72-
додатку. Хоча ви не скоротили кількість коду вашого додатку, ви уникнули завантаження
73-
коду, який може ніколи не знадобитись користувачеві та скоротили об'єм коду, що необхідний
70+
додатку. Хоч ви й не скорочуєте обсяг коду вашого додатку, ви уникаєте завантаження
71+
того коду, який може ніколи не знадобитись користувачеві, а також скорочуєте обсяг коду, що необхідний
7472
на початку завантаження додатку.
7573

7674
## `import()` {#import}
7775

7876
Найращий спосіб впровадження розбиття коду — через синтаксис
79-
динамічних `import()`
77+
динамічного `import()`
8078

8179
**До:**
8280

@@ -94,24 +92,22 @@ import("./math").then(math => {
9492
});
9593
```
9694

97-
В той момент, коли Webpack стикається з таким синтаксисом, він автоматично починає розбивати код вашого додатку.
98-
Якщо ви вже користуєтесь Create React App, це вже налаштовано для вас
99-
та ви можете одразу [почати користуватися цим](https://facebook.github.io/create-react-app/docs/code-splitting). Це також підтримується
100-
у [Next.js](https://nextjs.org/docs/advanced-features/dynamic-import) за замовчуванням.
95+
Коли Webpack стикається з таким синтаксисом, він автоматично починає розбивати код вашого додатку.
96+
Якщо ви користуєтесь Create React App, він вже налаштований відповідним чином, і ви можете одразу почати [користуватися розбиттям коду](https://facebook.github.io/create-react-app/docs/code-splitting). У [Next.js](https://nextjs.org/docs/advanced-features/dynamic-import) розбиття коду також підтримується за замовчуванням.
10197

10298
Під час самостійного налаштування Webpack, скоріш за все, у вас з'явиться бажання прочитати
10399
[інструкцію з розбиття коду](https://webpack.js.org/guides/code-splitting/) від Webpack. Конфігурація вашого Webpack повинна мати вигляд, [схожий на цей](https://gist.github.com/gaearon/ca6e803f5c604d37468b0091d9959269).
104100

105-
Під час використання [Babel](https://babeljs.io/), ви маєте пересвідчитись в тому, що Babel може парсити синтаксис динамічних import, виключаючи можливість його перетворення.
101+
В разі використання [Babel](https://babeljs.io/) ви маєте пересвідчитись в тому, що Babel може парсити синтаксис динамічного import(), але не перетворює його.
106102
Для цього вам знадобиться [babel-plugin-syntax-dynamic-import](https://yarnpkg.com/en/package/babel-plugin-syntax-dynamic-import).
107103

108104
## `React.lazy` {#reactlazy}
109105

110106
> Примітка:
111107
>
112-
> `React.lazy` та Suspense ще не доступні для рендерингу на стороні сервера. Якщо ви хочете використовувати розбиття коду в додатках відрендерених на сервері, ми рекомендуємо [Loadable Components](https://github.com/gregberge/loadable-components). Він має гарну [інструкцію для розбиття на бандли, використовуючи серверний рендеринг](https://loadable-components.com/docs/server-side-rendering/).
108+
> `React.lazy` та Suspense ще не доступні для рендерингу на стороні сервера. Якщо ви хочете використовувати розбиття коду в додатках, відрендерених на сервері, ми рекомендуємо [Loadable Components](https://github.com/gregberge/loadable-components). Вони мають гарну [інструкцію для розбиття на бандли з використанням серверного рендерингу](https://loadable-components.com/docs/server-side-rendering/).
113109
114-
Функція `React.lazy` дозволяє вам рендерити динамічний import, як звичайний компонент
110+
Функція `React.lazy` дозволяє вам рендерити динамічний import як звичайний компонент
115111

116112
**До:**
117113

@@ -125,11 +121,11 @@ import OtherComponent from './OtherComponent';
125121
const OtherComponent = React.lazy(() => import('./OtherComponent'));
126122
```
127123

128-
Цей код автоматично завантажить бандл, що містить `OtherComponent` коли цей компонент відрендеритися вперше.
124+
Цей код автоматично завантажить бандл, що містить `OtherComponent`, коли цей компонент буде рендеритися вперше.
129125

130-
`React.lazy` приймає функцію, яка має викликати динамічний `import()`. Потім повертається `Promise`, який при успішному виконанні поверне модуль з `default` експортом, а у цьому модулі у свою чергу знаходитиметься React-компонент.
126+
`React.lazy` приймає функцію, яка має викликати динамічний `import()`. Вона має повернути `Promise`, який при вирішенні поверне модуль з `default`-експортом, який містить React-компонент.
131127

132-
Ледачий компонент потім повинен відрендеритися у тілі компонента `Suspense`. Це дозволить нам показати резервний контент (наприклад, індикатор завантаження), поки ми чекаємо коли ледачий компонент завантажиться.
128+
Ледачий компонент потім повинен відрендеритися у тілі компонента `Suspense`. Це дозволяє нам показати резервний контент (наприклад, індикатор завантаження), поки ми чекаємо на завантаження ледачого компонента.
133129

134130
```js
135131
import React, { Suspense } from 'react';
@@ -147,7 +143,7 @@ function MyComponent() {
147143
}
148144
```
149145

150-
`fallback` приймає будь-який React елемент, поки чекає повного завантаження компонента. Компонент `Suspense` можна розмістити де завгодно над "ледачим" компонентом. Ви навіть можете обернути кілька "ледачих" компонентів за допомогою одного `Suspense` компонента
146+
Проп `fallback` приймає будь-який елемент React, який слід відобразити до повного завантаження компонента. Компонент `Suspense` можна розмістити де завгодно над "ледачим" компонентом. Ви навіть можете обгорнути кілька "ледачих" компонентів одним компонентом `Suspense`.
151147

152148
```js
153149
import React, { Suspense } from 'react';
@@ -171,7 +167,7 @@ function MyComponent() {
171167

172168
### Запобіжники {#error-boundaries}
173169

174-
Якщо інший модуль не завантажився (наприклад, через виключений інтернет)це призведе до помилки. Ви можете обробити ці помилки, щоб створити гарний досвід користування і керувати відновленням за допомогою [Запобіжників](/docs/error-boundaries.html). Після створення запобіжника, його можна використати де завгодно над "ледачим" компонентами для того, щоб показати стан помилки, коли виникає проблема з мережою.
170+
Якщо інший модуль не зміг завантажитися (наприклад, через вимкнений інтернет), це призведе до помилки. Ви можете обробляти такі помилки, щоб створити гарний досвід користування і керувати відновленням за допомогою [Запобіжників](/docs/error-boundaries.html). Після створення запобіжника, його можна використовувати де завгодно над "ледачими" компонентами для того, щоб показати стан помилки, коли виникає проблема з мережею.
175171

176172
```js
177173
import React, { Suspense } from 'react';
@@ -196,16 +192,16 @@ const MyComponent = () => (
196192

197193
## Розбиття коду на основі маршрутів {#route-based-code-splitting}
198194

199-
Рішення стосовно того, де саме вводити розбиття коду може бути доволі складним.
200-
Ви хочете переконатися, що ви обираєте місця, які рівномірно розділять ваші бандли,
201-
але в жодному разі не порушуватимуть роботу користувача.
195+
Вирішувати, де саме запроваджувати розбиття коду, часом буває непросто.
196+
Слід намагатися обирати місця для розбиття таким чином, щоб розбивати бандли рівномірно,
197+
але при цьому не створювати проблем для користувача.
202198

203-
Вдалим місцем для початку може бути ваш файл з маршрутами додатку. Більшість людей
199+
Почати можна із маршрутів додатку. Більшість людей
204200
звикли до того, що перехід між сторінками займає певний час. Крім того, ви часто
205201
перезавантажуєте цілу сторінку одразу, тому користувачі навряд чи будуть взаємодіяти
206202
з іншими елементами на сторінці в цей час.
207203

208-
Нижче наведено приклад налаштування розбиття коду файла з маршрутами додатку, використовуючи
204+
Нижче наведено приклад налаштування розбиття коду на основі маршрутів, використовуючи
209205
бібліотеку [React Router](https://reacttraining.com/react-router/) за допомогою `React.lazy`.
210206

211207
```js
@@ -229,7 +225,7 @@ const App = () => (
229225

230226
## Іменовані Експорти {#named-exports}
231227

232-
Наразі `React.lazy` підтримує тількі експорти за замовчуванням. Якщо модуль, який ви імпортуєте використовує іменовані експорти, можна створити проміжний модуль, який повторно експортуватиме його за замовчуванням. Це гарантує працездатність tree shaking - механізма усунення невикористаного коду.
228+
Наразі `React.lazy` підтримує тільки експорти за замовчуванням. Якщо модуль, який ви імпортуєте, використовує іменовані експорти, можна створити проміжний модуль, який повторно експортуватиме потрібний компонент за замовчуванням. Це гарантуватиме працездатність tree shaking - механізму усунення невикористаного коду.
233229

234230
```js
235231
// ManyComponents.js

0 commit comments

Comments
 (0)