@dxtmisha/wiki 0.39.8 → 0.57.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{defineProperty-Bjg6wMoX.js → defineProperty-149Ahniv.js} +4 -4
- package/dist/library.js +1 -1
- package/dist/media/descriptions/wikiDescriptionsArea.d.ts +7 -0
- package/dist/media/descriptions/wikiDescriptionsClientOnly.d.ts +7 -0
- package/dist/media/descriptions/wikiDescriptionsContainer.d.ts +7 -0
- package/dist/media/descriptions/wikiDescriptionsHeader.d.ts +7 -0
- package/dist/media/descriptions/wikiDescriptionsPageArea.d.ts +7 -0
- package/dist/media/mdx/Area/wikiMdxArea.d.ts +7 -0
- package/dist/media/mdx/ClientOnly/wikiMdxClientOnly.d.ts +7 -0
- package/dist/media/mdx/Container/wikiMdxContainer.d.ts +7 -0
- package/dist/media/mdx/Header/wikiMdxHeader.d.ts +7 -0
- package/dist/media/mdx/PageArea/wikiMdxPageArea.d.ts +7 -0
- package/dist/media.d.ts +1 -1
- package/dist/media.js +115 -68
- package/dist/storybook.js +2707 -1841
- package/dist/{wikiDescriptions-Cv4WzSNL.js → wikiDescriptions-7XaHU3Yk.js} +182 -0
- package/package.json +1 -1
- package/src/media/functional/functional/composables/useApiAsyncRef/useApiAsyncRef.en.mdx +43 -0
- package/src/media/functional/functional/composables/useApiAsyncRef/useApiAsyncRef.ru.mdx +43 -0
- package/src/media/functional/functional/composables/useApiAsyncRef/useApiAsyncRef.vi.mdx +41 -0
- package/src/media/functional/functional/composables/useApiRef/useApiRef.en.mdx +20 -4
- package/src/media/functional/functional/composables/useApiRef/useApiRef.ru.mdx +21 -3
- package/src/media/functional/functional/composables/useApiRef/useApiRef.vi.mdx +20 -2
- package/src/media/functional/functional/functions/computedAsync/computedAsync.en.mdx +8 -0
- package/src/media/functional/functional/functions/computedAsync/computedAsync.ru.mdx +8 -0
- package/src/media/functional/functional/functions/computedAsync/computedAsync.vi.mdx +8 -0
- package/src/media/functional/functional/functions/computedEternity/computedEternity.en.mdx +8 -0
- package/src/media/functional/functional/functions/computedEternity/computedEternity.ru.mdx +8 -0
- package/src/media/functional/functional/functions/computedEternity/computedEternity.vi.mdx +8 -0
- package/src/media/functional/functional-basic/classes/Api/Api.en.mdx +3 -0
- package/src/media/functional/functional-basic/classes/Api/Api.ru.mdx +3 -0
- package/src/media/functional/functional-basic/classes/Api/Api.vi.mdx +3 -0
- package/src/media/functional/functional-basic/classes/ApiInstance/ApiInstance.en.mdx +5 -2
- package/src/media/functional/functional-basic/classes/ApiInstance/ApiInstance.ru.mdx +6 -3
- package/src/media/functional/functional-basic/classes/ApiInstance/ApiInstance.vi.mdx +5 -2
- package/src/media/functional/functional-basic/classes/ApiResponse/ApiResponse.en.mdx +9 -0
- package/src/media/functional/functional-basic/classes/ApiResponse/ApiResponse.ru.mdx +9 -0
- package/src/media/functional/functional-basic/classes/ApiResponse/ApiResponse.vi.mdx +9 -0
- package/src/media/functional/functional-basic/classes/CookieStorage/CookieStorage.en.mdx +31 -6
- package/src/media/functional/functional-basic/classes/CookieStorage/CookieStorage.ru.mdx +31 -6
- package/src/media/functional/functional-basic/classes/CookieStorage/CookieStorage.vi.mdx +31 -6
- package/src/media/functional/functional-basic/classes/Meta/Meta.en.mdx +16 -0
- package/src/media/functional/functional-basic/classes/Meta/Meta.ru.mdx +16 -0
- package/src/media/functional/functional-basic/classes/Meta/Meta.vi.mdx +17 -1
- package/src/media/functional/functional-basic/classes/MetaManager/MetaManager.en.mdx +9 -0
- package/src/media/functional/functional-basic/classes/MetaManager/MetaManager.ru.mdx +9 -0
- package/src/media/functional/functional-basic/classes/MetaManager/MetaManager.vi.mdx +9 -0
- package/src/media/functional/functional-basic/classes/MetaStatic/MetaStatic.en.mdx +2 -1
- package/src/media/functional/functional-basic/classes/MetaStatic/MetaStatic.ru.mdx +2 -1
- package/src/media/functional/functional-basic/classes/MetaStatic/MetaStatic.vi.mdx +3 -2
- package/src/media/functional/functional-basic/classes/ServerStorage/ServerStorage.en.mdx +2 -2
- package/src/media/functional/functional-basic/classes/ServerStorage/ServerStorage.ru.mdx +2 -2
- package/src/media/functional/functional-basic/classes/ServerStorage/ServerStorage.vi.mdx +2 -2
- package/src/media/functional/functional-basic/icons/icons.en.mdx +3 -0
- package/src/media/functional/functional-basic/icons/icons.ru.mdx +3 -0
- package/src/media/functional/functional-basic/icons/icons.vi.mdx +3 -0
- package/src/media/functional/nitro-basic/about/about.en.mdx +52 -0
- package/src/media/functional/nitro-basic/about/about.ru.mdx +52 -0
- package/src/media/functional/nitro-basic/about/about.vi.mdx +52 -0
- package/src/media/functional/nitro-basic/composables/useHeaders/useHeaders.en.mdx +29 -0
- package/src/media/functional/nitro-basic/composables/useHeaders/useHeaders.ru.mdx +29 -0
- package/src/media/functional/nitro-basic/composables/useHeaders/useHeaders.vi.mdx +29 -0
- package/src/media/functional/nitro-basic/functions/getRequestOrigin/getRequestOrigin.en.mdx +24 -0
- package/src/media/functional/nitro-basic/functions/getRequestOrigin/getRequestOrigin.ru.mdx +24 -0
- package/src/media/functional/nitro-basic/functions/getRequestOrigin/getRequestOrigin.vi.mdx +24 -0
- package/src/media/functional/nitro-basic/functions/getRequestUrl/getRequestUrl.en.mdx +24 -0
- package/src/media/functional/nitro-basic/functions/getRequestUrl/getRequestUrl.ru.mdx +24 -0
- package/src/media/functional/nitro-basic/functions/getRequestUrl/getRequestUrl.vi.mdx +24 -0
- package/src/media/functional/nitro-basic/functions/initApi/initApi.en.mdx +23 -0
- package/src/media/functional/nitro-basic/functions/initApi/initApi.ru.mdx +23 -0
- package/src/media/functional/nitro-basic/functions/initApi/initApi.vi.mdx +23 -0
- package/src/media/functional/nitro-basic/functions/initClientRouter/initClientRouter.en.mdx +21 -0
- package/src/media/functional/nitro-basic/functions/initClientRouter/initClientRouter.ru.mdx +21 -0
- package/src/media/functional/nitro-basic/functions/initClientRouter/initClientRouter.vi.mdx +21 -0
- package/src/media/functional/nitro-basic/functions/initCookieStorage/initCookieStorage.en.mdx +18 -0
- package/src/media/functional/nitro-basic/functions/initCookieStorage/initCookieStorage.ru.mdx +18 -0
- package/src/media/functional/nitro-basic/functions/initCookieStorage/initCookieStorage.vi.mdx +18 -0
- package/src/media/functional/nitro-basic/functions/initHeaders/initHeaders.en.mdx +16 -0
- package/src/media/functional/nitro-basic/functions/initHeaders/initHeaders.ru.mdx +16 -0
- package/src/media/functional/nitro-basic/functions/initHeaders/initHeaders.vi.mdx +16 -0
- package/src/media/functional/nitro-basic/functions/initPluginApiCache/initPluginApiCache.en.mdx +17 -0
- package/src/media/functional/nitro-basic/functions/initPluginApiCache/initPluginApiCache.ru.mdx +17 -0
- package/src/media/functional/nitro-basic/functions/initPluginApiCache/initPluginApiCache.vi.mdx +17 -0
- package/src/media/functional/nitro-basic/functions/initPluginBasic/initPluginBasic.en.mdx +34 -0
- package/src/media/functional/nitro-basic/functions/initPluginBasic/initPluginBasic.ru.mdx +34 -0
- package/src/media/functional/nitro-basic/functions/initPluginBasic/initPluginBasic.vi.mdx +34 -0
- package/src/media/functional/nitro-basic/functions/initScriptsJson/initScriptsJson.en.mdx +17 -0
- package/src/media/functional/nitro-basic/functions/initScriptsJson/initScriptsJson.ru.mdx +17 -0
- package/src/media/functional/nitro-basic/functions/initScriptsJson/initScriptsJson.vi.mdx +17 -0
- package/src/media/functional/nitro-basic/functions/initServerRouter/initServerRouter.en.mdx +20 -0
- package/src/media/functional/nitro-basic/functions/initServerRouter/initServerRouter.ru.mdx +20 -0
- package/src/media/functional/nitro-basic/functions/initServerRouter/initServerRouter.vi.mdx +20 -0
- package/src/media/functional/nitro-basic/functions/initServerStorage/initServerStorage.en.mdx +16 -0
- package/src/media/functional/nitro-basic/functions/initServerStorage/initServerStorage.ru.mdx +16 -0
- package/src/media/functional/nitro-basic/functions/initServerStorage/initServerStorage.vi.mdx +16 -0
- package/src/media/functional/nitro-basic/functions/initSsrApp/initSsrApp.en.mdx +20 -0
- package/src/media/functional/nitro-basic/functions/initSsrApp/initSsrApp.ru.mdx +20 -0
- package/src/media/functional/nitro-basic/functions/initSsrApp/initSsrApp.vi.mdx +20 -0
- package/src/media/functional/nitro-basic/functions/uiBootstrapClient/uiBootstrapClient.en.mdx +14 -0
- package/src/media/functional/nitro-basic/functions/uiBootstrapClient/uiBootstrapClient.ru.mdx +14 -0
- package/src/media/functional/nitro-basic/functions/uiBootstrapClient/uiBootstrapClient.vi.mdx +14 -0
- package/src/media/functional/nitro-basic/functions/uiBootstrapServer/uiBootstrapServer.en.mdx +19 -0
- package/src/media/functional/nitro-basic/functions/uiBootstrapServer/uiBootstrapServer.ru.mdx +19 -0
- package/src/media/functional/nitro-basic/functions/uiBootstrapServer/uiBootstrapServer.vi.mdx +19 -0
- package/src/media/functional/nitro-basic/functions/uiCookieStorage/uiCookieStorage.en.mdx +13 -0
- package/src/media/functional/nitro-basic/functions/uiCookieStorage/uiCookieStorage.ru.mdx +13 -0
- package/src/media/functional/nitro-basic/functions/uiCookieStorage/uiCookieStorage.vi.mdx +13 -0
- package/src/media/functional/nitro-basic/functions/uiCreateApp/uiCreateApp.en.mdx +43 -0
- package/src/media/functional/nitro-basic/functions/uiCreateApp/uiCreateApp.ru.mdx +43 -0
- package/src/media/functional/nitro-basic/functions/uiCreateApp/uiCreateApp.vi.mdx +43 -0
- package/src/media/functional/nitro-basic/functions/uiCreateClientApp/uiCreateClientApp.en.mdx +31 -0
- package/src/media/functional/nitro-basic/functions/uiCreateClientApp/uiCreateClientApp.ru.mdx +31 -0
- package/src/media/functional/nitro-basic/functions/uiCreateClientApp/uiCreateClientApp.vi.mdx +31 -0
- package/src/media/functional/nitro-basic/functions/uiCreateServerApp/uiCreateServerApp.en.mdx +34 -0
- package/src/media/functional/nitro-basic/functions/uiCreateServerApp/uiCreateServerApp.ru.mdx +34 -0
- package/src/media/functional/nitro-basic/functions/uiCreateServerApp/uiCreateServerApp.vi.mdx +34 -0
- package/src/media/functional/nitro-basic/functions/uiCreateSsrRouter/uiCreateSsrRouter.en.mdx +17 -0
- package/src/media/functional/nitro-basic/functions/uiCreateSsrRouter/uiCreateSsrRouter.ru.mdx +17 -0
- package/src/media/functional/nitro-basic/functions/uiCreateSsrRouter/uiCreateSsrRouter.vi.mdx +17 -0
- package/src/media/functional/nitro-basic/functions/uiId/uiId.en.mdx +13 -0
- package/src/media/functional/nitro-basic/functions/uiId/uiId.ru.mdx +13 -0
- package/src/media/functional/nitro-basic/functions/uiId/uiId.vi.mdx +13 -0
- package/src/media/functional/nitro-basic/functions/uiServerStorage/uiServerStorage.en.mdx +13 -0
- package/src/media/functional/nitro-basic/functions/uiServerStorage/uiServerStorage.ru.mdx +13 -0
- package/src/media/functional/nitro-basic/functions/uiServerStorage/uiServerStorage.vi.mdx +13 -0
- package/src/media/functional/nitro-basic/setup/setup.en.mdx +133 -0
- package/src/media/functional/nitro-basic/setup/setup.ru.mdx +133 -0
- package/src/media/functional/nitro-basic/setup/setup.vi.mdx +133 -0
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import {Meta} from '@storybook/addon-docs/blocks'
|
|
2
|
+
|
|
3
|
+
<Meta title='@dxtmisha/en/nitro-basic/# Project Setup'/>
|
|
4
|
+
|
|
5
|
+
# Project Setup
|
|
6
|
+
|
|
7
|
+
The `@dxtmisha/nitro-basic` library is designed to work in conjunction with Nitro and Vue 3. It ensures a smooth transition between server-side and client-side rendering. Below is a step-by-step guide for integrating the library into your project.
|
|
8
|
+
|
|
9
|
+
## 1. Install Dependencies
|
|
10
|
+
|
|
11
|
+
Install the necessary packages. In addition to the library itself, you will need Vue 3 and Vue Router:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
npm install @dxtmisha/nitro-basic vue vue-router
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## 2. Nitro Plugin Initialization
|
|
18
|
+
|
|
19
|
+
For basic server environment setup (e.g., API caching), you need to register a Nitro plugin.
|
|
20
|
+
|
|
21
|
+
Create the `server/plugins/ui.ts` file:
|
|
22
|
+
|
|
23
|
+
```typescript
|
|
24
|
+
import { definePlugin } from 'nitro'
|
|
25
|
+
import { initPluginBasic } from '@dxtmisha/nitro-basic/plugin'
|
|
26
|
+
|
|
27
|
+
export default definePlugin((nitroApp) => {
|
|
28
|
+
initPluginBasic(nitroApp)
|
|
29
|
+
})
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## 3. Create Application Factory (main.ts)
|
|
33
|
+
|
|
34
|
+
Create a shared file for Vue application initialization that will be used on both server and client.
|
|
35
|
+
|
|
36
|
+
```typescript
|
|
37
|
+
// src/main.ts
|
|
38
|
+
import { uiCreateApp } from '@dxtmisha/nitro-basic'
|
|
39
|
+
import App from './App.vue'
|
|
40
|
+
import { routes } from './router'
|
|
41
|
+
|
|
42
|
+
export function createApp() {
|
|
43
|
+
return uiCreateApp(App, {
|
|
44
|
+
appRouter: {
|
|
45
|
+
routes
|
|
46
|
+
}
|
|
47
|
+
})
|
|
48
|
+
}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## 4. Configure Client Entry Point
|
|
52
|
+
|
|
53
|
+
On the client, you need to prepare the identifier generator and mount the application.
|
|
54
|
+
|
|
55
|
+
```typescript
|
|
56
|
+
// src/entry-client.ts
|
|
57
|
+
import { uiBootstrapClient, uiCreateClientApp } from '@dxtmisha/nitro-basic'
|
|
58
|
+
import { createApp } from './main'
|
|
59
|
+
|
|
60
|
+
const { app, router, options } = createApp()
|
|
61
|
+
|
|
62
|
+
// ID initialization for hydration
|
|
63
|
+
uiBootstrapClient()
|
|
64
|
+
|
|
65
|
+
// Mount the application
|
|
66
|
+
uiCreateClientApp(app, '#app', router, options)
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## 5. Configure Server Entry Point
|
|
70
|
+
|
|
71
|
+
The server entry point is responsible for initializing storages, headers, and HTML rendering.
|
|
72
|
+
|
|
73
|
+
```typescript
|
|
74
|
+
// src/entry-server.ts
|
|
75
|
+
import { uiBootstrapServer, uiCreateServerApp } from '@dxtmisha/nitro-basic'
|
|
76
|
+
import { createApp } from './main'
|
|
77
|
+
import template from './templates/main.html?raw' // HTML template
|
|
78
|
+
|
|
79
|
+
// Global server initialization
|
|
80
|
+
uiBootstrapServer()
|
|
81
|
+
|
|
82
|
+
export default {
|
|
83
|
+
async fetch(request: Request) {
|
|
84
|
+
const { app, router, options } = createApp()
|
|
85
|
+
|
|
86
|
+
const { headers, body } = await uiCreateServerApp(
|
|
87
|
+
app,
|
|
88
|
+
request,
|
|
89
|
+
router,
|
|
90
|
+
options,
|
|
91
|
+
undefined,
|
|
92
|
+
undefined,
|
|
93
|
+
template
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
return new Response(body, { headers })
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## 6. HTML Template
|
|
102
|
+
|
|
103
|
+
For SSR to work correctly, the library uses a placeholder system in the HTML template. The `uiCreateServerApp` function automatically replaces them with up-to-date data.
|
|
104
|
+
|
|
105
|
+
**Available markers:**
|
|
106
|
+
- `<!--ssr-lang-->` — user language code (e.g., `en`). Used in `<html lang="...">`.
|
|
107
|
+
- `<!--ssr-title-->` — page title from `MetaStatic`. Injected into `<title>`.
|
|
108
|
+
- `<!--ssr-meta-->` — block of meta tags (OG, Twitter, etc.) from `MetaStatic`.
|
|
109
|
+
- `<!--ssr-outlet-->` — rendered HTML of your application. Usually inside `<div id="app">`.
|
|
110
|
+
- `<!--ssr-teleports-->` — content from Vue Teleports.
|
|
111
|
+
- `<!--ssr-scriptsJson-->` — **Critically important marker**. Contains JSON with hydration data (`ServerStorage`, API cache). Must be placed before the closing `</body>`.
|
|
112
|
+
|
|
113
|
+
Example `main.html`:
|
|
114
|
+
```html
|
|
115
|
+
<!DOCTYPE html>
|
|
116
|
+
<html lang="<!--ssr-lang-->">
|
|
117
|
+
<head>
|
|
118
|
+
<meta charset="UTF-8">
|
|
119
|
+
<!--ssr-meta-->
|
|
120
|
+
<title><!--ssr-title--></title>
|
|
121
|
+
</head>
|
|
122
|
+
<body>
|
|
123
|
+
<div id="app"><!--ssr-outlet--></div>
|
|
124
|
+
|
|
125
|
+
<!--ssr-teleports-->
|
|
126
|
+
<!--ssr-scriptsJson-->
|
|
127
|
+
|
|
128
|
+
<script type="module" src="/src/entry-client.ts"></script>
|
|
129
|
+
</body>
|
|
130
|
+
</html>
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
> Without the `<!--ssr-scriptsJson-->` marker, data received on the server will not be transferred to the client, leading to hydration errors and redundant API requests.
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import {Meta} from '@storybook/addon-docs/blocks'
|
|
2
|
+
|
|
3
|
+
<Meta title='@dxtmisha/ru/nitro-basic/# Подготовка проекта'/>
|
|
4
|
+
|
|
5
|
+
# Подготовка проекта
|
|
6
|
+
|
|
7
|
+
Библиотека `@dxtmisha/nitro-basic` спроектирована для работы в связке с Nitro и Vue 3. Она обеспечивает плавный переход между серверным и клиентским рендерингом. Ниже приведено пошаговое руководство по интеграции библиотеки в ваш проект.
|
|
8
|
+
|
|
9
|
+
## 1. Установка зависимостей
|
|
10
|
+
|
|
11
|
+
Установите необходимые пакеты. Помимо самой библиотеки, вам потребуются Vue 3 и Vue Router:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
npm install @dxtmisha/nitro-basic vue vue-router
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## 2. Инициализация плагина Nitro
|
|
18
|
+
|
|
19
|
+
Для базовой настройки серверной среды (например, кэширования API) необходимо зарегистрировать плагин Nitro.
|
|
20
|
+
|
|
21
|
+
Создайте файл `server/plugins/ui.ts`:
|
|
22
|
+
|
|
23
|
+
```typescript
|
|
24
|
+
import { definePlugin } from 'nitro'
|
|
25
|
+
import { initPluginBasic } from '@dxtmisha/nitro-basic/plugin'
|
|
26
|
+
|
|
27
|
+
export default definePlugin((nitroApp) => {
|
|
28
|
+
initPluginBasic(nitroApp)
|
|
29
|
+
})
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## 3. Создание фабрики приложения (main.ts)
|
|
33
|
+
|
|
34
|
+
Создайте общий файл для инициализации Vue-приложения, который будет использоваться и на сервере, и на клиенте.
|
|
35
|
+
|
|
36
|
+
```typescript
|
|
37
|
+
// src/main.ts
|
|
38
|
+
import { uiCreateApp } from '@dxtmisha/nitro-basic'
|
|
39
|
+
import App from './App.vue'
|
|
40
|
+
import { routes } from './router'
|
|
41
|
+
|
|
42
|
+
export function createApp() {
|
|
43
|
+
return uiCreateApp(App, {
|
|
44
|
+
appRouter: {
|
|
45
|
+
routes
|
|
46
|
+
}
|
|
47
|
+
})
|
|
48
|
+
}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## 4. Настройка клиентской точки входа
|
|
52
|
+
|
|
53
|
+
На клиенте необходимо подготовить генератор идентификаторов и примонтировать приложение.
|
|
54
|
+
|
|
55
|
+
```typescript
|
|
56
|
+
// src/entry-client.ts
|
|
57
|
+
import { uiBootstrapClient, uiCreateClientApp } from '@dxtmisha/nitro-basic'
|
|
58
|
+
import { createApp } from './main'
|
|
59
|
+
|
|
60
|
+
const { app, router, options } = createApp()
|
|
61
|
+
|
|
62
|
+
// Инициализация ID для гидратации
|
|
63
|
+
uiBootstrapClient()
|
|
64
|
+
|
|
65
|
+
// Монтирование приложения
|
|
66
|
+
uiCreateClientApp(app, '#app', router, options)
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## 5. Настройка серверной точки входа
|
|
70
|
+
|
|
71
|
+
Серверная точка входа отвечает за инициализацию хранилищ, заголовков и рендеринг HTML.
|
|
72
|
+
|
|
73
|
+
```typescript
|
|
74
|
+
// src/entry-server.ts
|
|
75
|
+
import { uiBootstrapServer, uiCreateServerApp } from '@dxtmisha/nitro-basic'
|
|
76
|
+
import { createApp } from './main'
|
|
77
|
+
import template from './templates/main.html?raw' // HTML шаблон
|
|
78
|
+
|
|
79
|
+
// Глобальная инициализация сервера
|
|
80
|
+
uiBootstrapServer()
|
|
81
|
+
|
|
82
|
+
export default {
|
|
83
|
+
async fetch(request: Request) {
|
|
84
|
+
const { app, router, options } = createApp()
|
|
85
|
+
|
|
86
|
+
const { headers, body } = await uiCreateServerApp(
|
|
87
|
+
app,
|
|
88
|
+
request,
|
|
89
|
+
router,
|
|
90
|
+
options,
|
|
91
|
+
undefined,
|
|
92
|
+
undefined,
|
|
93
|
+
template
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
return new Response(body, { headers })
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## 6. HTML Шаблон
|
|
102
|
+
|
|
103
|
+
Для корректной работы SSR библиотека использует систему плейсхолдеров в HTML-шаблоне. Функция `uiCreateServerApp` автоматически заменяет их актуальными данными.
|
|
104
|
+
|
|
105
|
+
**Доступные метки:**
|
|
106
|
+
- `<!--ssr-lang-->` — языковой код пользователя (например, `ru`). Используется в `<html lang="...">`.
|
|
107
|
+
- `<!--ssr-title-->` — заголовок страницы из `MetaStatic`. Подставляется в `<title>`.
|
|
108
|
+
- `<!--ssr-meta-->` — блок мета-тегов (OG, Twitter и др.) из `MetaStatic`.
|
|
109
|
+
- `<!--ssr-outlet-->` — отрендеренный HTML вашего приложения. Обычно внутри `<div id="app">`.
|
|
110
|
+
- `<!--ssr-teleports-->` — содержимое Vue Teleports.
|
|
111
|
+
- `<!--ssr-scriptsJson-->` — **Критически важная метка**. Содержит JSON с данными для гидратации (`ServerStorage`, кэш API). Должна быть размещена перед закрывающим `</body>`.
|
|
112
|
+
|
|
113
|
+
Пример `main.html`:
|
|
114
|
+
```html
|
|
115
|
+
<!DOCTYPE html>
|
|
116
|
+
<html lang="<!--ssr-lang-->">
|
|
117
|
+
<head>
|
|
118
|
+
<meta charset="UTF-8">
|
|
119
|
+
<!--ssr-meta-->
|
|
120
|
+
<title><!--ssr-title--></title>
|
|
121
|
+
</head>
|
|
122
|
+
<body>
|
|
123
|
+
<div id="app"><!--ssr-outlet--></div>
|
|
124
|
+
|
|
125
|
+
<!--ssr-teleports-->
|
|
126
|
+
<!--ssr-scriptsJson-->
|
|
127
|
+
|
|
128
|
+
<script type="module" src="/src/entry-client.ts"></script>
|
|
129
|
+
</body>
|
|
130
|
+
</html>
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
> Без метки `<!--ssr-scriptsJson-->` данные, полученные на сервере, не будут переданы на клиент, что приведет к ошибкам гидратации и повторным запросам к API.
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import {Meta} from '@storybook/addon-docs/blocks'
|
|
2
|
+
|
|
3
|
+
<Meta title='@dxtmisha/vi/nitro-basic/# Chuẩn bị dự án'/>
|
|
4
|
+
|
|
5
|
+
# Chuẩn bị dự án
|
|
6
|
+
|
|
7
|
+
Thư viện `@dxtmisha/nitro-basic` được thiết kế để hoạt động kết hợp với Nitro và Vue 3. Nó đảm bảo sự chuyển đổi mượt mà giữa quá trình render phía server và phía client. Dưới đây là hướng dẫn từng bước để tích hợp thư viện vào dự án của bạn.
|
|
8
|
+
|
|
9
|
+
## 1. Cài đặt các phần phụ thuộc
|
|
10
|
+
|
|
11
|
+
Cài đặt các gói cần thiết. Ngoài bản thân thư viện, bạn sẽ cần Vue 3 và Vue Router:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
npm install @dxtmisha/nitro-basic vue vue-router
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## 2. Khởi tạo Plugin Nitro
|
|
18
|
+
|
|
19
|
+
Để thiết lập môi trường server cơ bản (ví dụ: lưu đệm API), bạn cần đăng ký một plugin Nitro.
|
|
20
|
+
|
|
21
|
+
Tạo tệp `server/plugins/ui.ts`:
|
|
22
|
+
|
|
23
|
+
```typescript
|
|
24
|
+
import { definePlugin } from 'nitro'
|
|
25
|
+
import { initPluginBasic } from '@dxtmisha/nitro-basic/plugin'
|
|
26
|
+
|
|
27
|
+
export default definePlugin((nitroApp) => {
|
|
28
|
+
initPluginBasic(nitroApp)
|
|
29
|
+
})
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## 3. Tạo Factory ứng dụng (main.ts)
|
|
33
|
+
|
|
34
|
+
Tạo một tệp dùng chung để khởi tạo ứng dụng Vue sẽ được sử dụng trên cả server và client.
|
|
35
|
+
|
|
36
|
+
```typescript
|
|
37
|
+
// src/main.ts
|
|
38
|
+
import { uiCreateApp } from '@dxtmisha/nitro-basic'
|
|
39
|
+
import App from './App.vue'
|
|
40
|
+
import { routes } from './router'
|
|
41
|
+
|
|
42
|
+
export function createApp() {
|
|
43
|
+
return uiCreateApp(App, {
|
|
44
|
+
appRouter: {
|
|
45
|
+
routes
|
|
46
|
+
}
|
|
47
|
+
})
|
|
48
|
+
}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## 4. Cấu hình điểm đầu vào Client
|
|
52
|
+
|
|
53
|
+
Trên client, bạn cần chuẩn bị trình tạo định danh và mount ứng dụng.
|
|
54
|
+
|
|
55
|
+
```typescript
|
|
56
|
+
// src/entry-client.ts
|
|
57
|
+
import { uiBootstrapClient, uiCreateClientApp } from '@dxtmisha/nitro-basic'
|
|
58
|
+
import { createApp } from './main'
|
|
59
|
+
|
|
60
|
+
const { app, router, options } = createApp()
|
|
61
|
+
|
|
62
|
+
// Khởi tạo ID để hydrat hóa
|
|
63
|
+
uiBootstrapClient()
|
|
64
|
+
|
|
65
|
+
// Mount ứng dụng
|
|
66
|
+
uiCreateClientApp(app, '#app', router, options)
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## 5. Cấu hình điểm đầu vào Server
|
|
70
|
+
|
|
71
|
+
Điểm đầu vào server chịu trách nhiệm khởi tạo bộ lưu trữ, header và render HTML.
|
|
72
|
+
|
|
73
|
+
```typescript
|
|
74
|
+
// src/entry-server.ts
|
|
75
|
+
import { uiBootstrapServer, uiCreateServerApp } from '@dxtmisha/nitro-basic'
|
|
76
|
+
import { createApp } from './main'
|
|
77
|
+
import template from './templates/main.html?raw' // HTML template
|
|
78
|
+
|
|
79
|
+
// Khởi tạo server toàn cục
|
|
80
|
+
uiBootstrapServer()
|
|
81
|
+
|
|
82
|
+
export default {
|
|
83
|
+
async fetch(request: Request) {
|
|
84
|
+
const { app, router, options } = createApp()
|
|
85
|
+
|
|
86
|
+
const { headers, body } = await uiCreateServerApp(
|
|
87
|
+
app,
|
|
88
|
+
request,
|
|
89
|
+
router,
|
|
90
|
+
options,
|
|
91
|
+
undefined,
|
|
92
|
+
undefined,
|
|
93
|
+
template
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
return new Response(body, { headers })
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## 6. Template HTML
|
|
102
|
+
|
|
103
|
+
Để SSR hoạt động chính xác, thư viện sử dụng một hệ thống nhãn (placeholder) trong template HTML. Hàm `uiCreateServerApp` sẽ tự động thay thế chúng bằng dữ liệu thực tế.
|
|
104
|
+
|
|
105
|
+
**Các nhãn khả dụng:**
|
|
106
|
+
- `<!--ssr-lang-->` — mã ngôn ngữ của người dùng (ví dụ: `vi`). Được sử dụng trong `<html lang="...">`.
|
|
107
|
+
- `<!--ssr-title-->` — tiêu đề trang từ `MetaStatic`. Được chèn vào `<title>`.
|
|
108
|
+
- `<!--ssr-meta-->` — khối các thẻ meta (OG, Twitter, v.v.) từ `MetaStatic`.
|
|
109
|
+
- `<!--ssr-outlet-->` — chuỗi HTML đã được render của ứng dụng. Thường nằm bên trong `<div id="app">`.
|
|
110
|
+
- `<!--ssr-teleports-->` — nội dung từ Vue Teleports.
|
|
111
|
+
- `<!--ssr-scriptsJson-->` — **Nhãn cực kỳ quan trọng**. Chứa JSON với dữ liệu hydrat hóa (`ServerStorage`, bộ nhớ đệm API). Phải được đặt trước thẻ đóng `</body>`.
|
|
112
|
+
|
|
113
|
+
Ví dụ `main.html`:
|
|
114
|
+
```html
|
|
115
|
+
<!DOCTYPE html>
|
|
116
|
+
<html lang="<!--ssr-lang-->">
|
|
117
|
+
<head>
|
|
118
|
+
<meta charset="UTF-8">
|
|
119
|
+
<!--ssr-meta-->
|
|
120
|
+
<title><!--ssr-title--></title>
|
|
121
|
+
</head>
|
|
122
|
+
<body>
|
|
123
|
+
<div id="app"><!--ssr-outlet--></div>
|
|
124
|
+
|
|
125
|
+
<!--ssr-teleports-->
|
|
126
|
+
<!--ssr-scriptsJson-->
|
|
127
|
+
|
|
128
|
+
<script type="module" src="/src/entry-client.ts"></script>
|
|
129
|
+
</body>
|
|
130
|
+
</html>
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
> Nếu không có nhãn `<!--ssr-scriptsJson-->`, dữ liệu nhận được trên server sẽ không được chuyển sang client, dẫn đến lỗi hydrat hóa và các yêu cầu API bị lặp lại.
|