Telegram Web Link
Релиз Deno 2.4

Вышел Deno 2.4. Очень много работы над developer experience, а также часть фичей вышли из экспериментальных в стабильные

Восстановили deno bundle. Это команда, которая собирала приложение в 1 бандл. Работала как для серверных приложений, так и для браузерных. В какой-то момент ее задепрекейтили, теперь снова вернули с esbuild под капотом. В будущем обещают программное API для создания бандлов.

Добавили возможность импортировать не код.

Ранее картинки и другие файлы необходимо было считывать в рантайме
const image = Deno.readFileSync(import.meta.resolve("./image.png"));
const text = await Deno.readTextFile(import.meta.resolve("./log.txt"));


Теперь же можно использовать обычные импорты с атрибутами
import message from "./hello.txt" with { type: "text" };
import bytes from "./hello.txt" with { type: "bytes" };
import imageBytes from "./image.png" with { type: "bytes" };

console.log("Message:", message);
// Message: Hello, Deno!

console.log("Bytes:", bytes);
// Bytes: Uint8Array(12) [
// 72, 101, 108, 108, 111,
// 44, 32, 68, 101, 110,
// 111, 33
// ]

Deno.serve((_req) => {
return new Response(imageBytes, {
status: 200,
headers: {
"Content-Type": "image/png",
"Content-Length": imageBytes.byteLength.toString(),
},
});
});
// Shows image.png at localhost:8000


Кроме того, можно импортировать и wasm-файлы

Поддержку OpenTelementry сделали стабильной. До этого релиза OpenTelemetry была экспериментальной фичей, включаемой флагом. Теперь дополнительный флаг не нужен - достаточно установить переменную окружения OTEL_DENO=1

Добавили флаг --preload для указания кода, который должен запуститься до запуска основного скрипта. Может быть полезно для задания каких-то глобальных настроек или создания глобальных сущностей.

Добавили явный флаг --coverage для сборки покрытия кода. Вывод coverage в консоли представлен в виде markdown-таблицы, которую легко вставить в любой markdown-документ. Также и benchmark таблицы теперь тоже в markdown формате. Забота о разработчиках, которой нам не хватало :)

Добавили DENO_COMPAT=1 - переменная окружения, которая устанавливает все флаги, сделанные для поддержки работы с package.json

Доработали систему разрешений. В --allow-net можно указывать вайлдкарты доменов и пространства сетей CIDR - --allow-net=*.foo.localhost, --allow-net=192.168.0.128/25. Также добавили флаг --allow-import и --deny-import для разрешения и запретов импортов из определенных источников --deny-import=cdn.jsdelivr.net

В Deno 2.3 ввели возможность использовать локальные нпм-пакеты через поле patch. Получили фидбек от сообщества, что patch может запутать т.к. в npm это используется по-другому. Поэтому локальные пакеты теперь надо указывать в секции links

Кроме этого:
- Улучшили совместимость с nodejs
- Добавили во встроенный линтер поддержку XML и SVG
- Улучшили поддержку tsconfig
- Улучшили свой LSP

https://deno.com/blog/v2.4

#development #javascript #deno #releaseNotes
🔥92
Repomix: Pack your codebase into AI-friendly formats

Repomix - библиотека, которая запакует ваш репозиторий в формат, удобный для AI. Собранный документ затем можно кидать в любую LLM как проект, с которым можно работать.

Какой-то магии здесь нет - библиотека буквально формирует огромный файл, где структурировано расписано - какие файлы есть в проекте и какой у них контент. Как нибудь попробую поиграться с этим на пет-проекте.

https://repomix.com

#development #javascript #library #ai
👍7
Modern Node.js Patterns for 2025

Список современных бест-практисов nodejs в частном блоге. Часть бест-практисов уже "старые", часть - достаточно интересные. В любом случае полезно ознакомиться, возможно найдете что-то для себя

Из банальных советов: используйте ESM, fetch, async await, воркеры для сложных вычислений, кастомные классы ошибок. Менее банальные стоит расписать подробнее.

В основном бест-практисы связаны с использованием внутренних инструментов nodejs, вместо использования внешних библиотек, либо с использованием общих web-стандартов, вместо использования специфичного для nodejs решения.

В nodejs завезли test-runner, теперь можно запускать автотесты без внешних библиотек

В nodejs с самого начала была хорошая поддержка потоков (Streams). Теперь же потоки есть и в Web-стандартах, поэтому пора переходить на работу с ними, делая свой код кросс-платформенным.

Завезли новые удобные флаги для разработки - --watch, --env-file, которые убирают необходимость во внешних библиотеках типа dotenv и nodemon

Также в nodejs теперь есть возможность ограничивать возможность приложений как в deno. Правда, пока за экспериментальными флагами

# Run with restricted file system access
node --experimental-permission --allow-fs-read=./data --allow-fs-write=./logs app.js

# Network restrictions
node --experimental-permission --allow-net=api.example.com app.js


В nodejs теперь есть возможность мониторить перформанс, что, опять же, убирает необходимость во внешних библиотеках


import { PerformanceObserver, performance } from 'node:perf_hooks';

// Set up automatic performance monitoring
const obs = new PerformanceObserver((list) => {
for (const entry of list.getEntries()) {
if (entry.duration > 100) { // Log slow operations
console.log(`Slow operation detected: ${entry.name} took ${entry.duration}ms`);
}
}
});
obs.observe({ entryTypes: ['function', 'http', 'dns'] });

// Instrument your own operations
async function processLargeDataset(data) {
performance.mark('processing-start');

const result = await heavyProcessing(data);

performance.mark('processing-end');
performance.measure('data-processing', 'processing-start', 'processing-end');

return result;
}


Если вам нужно доставлять nodejs-приложение единым файлом, то nodejs теперь умеет делать это сама (опять же - убирается зависимость от внешних тулов)


# Create a self-contained executable
node --experimental-sea-config sea-config.json


Также следует использовать новые возможности node:diagnostics_channel. Можно создать канал диагностики, куда можно публиковать события, которые можно затем передавать в специализированный тулинг

import diagnostics_channel from 'node:diagnostics_channel';

// Create custom diagnostic channels
const dbChannel = diagnostics_channel.channel('app:database');
const httpChannel = diagnostics_channel.channel('app:http');

// Subscribe to diagnostic events
dbChannel.subscribe((message) => {
console.log('Database operation:', {
operation: message.operation,
duration: message.duration,
query: message.query
});
});

// Publish diagnostic information
async function queryDatabase(sql, params) {
const start = performance.now();

try {
const result = await db.query(sql, params);

dbChannel.publish({
operation: 'query',
sql,
params,
duration: performance.now() - start,
success: true
});

return result;
} catch (error) {
dbChannel.publish({
operation: 'query',
sql,
params,
duration: performance.now() - start,
success: false,
error: error.message
});
throw error;
}
}


https://kashw1n.com/blog/nodejs-2025/

#development #javascript #nodejs
👍16🔥53
2025/07/09 10:17:09
Back to Top
HTML Embed Code: