Фічы Node.js 26, які таямніча заменяюць гады выкарыстоўвання альтернатыўных спосабаў
Функцыі Node.js 26, які заменяюць старыя способы рашэння: API Temporal для працы з датамі, выконанне TypeScript на роўні яго самога, вбудованыя адказчыкі для кэшаў і калькі меншых дапамог.
1. І нарэшце мы можамы перастаць прытварацца, што Date — гэта справжня API даты
Ось звычны JavaScript:
const date = new Date("2026-09-08");
console.log(date);
Тепер спробуйце адпаведзіць на трох складнейшы запитанне:
Калі саме праходзіць зустрэч у Нью-Йорку?
Або:
Дадзіце тры месцы да гэтай даты вырахунку.
Або:
У чым на самай працэ разлік межу календарной датой і точным моментам часу?
Сярод гэтага Date пачынае не функціонаваць належна.
Самэй гэтага Temporal так важны.
Node.js 26 за замовчаннем увімкняе API Temporal, нарэшце даўаючы JavaScript адзінаковыя паняванні для моментам, календарных дат, трываласцей і часовых зонаў.
Уместо таго, каб пісаць:
const date = new Date();
тепер вы можете пісаць:
const today = Temporal.Now.plainDateISO();
const invoiceDate =
Temporal.PlainDate.from("2026-09-08");
const dueDate =
invoiceDate.add({ days: 30 });
А калі вам справды трэба точны момент часу, а не календарная дата:
const now = Temporal.Now.instant();
Эта разыяўненасць мае большое значэнне, чым можа здавацца.
Системе выклікання платэжаў на самай працоўцы не трэба "об’ект Date у JavaScript"
Їй трэба дата з календаря.
Распраўядзаным журналу здачы запісаў таксама не трэба "дата з календаря"
Йому трэба момент часу.
Тэрмінальныя структуры змушваюць вас чытка пазначаць, які саме тип часу вы маўчыце на увазе.
Для всьога, што стосуецца платэжаў, прыяохватоў, броніраванняў, рынкаў або корыстувачаў, якія знаходзяцца ў разных часовых поясах, гэта не проста болей прыемная сінтаксіс.
Гэта абмежвае цэлую категорыю багоў, калі вы вострача представляеце неправильны тип значэння часу.
2. Ваш файл .ts не обав’язкова трэбуе крока будовы
Прыводзячы TypeScript у працу ў Node праўільна годзінамі, вы использовалі такую ланцоўку:
app.ts
↓
TypeScript
↓
app.js
↓
Node
Этот практычны падход досягаў часу застаецца абсалютна правільным.
Але тепер Node можа запускать файлы TypeScript безпосередньа, як толькі вони викорыстоўваюць синтаксіс, які можна выдаліць.
Возьмімо такі файл:
interface User {
id: number;
name: string;
}
function greet(user: User) {
return `Hello ${user.name}`;
}
console.log(
greet({
id: 1,
name: "Priyanshu"
})
);
Яго можна запускать безпосередньа за дапамою:
node app.ts
Node проста адключае анотаціі з типамі і запускае залишыўшыся чысты JavaScript.
Є важлівая деталь, яку варта падкрэсліць: Node не пераглядае нічога з точкі зору типаў.
Таму для большога кодавага базісу, які викорыстоўваецца у працэсе стварэння продукту, вам все рава знадобіцца tsc або адпаведны крок перагляду типаў у вашай робочай схеме.
Але падумайце пра меншыя варыянты: внутрашняй скрыпт, простая інструментальная програма для командной лініі, утиліта з адным файлам.
Стары спосаб выглядаў так:
script.ts
↓
configure compiler
↓
compile
↓
run
Тепер ён можа выглядаць так:
script.ts
↓
node
Это невялікая змена.
Але цэе ўжо ентычны прыклад таго, як Node таямна адключае слой, які багато проектаў на самай суцэльнай ніколи не патрабавалі.
3. Код вашай кэш-сістэмы пачаткае выглядаць непатрэбна складным
Вы, верагчыце, запісвалі гэты шаблон больш разоў, ніж можаце памятаць:
let user = cache.get(userId);
if (user === undefined) {
user = await fetchUser(userId);
cache.set(userId, user);
}
У гэтым кодзе няма нічога пакладнага.
Але асалівая мета захавляецца пад тэхнічнымі аспектамі пераканальвання, запрашэння і зберагчыць дадзеных.
На самай працэ вы насправдзе намагаетесь сказаць:
Дайце мне гэтую значэння. Як яго ўжо няма, створыце яго.
Савэчасны JavaScript пачынае дазваляць вам сказаць гэта адносна чыста.
V8 14.6, які ўходзіць у склад Node.js 26, дадае:
Map.prototype.getOrInsert()
Map.prototype.getOrInsertComputed()
За дапамою гэтага сінхронны пошук у кэшы можа быць спроставаны да чагосьць на кшталт:
const value = cache.getOrInsert(
key,
createValue()
);
А калі значэння трэба вырахавваць толькі ляжна, пад запитам:
const value = cache.getOrInsertComputed(
key,
() => createValue()
);
Нічога з гэтаго сама по сабе не ёсць рэвалюцыйным фічыром.
Але развітак языка рэдкасцю вялічаецца за дапамою рэвалюйнаўых фічар.
Ён развіваецца тады, калі достатак разработчыкаў пастаўляе тыя ж пяць ліній зноў і зноў, пакуль язык нарэшце не адпавядае:
"Ёшчо чым. Вам больш не трэба пісаць тыя пяць ліній."
Гэта самэ тае даданне, якое тыхо аб’еднаецца з будзенным кодам.
Чэрез год пра гэта практычна ніхто не будзе гаварыць.
Яны проста будуць яго выкарыстоўваць, не думаючы два разы.
4. Node.js тепер можа дасягнуць рэвалюйнаўага рывка па адносу да JavaScript
Этае наступнае можлівасць мае набагато большое значэнне.
Node.js 26 прыносіць экспэрыментальную інтарфейсную схему Foreign Function Interface:
node:ffi
FFI дазволяе JavaScript вызываць функцыі, якія натыўныя бібліятэкі выкладзаюць безпосередна.
Ось прыбліжныя параметры гэтага:
JavaScript
↓
node:ffi
↓
Native library
↓
C / C++ / system APIs
Уявіце сабэйтную бібліятэку, яка адкрывае доступ да чаго-сь на кшталт:
double calculate(double value);
JavaScript тепер, прынеймна ў тэорыі, можа завантажыць гэту бібліятэку і безпасяродна вызваць функцыю.
Гэта адкрывае можлівасці для такіх рэштаў, як:
- спецыялізаваныя вычысленні з числамі
- перадзейнае выкарыстоўванне існуючых сабэйтных бібліятэкаў
- глыбэйшая інтеграцыя з системай
- кріптаграфія на сабэйтным роўні
- обработка зображэнняў і відэа
Але ёсць серйозныя абмежэнні.
Вы пераходзіце межу, якая аддзеляе кераваны JavaScript ад чыстай сабэйтной памяці.
Якшто вы неправа запісуеце сігнатуру функцыі, вы не пакажаеце вялкасловнае асыватчэ JavaScript у якості адпаведзення.
Вы можете зупініць цэлы процес.
Самэ гэтая прычына, чаму гэты API застаецца експерыментальным і знаходзіцца пазаду флага.
Таму не спрыямоўвайце гэта як:
«Падзець перапісваць кожны пакет npm на мове C.»
Лепш чытаць так:
«Node тепер праставляе значна болей прымытны спосаб выходу на тэриторію натыўных аплікацый.»
Это два абсалютна разныя тверджэння.
5. Кліентскі інструмент Node можа не патрабаваць установкі Node
Это ўсё тое ж адно з прыпускаў, якія варта запыталіцца:
Якщо вы ствараеце інструмент з адпамогай Node, вашы корыстувальнікі таксама павінны яго установіць.
Аплікацыі з адным виконвальным файлам не падтрымліваюць гэты прыпуск.
Інструменты SEA ад Node дазваляюць запакаваць аплікацыю як самастоятельны бінарны файл.
Таму замест таго, каб адправляць:
npm install
node index.js
вы можете адправляць ўсё, што ближэй да:
./my-cli
Разглядзіце внутршні інструмент, на які ўсё калектыва звычайна паспелагае ўжо кожны дзень.
Это можа быць інструмент для развяртання:
deploy production
альбо дапаможнік для базы дадзеных:
db-migrate
альбо інструмент для стварэння каркаса проекта:
project init
Якщо вы даеце ўжо готавы виконуемы файл, корыстнікам не трэба знаць і не важлаўна, што пад спінам работае JavaScript.
Эта суптыльна змінюе імідж Node.
Node пачаў свою історію як:
JavaScript, які работае паza браузерам.
Цяпер ён стае больш сэрцаваны як:
Сервіс для запуску застосоў узнавальнага назначэння, які проста работае з JavaScript.
Это значна большая прэтэнзія.
6. Што, як ваш застосоў больш не патрабуе всіх сваіх прав?
Моделі безпекі зазвычай выконваюцца за такім патэрнам:
Application
↓
Gets permissions
↓
Keeps permissions
↓
Runs
Але што, як права патрабуюцца толькі на короткі час, пад час запуску?
Возьмімо сервіс, які пад час ініцыялізаціі чытае файл налашчэння і калькюляты.
Калі ён запускаецца, можа ўжо зовсім не патрабаваць доступу да файловай системы.
Модэль праваў Node працюе над тым, каб дазволіць аплікацыям актыўна скасаваць своія можлівасці пад час роботы, за дапамогою такіх API, як permission.drop().
Процес выглядае так:
Start
↓
Read configuration
↓
Initialize
↓
Drop unnecessary permissions
↓
Run
Это відбівае корыстны прынцып безпекі:
Не толькі спытвайце, што ваша аплікацыя мае право робіць. Спытвайце, якія права ёй насправдзе патрабуюцца далей.
Змяны ў API незначныя.
Але змяні ў падходзе да безпекі аплікацый — няма.
7. Node.js нарэшце гатовы выдаліць дадзеныя
Даўжэнне новых API — гэта просты спосаб зробіць рантайм вражаючым.
Їх адзёрванне — гэта складная частка.
Node.js 26 продовжае адзёрвваць старыя API і застарэлыя внутрошняе элементы, якія існуюць гады.
Это мае большое значэнне, чым можа здавацца.
Кожны стары API раней чым пазней стаець нэвыбіваемай залежнасцю для каго-небудзь.
Якщо яго не контролаваць, сэрвіс працюе з дзесяткамі гадоў накопічаных історычных элементаў:
old API
+
new API
+
replacement API
+
deprecated API
+
"don't use this anymore" API
Зрэлая платформа патрабуе готовасці да ўсунення такіх накопічэнняў.
Node.js все больш прадказвае самэ гэтае жыцzeўнае стаўленне.
Это хорашыя новіны, якщо вы не хочаце запамятаваць кожны стары спосаб адваротнай роботы.
Цікавая частка — гэта не якая-небудзь адзіна функцыя
Temporal сам по сабе не ўражае своей выразнасцю.
Таксама не ўражае getOrInsert().
Таксама не ўражае запуск файлу .ts без практычных крокаў.
Таксама не ўражае пакетаванне CLI у вядомы файл.
Але якщо разместіць іх пашырэй адна адной.
Node одночасна прагромаджваецца вышэй па шчоглу абстракцыі:
Temporal
Better collections
TypeScript
Modern JavaScript
і водночас спускаецца ніжэй:
FFI
Native libraries
Permissions
Executable packaging
Гэта ўсё, што тут важна знать.
Node.js не проста становіцца кращым у выконванні JavaScript.
Ён стае кращым средавам выконання для всіх элементаў, якія асоцыююцца з вашым прыемнікам.
І гэта зменяе пытанне, якое варта задаць на пачатку новага проекту.
Уместо таго, каб адразу перейшаць да:
"Какі пакет npm мне трэба для гэтага?"
варта спачатку запытацца:
"Чы можа Node.js вже гэта зробіць?"
Іноды часова адказ ўсё ж такі — няма.
Але ўсё чащэ адказ выходзіць такім:
"Насправдэ... так."
Гэта, мабыць, найболей выразны аспект Node.js 26.
Средава выконання вже рухалася вперад.
Нашы ментальныя моделі проста ўсё яшчэ не адгукліся.