Skip to content

Commit fea4e6e

Browse files
authored
Merge pull request #49 from DeOwl/patch-1
Added Vite PWA and https
2 parents 09c3510 + f4e41f3 commit fea4e6e

File tree

1 file changed

+127
-2
lines changed

1 file changed

+127
-2
lines changed

Diff for: tutorials/pwa/PWA.md

+127-2
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,132 @@ self.addEventListener('fetch',() => console.log("fetch"));
191191

192192
Нажимаем `Добавить на главный экран`. Готово - иконка должна появиться на рабочем столе.
193193

194-
## 3. Добавление адаптивности
194+
### Vite PWA
195+
196+
При работе с Vite так же существует более простой способ настройки PWA - библиотека vite-plugin-pwa.
197+
Во-первых, необходимо установить библиотеку с помощью команды:
198+
199+
```shell
200+
npm install -D vite-plugin-pwa
201+
```
202+
После этого необходимо настроить библиотеку в `vite.config.ts`
203+
```ts
204+
import { VitePWA } from 'vite-plugin-pwa'
205+
206+
export default defineConfig({
207+
plugins: [
208+
VitePWA({ registerType: 'autoUpdate' })
209+
]
210+
})
211+
```
212+
На данном этапе если вы развернете приложение на Github Pages или запустите его в режиме preview, то вы увидите работающий manifest.json, но его не будет при запуске в режиме dev.
213+
Это происходит потому, что по умолчанию VitePWA не работает в режиме разработчика. Для того чтобы это исправить, можно добавить данное поле VitePWA в `vite.config.ts`
214+
```ts
215+
VitePWA({
216+
registerType: 'autoUpdate',
217+
devOptions: {
218+
enabled: true,
219+
},
220+
})
221+
```
222+
223+
Теперь, у нас есть и manifest, но при этом manifest, отображаемы на сервера — это созданный по умолчанию manifest, а не тот, который мы создали выше. Для указания собственного manifest его надо прописать как отдельное поле VitePWA в `vite.config.ts`
224+
```ts
225+
VitePWA({
226+
registerType: 'autoUpdate',
227+
devOptions: {
228+
enabled: true,
229+
},
230+
manifest:{
231+
name: "Tile Notes",
232+
short_name: "Tile Notes",
233+
start_url: "/",
234+
display: "standalone",
235+
background_color: "#fdfdfd",
236+
theme_color: "#db4938",
237+
orientation: "portrait-primary",
238+
icons: [
239+
{
240+
"src": "/logo192.png",
241+
"type": "image/png", "sizes": "192x192"
242+
},
243+
{
244+
"src": "/logo512.png",
245+
"type": "image/png", "sizes": "512x512"
246+
}
247+
],
248+
}
249+
})
250+
```
251+
Теперь перейдем к Service Worker. в vite-plugin-pwa уже есть работающий Service Worker который также производит кеширование, в отличие от прописанного нами. Данный Service Worker при запуске Github Pages вы можете увидеть, но он не будет active. Для того чтобы он заработал, нам нужно его зарегистрировать.
252+
Для этого перейдем в `main.tsx` и зарегистрируем Service Worker.
253+
254+
Подключим registerSW:
255+
```ts
256+
import {registerSW} from "virtual:pwa-register";
257+
```
258+
И после кода, где мы подключили наше приложение, пропишем:
259+
```ts
260+
if ("serviceWorker" in navigator) {
261+
registerSW()
262+
}
263+
```
264+
На данном этапе настройка Service Worker закончена, и при запуске build на Github Pages можно будет увидеть и Mainfest.json и Service Worker. Убедительно проверьте, что в Manifest нет ошибок, которые могли бы повлиять на установку PWA. Эти ошибки отмечены во вкладке Manifest в отдельной группе. Если ошибок нет, то после скачивание PWA вы должны иметь возможность перейти в авиарежим и при этом приложение все еще будет работать, даже если его закрыть и открыть снова.
265+
266+
Важно! Если при импортировании registerSW появляется ошибка об отсутствии модуля, необходимо перейти в `tsconfig.app.json ` и в `CompilerOptions` добавить:
267+
```json
268+
{
269+
"compilerOptions": {
270+
"types": [
271+
"vite-plugin-pwa/info.d.ts",
272+
"vite-plugin-pwa/client.d.ts"
273+
],
274+
```
275+
276+
Однако, как вы могли заметить, при запуске где-либо кроме Github Pages, Service Worker либо вообще не запускается, либо выдает ошибку `The script has an unsupported MIME type ('text/html').`
277+
В дополнение к этому, на вашем телефоне (если у вас Android) не будет возможности скачать PWA по ip адрессу.
278+
279+
Обе эти ошибки связаны с тем, что для работы PWA сайт должен работать по протоколу https, а не http. Как настроить сайт для работы с https рассмотрим ниже.
280+
## 3. Настройка https на React
281+
282+
Для того, чтобы сайт работал по протоколу https он должен иметь сертификат. Данные сертификаты подтверждаются несколько одобренных компаний за небольшую сумму, но для нас будет достаточно автоматически сгенерированного локально подтвержденного сертификата.
283+
284+
Для работы с сертификатами, во-первых, установим модуль mkcert
285+
```shell
286+
npm install mkcert
287+
```
288+
После этого нам нужно создать Authority которая будет подтверждать наш сертификат. Сертификаты, подтвержденные данным образом, реально работают только при работе на localhost.
289+
290+
После создания Authority необходимо создать сам сертификат. Для этого использует команды:
291+
```shell
292+
mkcert create-ca
293+
mkcert create-cert
294+
```
295+
296+
После выполнения данных команд у вас появится 4 новых файла: ca.crt, ca.key, cert.crt, cert.key.
297+
298+
299+
`ca.crt` и `cert.crt` - это публичные ключи Authority и сертификата соответственно, а ca.key и cert.key - приватные ключи.
300+
301+
##### Никогда не выкладывайте частные ключи в общий доступ, даже на GitHub!
302+
303+
После создания данных ключей остался один шаг - настроить `vite.config.ts`, перед началом установив `vite-plugin-mkcert` и `@types/node`:
304+
```ts
305+
import mkcert from 'vite-plugin-mkcert'
306+
import fs from 'fs';
307+
import path from 'path';
308+
309+
server:{
310+
https:{
311+
key: fs.readFileSync(path.resolve(__dirname, 'cert.key')),
312+
cert: fs.readFileSync(path.resolve(__dirname, 'cert.crt')),
313+
},
314+
}
315+
```
316+
После добавления данного кода, вы можете открыть ваш сервер по вашему основному ip(не localhost и не vpn) и увидеть, что Service Worker подключён.
317+
318+
319+
## 4. Добавление адаптивности
195320
Зачем это нужно? Адаптивность помогает вашему веб-приложению нормально выглядить на устройствах с разными размерами экрана, а также влияет на продвижение сайта в поисковых системах. Сделать это можно c помощью использования относительно новых моделей макета (flexbox, grid), а так же через media queries в css. [Здесь](https://ru.hexlet.io/courses/css-adaptive/lessons/media-queries/theory_unit) можно почитать про последние.
196321

197322
### Практические примеры:
@@ -576,4 +701,4 @@ export const Navbar = () => {
576701

577702
![](./assets/13.png)
578703

579-
[vite-gh-pages]: https://rashidshamloo.hashnode.dev/deploying-vite-react-app-to-github-pages
704+
[vite-gh-pages]: https://rashidshamloo.hashnode.dev/deploying-vite-react-app-to-github-pages

0 commit comments

Comments
 (0)