🚀 Веб-разработка с нуля: Урок 16 - Подключаем Firebase для синхронизации задач
Привет, разработчики! 👨💻👩💻
Сегодня выведем наш To-Do List на новый уровень — добавим облачную синхронизацию между устройствами через Firebase!
🔥 Что нового изучим:
1. Настройку Firebase Realtime Database
2. Работу с аутентификацией
3. Синхронизацию данных в реальном времени
☁️ Почему Firebase?
✓ Бесплатный стартовый тариф
✓ Реальное время обновлений
✓ Простая интеграция
💻 Практика: подключаем облако
1. Регистрируем проект на [firebase.google.com](https://firebase.google.com)
2. Добавляем Firebase в проект:
3. Инициализируем Firebase:
4. Модернизируем логику работы с задачами:
🔌 Что мы изменили в логике:
1. Заменяем localStorage на Firebase Realtime Database
2. Добавляем анонимную авторизацию
3. Реализуем мгновенную синхронизацию
💡 Профессиональные советы:
1. Для продакшена настройте правила безопасности:
2. Добавьте обработку ошибок:
👉 В следующем уроке:
Добавим уведомления через Firebase Cloud Messaging!
Подписывайтесь: [t.me/rm_programmer](https://t.me/rm_programmer)
Как вам работа с Firebase? Делитесь впечатлениями! 💬
#вебразработка #Firebase #RealtimeDatabase #javascript #программирование
Привет, разработчики! 👨💻👩💻
Сегодня выведем наш To-Do List на новый уровень — добавим облачную синхронизацию между устройствами через Firebase!
🔥 Что нового изучим:
1. Настройку Firebase Realtime Database
2. Работу с аутентификацией
3. Синхронизацию данных в реальном времени
☁️ Почему Firebase?
✓ Бесплатный стартовый тариф
✓ Реальное время обновлений
✓ Простая интеграция
💻 Практика: подключаем облако
1. Регистрируем проект на [firebase.google.com](https://firebase.google.com)
2. Добавляем Firebase в проект:
<!-- В head -->
<script src="https://www.gstatic.com/firebasejs/9.6.0/firebase-app-compat.js"></script>
<script src="https://www.gstatic.com/firebasejs/9.6.0/firebase-database-compat.js"></script>
<script src="https://www.gstatic.com/firebasejs/9.6.0/firebase-auth-compat.js"></script>
3. Инициализируем Firebase:
const firebaseConfig = {
apiKey: "ВАШ_API_KEY",
authDomain: "ВАШ_PROJECT.firebaseapp.com",
databaseURL: "https://ВАШ_PROJECT.firebaseio.com",
projectId: "ВАШ_PROJECT",
storageBucket: "ВАШ_PROJECT.appspot.com",
messagingSenderId: "ВАШ_SENDER_ID",
appId: "ВАШ_APP_ID"
};
firebase.initializeApp(firebaseConfig);
const database = firebase.database();4. Модернизируем логику работы с задачами:
// Авторизация анонимного пользователя
firebase.auth().signInAnonymously()
.then(() => {
console.log('Анонимная авторизация успешна');
initDatabase();
});
function initDatabase() {
const userId = firebase.auth().currentUser.uid;
const tasksRef = database.ref(`users/${userId}/tasks`);
// Синхронизация с сервером
tasksRef.on('value', (snapshot) => {
const data = snapshot.val() || {};
renderTasks(data);
});
}
function saveTaskToCloud(task) {
const userId = firebase.auth().currentUser.uid;
database.ref(`users/${userId}/tasks/${task.id}`).set(task);
}
function deleteTaskFromCloud(taskId) {
const userId = firebase.auth().currentUser.uid;
database.ref(`users/${userId}/tasks/${taskId}`).remove();
}
🔌 Что мы изменили в логике:
1. Заменяем localStorage на Firebase Realtime Database
2. Добавляем анонимную авторизацию
3. Реализуем мгновенную синхронизацию
💡 Профессиональные советы:
1. Для продакшена настройте правила безопасности:
// В Firebase Console -> Rules
{
"rules": {
"users": {
"$uid": {
".read": "auth != null && auth.uid == $uid",
".write": "auth != null && auth.uid == $uid"
}
}
}
}
2. Добавьте обработку ошибок:
firebase.auth().onAuthStateChanged((user) => {
if (user) {
initDatabase();
} else {
console.error('Ошибка авторизации');
}
});👉 В следующем уроке:
Добавим уведомления через Firebase Cloud Messaging!
Подписывайтесь: [t.me/rm_programmer](https://t.me/rm_programmer)
Как вам работа с Firebase? Делитесь впечатлениями! 💬
#вебразработка #Firebase #RealtimeDatabase #javascript #программирование
🚀 Веб-разработка с нуля: Урок 17 - Добавляем push-уведомления
Привет, разработчики! 👨💻👩💻
Сегодня научим наш To-Do List отправлять push-уведомления через Firebase Cloud Messaging (FCM).
🔥 Что нового:
1. Настройка FCM в Firebase
2. Получение токена устройства
3. Отправка и обработка уведомлений
📲 Как работают push-уведомления:
1. Пользователь разрешает уведомления
2. Браузер получает уникальный токен
3. Сервер отправляет уведомление по токену
💻 Практика: добавляем уведомления
1. Подключаем FCM в проекте Firebase Console
2. Добавляем скрипт в HTML:
3. Инициализируем Messaging:
4. Обрабатываем входящие уведомления:
🔔 Что мы добавили:
✅ Запрос разрешения на уведомления
✅ Сохранение токена устройства
✅ Обработку входящих сообщений
✅ Красивые браузерные уведомления
💡 Профессиональные советы:
1. Добавьте кнопку для управления уведомлениями:
2. Отправляйте тестовое уведомление через Firebase Console
3. Используйте кастомные иконки:
👉 В следующем уроке:
Настроим автоматические напоминания о задачах!
Подписывайтесь: [t.me/rm_programmer](https://t.me/rm_programmer)
Как вам работа с push-уведомлениями? Пишите в комментариях! 💬
#вебразработка #Firebase #PushУведомления #FCM #javascript
Привет, разработчики! 👨💻👩💻
Сегодня научим наш To-Do List отправлять push-уведомления через Firebase Cloud Messaging (FCM).
🔥 Что нового:
1. Настройка FCM в Firebase
2. Получение токена устройства
3. Отправка и обработка уведомлений
📲 Как работают push-уведомления:
1. Пользователь разрешает уведомления
2. Браузер получает уникальный токен
3. Сервер отправляет уведомление по токену
💻 Практика: добавляем уведомления
1. Подключаем FCM в проекте Firebase Console
2. Добавляем скрипт в HTML:
<script src="https://www.gstatic.com/firebasejs/9.6.0/firebase-messaging-compat.js"></script>
3. Инициализируем Messaging:
const messaging = firebase.messaging();
// Запрашиваем разрешение
function requestNotificationPermission() {
Notification.requestPermission().then(permission => {
if (permission === 'granted') {
console.log('Уведомления разрешены');
getToken();
}
});
}
// Получаем токен устройства
function getToken() {
messaging.getToken({vapidKey: "ВАШ_VAPID_KEY"})
.then(token => {
console.log('Токен устройства:', token);
saveToken(token);
});
}
// Сохраняем токен в БД
function saveToken(token) {
const userId = firebase.auth().currentUser.uid;
database.ref(`users/${userId}/fcmToken`).set(token);
}
4. Обрабатываем входящие уведомления:
// Для работающего приложения
messaging.onMessage(payload => {
console.log('Уведомление:', payload);
showNotification(payload.notification);
});
// Для закрытого приложения
messaging.setBackgroundMessageHandler(payload => {
return self.registration.showNotification(
payload.notification.title,
payload.notification
);
});
function showNotification(notification) {
new Notification(notification.title, {
body: notification.body,
icon: '/icon-192.png'
});
}
🔔 Что мы добавили:
✅ Запрос разрешения на уведомления
✅ Сохранение токена устройства
✅ Обработку входящих сообщений
✅ Красивые браузерные уведомления
💡 Профессиональные советы:
1. Добавьте кнопку для управления уведомлениями:
<button id="notifyBtn">Включить уведомления</button>
document.getElementById('notifyBtn').addEventListener('click', requestNotificationPermission);2. Отправляйте тестовое уведомление через Firebase Console
3. Используйте кастомные иконки:
{
notification: {
title: "Новая задача",
body: "Не забудьте выполнить!",
icon: "/icon-192.png",
click_action: "https://вашсайт.com/tasks"
}
}👉 В следующем уроке:
Настроим автоматические напоминания о задачах!
Подписывайтесь: [t.me/rm_programmer](https://t.me/rm_programmer)
Как вам работа с push-уведомлениями? Пишите в комментариях! 💬
#вебразработка #Firebase #PushУведомления #FCM #javascript
🚀 Веб-разработка с нуля: Урок 18 - Автоматические напоминания
Привет, разработчики! 👨💻👩💻
Сегодня научим наш To-Do List отправлять автоматические напоминания о важных задачах в заданное время.
⏰ Что нового:
1. Работа с датами и временем в JavaScript
2. Использование Firebase Cloud Functions
3. Планирование уведомлений
📅 Как это будет работать:
1. Пользователь устанавливает дедлайн для задачи
2. Система запланирует уведомление
3. Firebase отправит напоминание в нужное время
💻 Практика: добавляем дедлайны
1. Добавляем поле для даты в HTML:
2. Модифицируем функцию добавления задачи:
3. Создаем Cloud Function для уведомлений:
🔔 Что мы улучшили:
✅ Добавили выбор дедлайна для задач
✅ Настроили автоматические напоминания
✅ Использовали Cloud Functions для планирования
✅ Сохранили время создания задачи
💡 Профессиональные советы:
1. Для точного планирования используйте Cloud Tasks API
2. Добавьте повторяющиеся напоминания:
3. Валидируйте ввод даты:
👉 В следующем уроке:
Добавим совместную работу над задачами!
Подписывайтесь: [t.me/rm_programmer](https://t.me/rm_programmer)
Какие функции хотели бы видеть в следующих уроках? 💬
#вебразработка #Firebase #CloudFunctions #Уведомления #JavaScript
Привет, разработчики! 👨💻👩💻
Сегодня научим наш To-Do List отправлять автоматические напоминания о важных задачах в заданное время.
⏰ Что нового:
1. Работа с датами и временем в JavaScript
2. Использование Firebase Cloud Functions
3. Планирование уведомлений
📅 Как это будет работать:
1. Пользователь устанавливает дедлайн для задачи
2. Система запланирует уведомление
3. Firebase отправит напоминание в нужное время
💻 Практика: добавляем дедлайны
1. Добавляем поле для даты в HTML:
<div class="task-form">
<input type="text" id="taskInput" placeholder="Новая задача...">
<input type="datetime-local" id="taskDeadline">
<button id="addButton">Добавить</button>
</div>
2. Модифицируем функцию добавления задачи:
function addTask() {
const taskText = taskInput.value;
const deadline = taskDeadline.value;
if (taskText) {
const task = {
id: Date.now(),
text: taskText,
completed: false,
deadline: deadline || null,
createdAt: firebase.database.ServerValue.TIMESTAMP
};
saveTaskToCloud(task);
if (deadline) scheduleNotification(task);
}
}3. Создаем Cloud Function для уведомлений:
// В файле functions/index.js
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();
exports.scheduleNotification = functions.database
.ref('/users/{userId}/tasks/{taskId}')
.onCreate(async (snapshot, context) => {
const task = snapshot.val();
if (task.deadline) {
const deadline = new Date(task.deadline);
const now = new Date();
if (deadline > now) {
const delay = deadline.getTime() - now.getTime();
await new Promise(resolve => setTimeout(resolve, delay));
const userRef = admin.database().ref(`users/${context.params.userId}`);
const user = (await userRef.once('value')).val();
if (user.fcmToken) {
await admin.messaging().sendToDevice(user.fcmToken, {
notification: {
title: '⏰ Напоминание о задаче',
body: task.text,
clickAction: 'https://вашсайт.com/tasks'
}
});
}
}
}
});
🔔 Что мы улучшили:
✅ Добавили выбор дедлайна для задач
✅ Настроили автоматические напоминания
✅ Использовали Cloud Functions для планирования
✅ Сохранили время создания задачи
💡 Профессиональные советы:
1. Для точного планирования используйте Cloud Tasks API
2. Добавьте повторяющиеся напоминания:
// В объекте задачи
reminder: {
repeat: 'daily',
until: '2023-12-31'
}
3. Валидируйте ввод даты:
if (new Date(deadline) < new Date()) {
alert('Выберите дату в будущем!');
return;
}👉 В следующем уроке:
Добавим совместную работу над задачами!
Подписывайтесь: [t.me/rm_programmer](https://t.me/rm_programmer)
Какие функции хотели бы видеть в следующих уроках? 💬
#вебразработка #Firebase #CloudFunctions #Уведомления #JavaScript
🚀 Веб-разработка с нуля: Урок 19 - Совместная работа над задачами
Привет, разработчики! 👨💻👩💻
Сегодня превратим наш To-Do List в многофункциональный инструмент для командной работы!
🤝 Что нового:
1. Система совместного доступа к задачам
2. Редактирование в реальном времени
3. Индикация активности пользователей
💡 Как это будет работать:
1. Пользователь приглашает участников по email
2. Все изменения синхронизируются мгновенно
3. Каждый видит, кто и что редактирует
💻 Практика: добавляем совместный доступ
1. Добавляем интерфейс для приглашений:
2. Модифицируем структуру данных в Firebase:
3. Создаем Cloud Function для приглашений:
4. Добавляем индикацию активности:
👥 Что мы добавили:
✅ Систему приглашений по email
✅ Общий доступ к задачам
✅ Индикацию онлайн-статуса
✅ Безопасный доступ через Firebase Rules
🔒 Настраиваем правила безопасности:
💡 Профессиональные советы:
1. Добавьте разные уровни доступа (просмотр/редактирование)
2. Реализуйте историю изменений:
3. Используйте аватары пользователей:
👉 В следующем уроке:
Добавим чат к задачам для обсуждения!
Подписывайтесь: [t.me/rm_programmer](https://t.me/rm_programmer)
Как вам система совместной работы? Пишите идеи! 💬
#вебразработка #Firebase #Collaboration #JavaScript #RealTime
Привет, разработчики! 👨💻👩💻
Сегодня превратим наш To-Do List в многофункциональный инструмент для командной работы!
🤝 Что нового:
1. Система совместного доступа к задачам
2. Редактирование в реальном времени
3. Индикация активности пользователей
💡 Как это будет работать:
1. Пользователь приглашает участников по email
2. Все изменения синхронизируются мгновенно
3. Каждый видит, кто и что редактирует
💻 Практика: добавляем совместный доступ
1. Добавляем интерфейс для приглашений:
<div class="collaboration-panel">
<input type="email" id="inviteEmail" placeholder="Пригласить по email">
<button id="inviteButton">Пригласить</button>
<div id="collaboratorsList"></div>
</div>
2. Модифицируем структуру данных в Firebase:
function shareTask(taskId, email) {
const userId = firebase.auth().currentUser.uid;
const shareRef = database.ref(`sharedTasks/${taskId}`);
shareRef.push({
userId: userId,
email: email,
accessLevel: 'editor',
sharedAt: firebase.database.ServerValue.TIMESTAMP
});
// Отправляем email-приглашение через Cloud Function
firebase.functions().httpsCallable('sendInvitation')({
taskId: taskId,
email: email
});
}3. Создаем Cloud Function для приглашений:
exports.sendInvitation = functions.https.onCall((data, context) => {
const taskId = data.taskId;
const email = data.email;
// Отправка email через SendGrid или другой сервис
return sendEmail({
to: email,
subject: 'Приглашение к совместной работе',
html: `Вас пригласили редактировать задачу: <a href="https://вашсайт.com/task/${taskId}">Открыть</a>`
});
});4. Добавляем индикацию активности:
// Отслеживаем активных пользователей
function trackPresence() {
const userId = firebase.auth().currentUser.uid;
const presenceRef = database.ref(`status/${userId}`);
firebase.database().ref('.info/connected').on('value', snap => {
if (snap.val()) {
presenceRef.onDisconnect().set('offline');
presenceRef.set('online');
}
});
}
👥 Что мы добавили:
✅ Систему приглашений по email
✅ Общий доступ к задачам
✅ Индикацию онлайн-статуса
✅ Безопасный доступ через Firebase Rules
🔒 Настраиваем правила безопасности:
{
"rules": {
"sharedTasks": {
"$taskId": {
".read": "auth != null && root.child('tasks/'+$taskId+'/owner').val() == auth.uid",
".write": "auth != null && root.child('tasks/'+$taskId+'/owner').val() == auth.uid"
}
}
}
}💡 Профессиональные советы:
1. Добавьте разные уровни доступа (просмотр/редактирование)
2. Реализуйте историю изменений:
function logChange(taskId, change) {
database.ref(`taskHistory/${taskId}`).push({
change: change,
by: firebase.auth().currentUser.uid,
at: firebase.database.ServerValue.TIMESTAMP
});
}3. Используйте аватары пользователей:
.user-avatar {
width: 24px;
height: 24px;
border-radius: 50%;
margin-right: 8px;
}👉 В следующем уроке:
Добавим чат к задачам для обсуждения!
Подписывайтесь: [t.me/rm_programmer](https://t.me/rm_programmer)
Как вам система совместной работы? Пишите идеи! 💬
#вебразработка #Firebase #Collaboration #JavaScript #RealTime
🚀 Веб-разработка с нуля: Урок 20 - Чат к задачам и подведение итогов
Привет, дорогие разработчики! 👨💻👩💻
Мы прошли огромный путь — от простого To-Do List до полноценного collaborative-приложения! Сегодня добавим чат к задачам и подведем итоги нашего 20-дневного марафона.
💬 Что нового:
1. Реализуем чат для обсуждения задач
2. Добавим уведомления о новых сообщениях
3. Подведем итоги всего курса
📌 Как будет работать чат:
• Каждая задача получает свой чат
• Сообщения сохраняются в Firebase
• Участники получают уведомления
💻 Практика: добавляем чат
1. Добавляем HTML-разметку:
2. Настраиваем структуру в Firebase:
3. Добавляем стили для чата:
🎓 Итоги 20 уроков:
✅ Создали полноценное веб-приложение
✅ Реализовали:
- Работу с DOM
- Адаптивную верстку
- PWA-функционал
- Firebase-интеграцию
- Совместную работу
- Чат к задачам
🚀 Что дальше?
1. Дорабатываем приложение:
- Добавляем теги к задачам
- Реализуем поиск и фильтрацию
- Улучшаем UI/UX
2. Публикуем проект:
- Настраиваем хостинг Firebase
- Регистрируем домен
- Добавляем в App Store/Google Play через PWA
💡 Главные выводы:
1. Современная веб-разработка — это мощно и увлекательно
2. JavaScript + Firebase — отличный стек для старта
3. Лучший способ научиться — делать реальные проекты
📢 Важно:
Весь код доступен в GitHub-репозитории: [ссылка]
Присоединяйтесь к чату участников: [@rm_programmer_chat]
Подписывайтесь: [t.me/rm_programmer](https://t.me/rm_programmer)
Делитесь своими реализациями — лучшие проекты мы разберем в канале!
#вебразработка #Итоги #JavaScript #Firebase #PWA
Привет, дорогие разработчики! 👨💻👩💻
Мы прошли огромный путь — от простого To-Do List до полноценного collaborative-приложения! Сегодня добавим чат к задачам и подведем итоги нашего 20-дневного марафона.
💬 Что нового:
1. Реализуем чат для обсуждения задач
2. Добавим уведомления о новых сообщениях
3. Подведем итоги всего курса
📌 Как будет работать чат:
• Каждая задача получает свой чат
• Сообщения сохраняются в Firebase
• Участники получают уведомления
💻 Практика: добавляем чат
1. Добавляем HTML-разметку:
<div class="task-chat">
<div id="chatMessages"></div>
<div class="chat-input">
<input type="text" id="chatInput" placeholder="Ваше сообщение...">
<button id="sendMessageBtn">Отправить</button>
</div>
</div>
2. Настраиваем структуру в Firebase:
function sendMessage(taskId, message) {
const userId = firebase.auth().currentUser.uid;
database.ref(`taskChats/${taskId}`).push({
text: message,
sender: userId,
timestamp: firebase.database.ServerValue.TIMESTAMP
});
}
function loadMessages(taskId) {
database.ref(`taskChats/${taskId}`).on('value', snapshot => {
const messages = [];
snapshot.forEach(child => {
messages.push({
id: child.key,
...child.val()
});
});
renderMessages(messages);
});
}3. Добавляем стили для чата:
.task-chat {
border-top: 1px solid #eee;
margin-top: 20px;
padding-top: 15px;
}
#chatMessages {
max-height: 200px;
overflow-y: auto;
margin-bottom: 10px;
}
.chat-message {
margin-bottom: 8px;
padding: 8px 12px;
background: #f5f5f5;
border-radius: 12px;
display: inline-block;
max-width: 70%;
}
.my-message {
background: #007bff;
color: white;
float: right;
}🎓 Итоги 20 уроков:
✅ Создали полноценное веб-приложение
✅ Реализовали:
- Работу с DOM
- Адаптивную верстку
- PWA-функционал
- Firebase-интеграцию
- Совместную работу
- Чат к задачам
🚀 Что дальше?
1. Дорабатываем приложение:
- Добавляем теги к задачам
- Реализуем поиск и фильтрацию
- Улучшаем UI/UX
2. Публикуем проект:
- Настраиваем хостинг Firebase
- Регистрируем домен
- Добавляем в App Store/Google Play через PWA
💡 Главные выводы:
1. Современная веб-разработка — это мощно и увлекательно
2. JavaScript + Firebase — отличный стек для старта
3. Лучший способ научиться — делать реальные проекты
📢 Важно:
Весь код доступен в GitHub-репозитории: [ссылка]
Присоединяйтесь к чату участников: [@rm_programmer_chat]
Подписывайтесь: [t.me/rm_programmer](https://t.me/rm_programmer)
Делитесь своими реализациями — лучшие проекты мы разберем в канале!
#вебразработка #Итоги #JavaScript #Firebase #PWA
🚀 Веб-разработка с нуля: Урок 21 - Публикуем проект в сети
Привет, выпускники курса! 👨🎓👩🎓
Сегодня завершающий этап — научимся публиковать ваше приложение в интернете и делиться им с миром!
🌐 Что рассмотрим:
1. Хостинг на Firebase
2. Настройку доменного имени
3. Добавление PWA в магазины приложений
🔥 Firebase Hosting за 3 шага:
1. Устанавливаем Firebase CLI:
2. Инициализируем проект:
3. Делаем деплой:
🔗 Подключаем домен:
1. В Firebase Console → Hosting
2. Добавляем свой домен (можно купить за ~150₽/год)
3. Настраиваем DNS-записи как указано в инструкции
📱 Публикуем PWA в магазинах:
1. Генерируем APK/IPA через:
- [PWABuilder](https://www.pwabuilder.com/)
- [Bubblewrap](https://github.com/GoogleChromeLabs/bubblewrap)
2. Загружаем в:
- Google Play Console (~2000₽ разовый взнос)
- App Store Connect ($99/год)
💼 Портфолио-советы:
1. Создайте README.md с:
- Скриншотами
- Описанием технологий
- Ссылкой на живое демо
2. Выложите код на GitHub:
🎁 Бонус: бесплатные ресурсы
1. Домены: [Freenom](https://www.freenom.com/) (бесплатные .tk/.ml)
2. Хостинг: [Vercel](https://vercel.com/), [Netlify](https://www.netlify.com/)
3. Иконки: [Font Awesome](https://fontawesome.com/)
💡 Финал — это только начало!
Ваш путь в веб-разработке продолжается:
➜ Осваиваем React/Vue
➜ Изучаем серверный Node.js
➜ Пробуем TypeScript
Подписывайтесь: [t.me/rm_programmer](https://t.me/rm_programmer)
Делитесь ссылками на ваши проекты — лучшие опубликуем в канале! 🚀
#вебразработка #Firebase #Хостинг #Портфолио #PWA
Привет, выпускники курса! 👨🎓👩🎓
Сегодня завершающий этап — научимся публиковать ваше приложение в интернете и делиться им с миром!
🌐 Что рассмотрим:
1. Хостинг на Firebase
2. Настройку доменного имени
3. Добавление PWA в магазины приложений
🔥 Firebase Hosting за 3 шага:
1. Устанавливаем Firebase CLI:
npm install -g firebase-tools
firebase login
2. Инициализируем проект:
firebase init hosting
# Выбираем ваш проект Firebase
# Указываем папку (public)
# Настраиваем как SPA (все URL → index.html)
3. Делаем деплой:
firebase deploy --only hosting
🔗 Подключаем домен:
1. В Firebase Console → Hosting
2. Добавляем свой домен (можно купить за ~150₽/год)
3. Настраиваем DNS-записи как указано в инструкции
📱 Публикуем PWA в магазинах:
1. Генерируем APK/IPA через:
- [PWABuilder](https://www.pwabuilder.com/)
- [Bubblewrap](https://github.com/GoogleChromeLabs/bubblewrap)
2. Загружаем в:
- Google Play Console (~2000₽ разовый взнос)
- App Store Connect ($99/год)
💼 Портфолио-советы:
1. Создайте README.md с:
- Скриншотами
- Описанием технологий
- Ссылкой на живое демо
2. Выложите код на GitHub:
git init
git add .
git commit -m "Мой To-Do List проект"
git remote add origin [ваш-репозиторий]
git push -u origin main
🎁 Бонус: бесплатные ресурсы
1. Домены: [Freenom](https://www.freenom.com/) (бесплатные .tk/.ml)
2. Хостинг: [Vercel](https://vercel.com/), [Netlify](https://www.netlify.com/)
3. Иконки: [Font Awesome](https://fontawesome.com/)
💡 Финал — это только начало!
Ваш путь в веб-разработке продолжается:
➜ Осваиваем React/Vue
➜ Изучаем серверный Node.js
➜ Пробуем TypeScript
Подписывайтесь: [t.me/rm_programmer](https://t.me/rm_programmer)
Делитесь ссылками на ваши проекты — лучшие опубликуем в канале! 🚀
#вебразработка #Firebase #Хостинг #Портфолио #PWA