11232
Все о разработке backend части на JavaScript (Node JS). А так же: Express JS, Next JS, Nest, Socket.IO Канал на бирже - https://telega.in/c/we_use_js По вопросам рекламы или разработки: @g_abashkin РКН: https://vk.cc/cJPGOP
📍 Мой личный блог про мои проекты, опыт, ошибки, немного про деньги и жизнь в целом
➡️ Геныч.
👩💻 Циклические импорты на фронтенде
В статье рассматриваются проблемы, которые создают рекурсивные зависимости на фронте. Обсуждаются способы их обнаружения и решения, ведь часто разработчики даже не знают, что в проекте есть циклические зависимости.
Читать...
👩💻 Твой JavaScript должен быть проще: 10 приемов современного разработчика
Советы по написанию короткого, лаконичного и чистого кода на JavaScript
Читать...
👩💻 База, которую нужно знать про JSON Schema
Сегодня мы рассмотрим одну из тем, которая, как ни странно, остаётся недооценённой — JSON Schema. Если ты аналитик (или хочешь им быть) и в твоей работе часто мелькают JSON-файлы, то наверняка знаешь, как сложно порой бывает держать всё это под контролем. В этой статье мы разберём всё, что тебе нужно знать про JSON Schema.
Читать...
📈 Подборка статей для вашей карьеры
• Сила лидерского слушания
• Как пройти стажировку бизнес- и системного аналитика и не «сгореть» в персональной преисподней
• «Так и знала, что вы — бывший двоечник!» Самые глупые ошибки моей компьютерной молодости
• Что лучше — оценка рекрутера или подбрасывание монетки?
• Мотивационные стили в обучении: почему вам (возможно) не нужны цели или общение с одногруппниками
➡️ Самые интересные статьи за последние дни:
• SMS-автоответчик с обновлением статуса: еще один канал связи для клиентов, которым мало интернета и звонков
• Попробуйте Tauri
• Новый оператор безопасного присваивания в JavaScript: ?=
• Как ускорить компонентную frontend-разработку с помощью продуктового подхода: опыт Рунити
• PostgreSQL Antipatterns: валим «слона» — highload на ровном месте
👩💻 Всё о циклах в JavaScript
В каждом языке программирования есть циклы. Циклы выполняют операцию (т. е. часть работы) несколько раз, обычно по одному разу для каждого элемента массива или списка, или просто повторяют операцию до тех пор, пока не будет выполнено определённое условие.
Читать...
👩💻 Проблемы экспорта по умолчанию в JavaScript модулях
JavaScript модули позволяют организовывать код для повторного использования. Существует два метода экспорта: по умолчанию и именованный. В этой статье разбираем экспорт по умолчанию и причины, почему его стоит избегать.
Читать...
👩💻 Задачка по NodeJS
Создайте приложение на Node.js, которое принимает путь к папке в качестве аргумента командной строки и создает файл report.json, содержащий статистику по этой папке: количество файлов, количество папок, и общий размер всех файлов.
Программа должна уметь выводить статистику по папке в консоль и сохранять её в файл.
➡️ Пример:
• node app.js report /path/to/folder — создает файл report.json с данными о содержимом папки.
• node app.js print /path/to/folder — выводит статистику о папке в консоль.
Решение задачи ⬇️
const fs = require('fs');Читать полностью…
const path = require('path');
const { promisify } = require('util');
const readdir = promisify(fs.readdir);
const stat = promisify(fs.stat);
const action = process.argv[2];
const folderPath = process.argv[3];
const reportFile = 'report.json';
if (!action || !folderPath) {
console.log('Используйте: node app.js <report|print> <путь к папке>');
process.exit(1);
}
async function analyzeFolder(folder) {
const entries = await readdir(folder, { withFileTypes: true });
let totalSize = 0;
let fileCount = 0;
let folderCount = 0;
for (const entry of entries) {
const fullPath = path.join(folder, entry.name);
if (entry.isDirectory()) {
folderCount++;
const { totalSize: folderSize, fileCount: folderFiles, folderCount: subFolderCount } = await analyzeFolder(fullPath);
totalSize += folderSize;
fileCount += folderFiles;
folderCount += subFolderCount;
} else if (entry.isFile()) {
const fileStats = await stat(fullPath);
fileCount++;
totalSize += fileStats.size;
}
}
return { totalSize, fileCount, folderCount };
}
async function generateReport(folder) {
const stats = await analyzeFolder(folder);
const reportData = {
folder: folder,
files: stats.fileCount,
folders: stats.folderCount,
totalSize: stats.totalSize,
};
fs.writeFile(reportFile, JSON.stringify(reportData, null, 2), (err) => {
if (err) {
console.error('Ошибка при записи отчета:', err);
process.exit(1);
}
console.log(`Отчет сохранен в ${reportFile}`);
});
}
async function printReport(folder) {
const stats = await analyzeFolder(folder);
console.log(`Папка: ${folder}`);
console.log(`Количество файлов: ${stats.fileCount}`);
console.log(`Количество папок: ${stats.folderCount}`);
console.log(`Общий размер файлов: ${stats.totalSize} байт`);
}
if (action === 'report') {
generateReport(folderPath);
} else if (action === 'print') {
printReport(folderPath);
} else {
console.log('Неизвестное действие. Используйте "report" или "print".');
}
👩💻 Управляйте промисами используя Promise.withResolvers()
Метод Promise.withResolvers() повышает гибкость, позволяя удалённо разрешать или отклонять промисы, упрощая и оптимизируя асинхронный код.
Читать...
👩💻 Переменные среды/окружения в Node.js: Как правильно их установить
В этой статье мы погрузимся в мир переменных среды в Node.js, рассмотрим их преимущества, примеры использования и лучшие практики эффективного управления ими.
Читать...
⚙️ PostgreSQL Antipatterns: валим «слона» — highload на ровном месте
Сегодняшняя тема посвящена нелегким взаимоотношениям клиентского приложения и сервера PostgreSQL: как на ровном месте, неудачной архитектурой приложения, можно обеспечить себе хронические проблемы производительности.
Читать...
👩💻 Задачка по NodeJS
Создайте приложение на Node.js, которое принимает URL в качестве аргумента командной строки, загружает HTML-контент по этому URL и сохраняет его в файл page.html. Программа должна также уметь выводить размер загруженного HTML-контента в байтах.
➡️ Пример:
• node app.js download "https://example.com" — загружает страницу по указанному URL и сохраняет в файл page.html.
• node app.js size "https://example.com" — выводит размер HTML-контента, загруженного по URL.
Решение задачи ⬇️
const fs = require('fs');Читать полностью…
const https = require('https');
const url = process.argv[3];
const action = process.argv[2];
const filePath = 'page.html';
if (!action || !url) {
console.log('Используйте: node app.js <download|size> <URL>');
process.exit(1);
}
function downloadPage(url) {
https.get(url, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
fs.writeFile(filePath, data, (err) => {
if (err) {
console.error('Ошибка при сохранении страницы:', err);
process.exit(1);
}
console.log('Страница загружена и сохранена в page.html');
});
});
}).on('error', (err) => {
console.error('Ошибка загрузки страницы:', err);
process.exit(1);
});
}
function getPageSize(url) {
https.get(url, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log(`Размер HTML-контента: ${Buffer.byteLength(data, 'utf8')} байт`);
});
}).on('error', (err) => {
console.error('Ошибка загрузки страницы:', err);
process.exit(1);
});
}
if (action === 'download') {
downloadPage(url);
} else if (action === 'size') {
getPageSize(url);
} else {
console.log('Неизвестное действие. Используйте "download" или "size".');
}
👩💻 Пользовательские события CustomEvent
JavaScript CustomEvent расширяют функциональность встроенной системы событий. Проще говоря, они позволяют программистам создавать и обрабатывать события, уникальные для их приложения, и в этой статье мы расскажем о них всё.
Читать...
👩💻 4 типичные ошибки разработчиков Node.js
Растущее комьюнити Node.js - свидетельство надежности и эффективности этого инструмента. Однако не всем удается извлечь из него максимальную выгоду. Рассмотрим самые распространенные ошибки разработчиков Node.js.
Читать...
➡️ Самые интересные статьи за последние дни:
• Быстрее пули: как найти счастье с PostgreSQL
• Куда движется Laravel? Обзор интервью с Taylor Otwell
• Nexus-IoC — хорошо знакомый незнакомец в мире TypeScript и DI
• Как сделать React Server Components в Electron с помощью Next.js и без открытых портов
• 10 не самых очевидных причин, чтобы уволиться
📂 Названия — твой первый UX
Файл utils2.js, функция handleData, переменная x. Ты и сам не понимаешь, что это значит.
👉 Совет: относись к названиям как к первому уровню документации. Пусть код читается без контекста. Если ты тратишь больше 3 секунд на попытку «вспомнить, что это», — переименуй. Название должно работать вместо комментария.
Инфраструктурный мониторинг продолжает уходить в сторону глубокой observability — и новый шаг в этом направлении сделала Yandex B2B Tech, запустив платформу Monium. Решение, разработанное командой Yandex Infrastructure, уже доступно для внешних пользователей и изначально создавалось для контроля критичных внутренних сервисов компании.
Если коротко о сути продукта — Monium позволяет видеть состояние системы как целостную картину, а не набор разрозненных метрик. Платформа одновременно обрабатывает телеметрию приложений, инфраструктуры и цифровых сервисов, вне зависимости от их расположения - в облаке или on-prem.
Техническая сторона решения рассчитана на высокие нагрузки: до 3 млрд семплов метрик в секунду, около 44 млн спанов трассировки и порядка 60 ГБ логов ежесекундно. Для инженеров важна поддержка Prometheus и OpenTelemetry, позволяющая встроить систему в существующие DevOps-процессы без жесткой привязки к инструментам.
Среди первых внешних пользователей платформы — ОТП Банк. В целом запуск отражает общий тренд роста рынка observability, который отмечает Gartner.
👩💻 Освоение безопасной для типов JSON-сериализации в TypeScript
Предлагаем руководство по использованию TypeScript для безопасной для типов сериализации и десериализации данных в формате JSON. Освоение этой стратегии позволит своевременно обнаруживать потенциальные ошибки во время разработки приложения.
Читать...
👩💻 В чём разница между exports и module.exports
Вы знаете в чём разница между exports и module.exports в Node.js? Для начала рассмотрим, что представляет собой объект модуля.
Читать...
👩💻 Задачка по NodeJS
Создайте приложение на Node.js, которое принимает путь к текстовому файлу в качестве аргумента командной строки, подсчитывает количество строк, слов и символов в файле, а затем сохраняет результат в stats.json. Программа также должна уметь выводить статистику в консоль.
Программа должна уметь выводить статистику по папке в консоль и сохранять её в файл.
➡️ Пример:
• node app.js report /path/to/file.txt — создает файл stats.json с количеством строк, слов и символов в файле.
• node app.js print /path/to/file.txt — выводит статистику по файлу в консоль.
Решение задачи ⬇️
const fs = require('fs');Читать полностью…
const path = require('path');
const { promisify } = require('util');
const readFile = promisify(fs.readFile);
const action = process.argv[2];
const filePath = process.argv[3];
const reportFile = 'stats.json';
if (!action || !filePath) {
console.log('Используйте: node app.js <report|print> <путь к файлу>');
process.exit(1);
}
async function analyzeFile(file) {
const content = await readFile(file, 'utf8');
const lines = content.split('\n').length;
const words = content.split(/\s+/).filter(Boolean).length;
const chars = content.length;
return { lines, words, chars };
}
async function generateReport(file) {
const stats = await analyzeFile(file);
fs.writeFile(reportFile, JSON.stringify(stats, null, 2), (err) => {
if (err) {
console.error('Ошибка при записи отчета:', err);
process.exit(1);
}
console.log(`Отчет сохранен в ${reportFile}`);
});
}
async function printReport(file) {
const stats = await analyzeFile(file);
console.log(`Файл: ${file}`);
console.log(`Количество строк: ${stats.lines}`);
console.log(`Количество слов: ${stats.words}`);
console.log(`Количество символов: ${stats.chars}`);
}
if (action === 'report') {
generateReport(filePath);
} else if (action === 'print') {
printReport(filePath);
} else {
console.log('Неизвестное действие. Используйте "report" или "print".');
}
👩💻 Как реализовать обмен сообщениями между процессами в Node.js?
В многопроцессных приложениях на Node.js иногда нужно организовать обмен сообщениями между процессами. Это полезно, когда ваше приложение использует форк процессов или воркеры для выполнения задач параллельно.
➡️ В этом примере мы используем встроенный модуль child_process для создания дочернего процесса и организации обмена сообщениями.
const { fork } = require('child_process');
// Запускаем дочерний процесс
const child = fork('child.js');
// Отправляем сообщение дочернему процессу
child.send({ msg: 'Привет, дочерний процесс!' });
// Обрабатываем сообщения от дочернего процесса
child.on('message', (message) => {
console.log('Родитель получил:', message);
});
// Код дочернего процесса (child.js)
process.on('message', (message) => {
console.log('Дочерний процесс получил:', message);
// Отправляем ответ родительскому процессу
process.send({ msg: 'Привет, родительский процесс!' });
});🗣️ Использование сообщений между процессами полезно для разделения вычислений и повышения производительности.Читать полностью…
➡️ Создание конфигурируемого Webhook-модуля для NestJS-приложении
В рамках этой статьи я опишу создание двух NestJS-модулей с различным способом конфигурирования: утилитарный модуль и бизнес-модуль со своей базой данных.
Читать...
📊 Обзор лучших библиотек для визуализации данных
Визуализация данных — важная часть любого проекта, связанного с аналитикой и обработкой данных. Мы рассмотрим 7 библиотек: Plotly, D3.js, Nivo, Latitude, Apache ECharts, Victory и Chart.js.
Читать...
Зовем на максимально практическую онлайн-конференцию Podlodka Techlead Crew «Архитектура данных», 2-6 марта.
Пригодится техлидам, которые хотят меньше теории и больше рабочих решений без ненужного хайпа.
А в надежном комьюнити можно обсудить доклады ❤️
«Идет долгий тренд на оптимизацию ресурсов и подсчет затрат на инфраструктуру.
Востребованы инженеры, которые могут разобраться, как оптимизировать потребление ресурсов хранилища, как быстрее и эффективнее работать с ними»,
— объясняет главный принцип выбора темы директор Techlead Crew Григорий Скобелев.
В программе:
⚙️ Как строить потоковую обработку данных и не получить неуправляемую систему.
⚖️ Как выбирать между SQL, NoSQL и NewSQL под реальные нагрузки и сценарии.
🧩 Как проектировать DWH и Data Lake так, чтобы было полезно бизнесу.
🧠 Как работать с консистентностью и транзакциями без потери масштабируемости.
📊 Как и когда применять OLAP-хранилища и не превращать аналитику в боль.
🗓️ Когда: 2 - 6 марта
🔗 Посмотреть подробную программу →
🔬 Тестируй даже то, что кажется надёжным
«Это никогда не ломается» — последняя фраза перед катастрофой. Особенно в частях кода, которые трогают редко.
👉 Совет: пиши тесты для стабильных участков кода. Именно они чаще всего становятся ловушкой, когда всё вокруг уже поменялось, а эти куски — нет. Спокойствие в проде начинается с паранойи в деве.
👩💻 Дата и время в JavaScript
Учимся работать с датой и временем в JavaScript: разбираемся с определением и способом создания объекта Data, его методами и форматами вывода.
Читать...
👩💻 Как преобразовать Node.js Buffer в String
При преобразовании между Buffer и String может быть указана кодировка символов. Если кодировка не указана, по умолчанию будет использоваться UTF-8
Читать...
🧩 Frontend: папка для тех, кто пишет фичи, а не диплом
Фронтенд – среда, где фреймворки обновляются быстрее, чем вы успеваете дочитать сохранённый тред.
Поэтому я собрал папку с блогами фронтенд-разработчиков, которые говорят про то, как писать код, который потом не стыдно поддерживать, почему всё падает после seemingly harmless правки, как с этим жить и про многое другое.
👨💻 Что внутри:
◻️ JS, TS, React, Next, Node – с разбором задачек, собесов, архитектуры и почему определенное решение потом аукнется в проде
◻️ Авторские блоги людей с опытом, которые уже наломали дров, пережили рефакторинг рефакторинга и могут спокойно объяснить что и как
◻️ Fullstack-мысли: от фронта до базы, от API до тёмной темы в админке
◻️ Пишут ребята с 5+ лет боевого опыта – делятся тем, о чём не расскажут на курсах
◻️ Мемы, кейсы, паттерны и фронт с человеческим лицом
👩💻 Задачка по NodeJS
Создайте небольшое приложение на Node.js, которое симулирует простой чат. Программа должна принимать два аргумента командной строки: действие (send, history) и сообщение. Программа должна сохранять все сообщения в текстовом файле (chat.txt) и уметь добавлять новые сообщения, а также выводить историю чата.
➡️ Пример:
• node app.js send "Привет, как дела?" — добавляет сообщение "Привет, как дела?" в файл. • • node app.js history — выводит историю всех сообщений из файла.
Решение задачи ⬇️
const fs = require('fs');Читать полностью…
const action = process.argv[2];
const message = process.argv[3];
const filePath = 'chat.txt';
if (!action) {
console.log('Используйте: node app.js <send|history> [message]');
process.exit(1);
}
// Функция для добавления нового сообщения
function sendMessage(message) {
const timestamp = new Date().toLocaleString();
const formattedMessage = `[${timestamp}] ${message}`;
fs.appendFile(filePath, `${formattedMessage}\n`, (err) => {
if (err) {
console.error('Ошибка при отправке сообщения:', err);
process.exit(1);
}
console.log('Сообщение отправлено.');
});
}
// Функция для вывода истории сообщений
function showHistory() {
fs.readFile(filePath, 'utf8', (err, data) => {
if (err) {
console.error('Ошибка чтения файла:', err);
process.exit(1);
}
const messages = data.trim().split('\n');
if (messages.length === 0 || (messages.length === 1 && messages[0] === '')) {
console.log('История чата пуста.');
} else {
console.log('История чата:');
messages.forEach((msg) => {
console.log(msg);
});
}
});
}
// Логика обработки команд
if (action === 'send') {
if (!message) {
console.log('Введите сообщение для отправки.');
} else {
sendMessage(message);
}
} else if (action === 'history') {
showHistory();
} else {
console.log('Неизвестное действие. Используйте "send" или "history".');
}