Skip to content

Доработки к 2.3.1 #7

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

Merged
merged 3 commits into from
May 2, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 12 additions & 2 deletions ru/api.md
Original file line number Diff line number Diff line change
Expand Up @@ -130,10 +130,20 @@ const renderer = createBundleRenderer(serverBundle, { ... })

- 2.3.0+
- используется только в `createBundleRenderer`
- Ожидается: `boolean | 'once'` (`'once'` поддерживается только с версии 2.3.1+)

По умолчанию, рендерер сборки будет создавать новый контекст V8 для каждого рендеринга и повторно исполнять всю сборку. Это имеет некоторые преимущества — например, не нужно беспокоиться о проблеме «синглетона с состоянием», о которой упоминали ранее. Однако этот режим требует значительных затрат производительности, поскольку повторное выполнение сборки обходится дорого, особенно когда приложение становится большим.
По умолчанию, рендерер сборки будет создавать новый контекст V8 для каждого рендеринга и повторно исполнять всю сборку. Это имеет некоторые преимущества — например, код приложения изолирован от процесса сервера и не нужно беспокоиться [о проблеме «синглетона с состоянием»](./structure.md#avoid-stateful-singletons), о которой упоминали ранее в руководстве. Однако этот режим требует значительных затрат производительности, поскольку повторное выполнение сборки обходится дорого, особенно когда приложение становится большим.

По умолчанию эта опция имеет значение `true` для обеспечения обратной совместимости, но рекомендуется использовать `runInNewContext: false` всегда, когда это возможно.
По умолчанию эта опция имеет значение `true` для обеспечения обратной совместимости, но рекомендуется использовать `runInNewContext: false` или `runInNewContext: 'once'` всегда, когда это возможно.

> В версии 2.3.0 у этой опции есть ошибка, когда при `runInNewContext: false` сборка всё ещё исполнялась в отдельном глобальном контексте. Информация далее предполагает использование версии 2.3.1+.

С опцией `runInNewContext: false`, код сборки будет выполняться в том же контексте `global`, что и серверный процесс, поэтому нужно быть осторожным с кодом, который изменяет `global` в вашем приложении.

С опцией `runInNewContext: 'once'` (добавлено в версии 2.3.1+), сборка выполняется в отдельном контексте `global`, но только один раз при запуске. Это обеспечивает лучшую изоляцию кода приложения поскольку предотвращает случайно загрязнение объекта `global` серверного процесса. Предостережения заключаются в следующем:

1. Зависимости, которые изменяют `global` (например, полифиллы) не должны быть объявлены внешними зависимостями в этом режиме;
2. Значения, возвращаемые при выполнении сборки будут использовать разные глобальные конструкторы, например, ошибка внутри сборки не будет экземпляром `Error` в серверном процессе.

См. также: [Структура исходного кода](./structure.md)

Expand Down
2 changes: 1 addition & 1 deletion ru/build-config.md
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ const renderer = createBundleRenderer('/path/to/vue-ssr-server-bundle.json', {

Обратите внимание, что в параметре `externals` мы указываем белый список CSS файлов. Это связано с тем, что CSS, импортированный из зависимостей всё равно должен быть обработан Webpack. Если вы импортируете любые другие типы файлов, которые также полагаются на Webpack (например, `*.vue`, `*.sass`), вы должны их также добавить в белый список.

Другим типом модулей для добавления в белый список являются полифиллы, которые изменяют `global`, например `babel-polyfill`. Это связано с тем, что **код внутри серверной сборки имеет свой собственный объект `global`**. Поскольку это не будет нужно на сервере при использовании Node 7.6+, на самом деле проще просто импортировать его в клиентской точке входа.
Если вы используете `runInNewContext: 'once'` или `runInNewContext: true`, вам также требуется добавить в белый список являются полифиллы, которые изменяют `global`, например `babel-polyfill`. Это связано с тем, что при использовании режима нового контекста, **код внутри серверной сборки имеет свой собственный объект `global`**. Поскольку это не будет нужно на сервере при использовании Node 7.6+, на самом деле проще просто импортировать его в клиентской точке входа.

## Конфигурация клиентской части

Expand Down
10 changes: 1 addition & 9 deletions ru/bundle-renderer.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,12 +49,4 @@ server.get('*', (req, res) => {

Когда `renderToString` вызывается в рендерере, он автоматически выполнит функцию, экспортируемую сборкой для создания экземпляра приложения (передавая `context` в качестве аргумента), а затем рендерит его.

---

### Опция `runInNewContext`

По умолчанию, для каждого рендера сборки будет создаваться новый контекст V8 и повторно исполняться вся сборка. Это имеет некоторые преимущества — например, нам не нужно будет беспокоиться о проблеме «синглетонов с состоянием», о которой упоминалось ранее. Однако, этот режим требует значительных затрат производительности, поскольку повторное выполнение всей сборки стоит дорого, особенно когда приложение становится большим.

В `vue-server-renderer >= 2.3.0`, эта опция по-прежнему установлена по умолчанию в `true` для обеспечения обратной совместимости, но рекомендуется использовать `runInNewContext: false` всегда, когда это возможно.

Обратите внимание, что при использовании `runInNewContext: false`, сборка всё ещё **выполняется в отдельном контексте `global`**, но только один раз. Это предотвращает случайное загрязнение объекта `global` серверного процесса. Отличие от поведения по умолчанию заключается в том, что он не создаёт **новых** контекстов для каждого вызова рендера.
Обратите внимание, что рекомендуется установить опцию `runInNewContext` в значение `false` или `'once'`. См. [справочник API](./api.md#runinnewcontext) для подробностей.