Галоўная / Артыкулы

Пераклад проекта Node.js на Bun: внутрасхованнае функцыяны працы, Lambda і процес міграцыі

З’ясавайце, чым заменяецца Bun у фреймворку Node.js, чаму ён запускаецца быстра, як він працюе з TypeScript і на AWS Lambda, а таксама як пасляэтапна міграцыя проекту.

Выдавец: REACTAPP.TOP6 хв чытання1493 слоў

Крыніцы: Everything You Need to Know About Bun: A Beginner’s Guide, Migration, and Architecture

Тыповая служба на Node.js выкарыстоўвае чатыры або пяць разлічных інструментаў, прытым як толькі запускае адну лінію бізнес-логікі: менеджер пакетаў, запускач TypeScript, фрэймворк для тэстаў і збірач коду. Bun аднойчына спяйнае ўсі этыя інструменты ў адны виконвальны файл, які выполняе ролю среды запуску, менеджера пакетаў, збірача коду і запускача тэстаў, і мае на мету стаць заменай для Node.js. У гэтым кяліку пояснюецца, што на самае працоўвае Bun, звыдкі берэцца яго шырокасць, як ён работае з TypeScript і розмешчэнням без сервера, а таксама як перанесці існуючы проект без неспадзянак. Для болей шырокага порэвання, якое таксама абрабоўвае Deno, адзірніце Node.js, Deno і Bun у порэванні.

Што заменяе Bun у тыповай лінейцы інструментаў

Выкананне JavaScript за межаў браузера выкалічвае патрэбу ў среды выканання, і працоўнае месца гэтага за адзін дзесятак гадоў было Node.js. Аднак сучасны проект на Node зазвычай аб’едначае ў сабе калькі незалежных інструментаў:

  • npm або Yarn для інсталяцыі та калектывавання пакетаў;
  • tsc, ts-node або tsx для кампіляцыі чы выканання TypeScript;
  • Jest або Vitest для тэстаў на елементарныя функцыі;
  • esbuild, webpack або Rollup для стварэння пакетаў для рэалізацыі.

Bun аддае ўсія гэтыя можлівасці ў адны бінарны файл. Яго інсталяцыя дае вам среду выканання, калектывавальнік пакетаў, інструмент для стварэння пакетаў, прыстрой для тэстаў і можлівасць безпосередньага выканання TypeScript без дадатковай наладкі. Асловныя прыбуткі — гэта адсутнасць зайвых элементаў: менш файлаў наладкі і меньш несувязоў у версіях інструментаў.

Парэйнаўанне плюсоў і мінусаў у прырэшце з Node.js

Рашынак здэйсніваецца пераважна на адной стороне за счытком швальнасці і інтэграцыі, а на другай — за счытком зрэласці экасистемы.

Дзе Bun моцны

  • Адна інтэграваная комплектацыя засобаў. Не трэба настраіваць окольныя прыстроі для тэставання, зборкі кода чыта перакладчыка TypeScript.
  • Швайная установка. Самыя прамеры Bun паказваюць, што bun install працюе да 30 разоў швэйчэй за npm; рэзультаты будуць залежныя ад проекта і стану кэша.
  • Швайныя пачатковыя запускі. Процесы запускаюцца за мілісекунды, што ў выключна важлівам значэнні ў безсерверных средах, дзе затрымкі пачатковага запуску выкалююцца і відчуваюцца корыстнікамі.
  • TypeScript без настройкі. Файлы .ts і .tsx запускаюцца безпосередзе, без пракрэткі зборкі чы скрыптаў-завантажухоў.
  • Меньшая выкарыстоўванне памяці. Указаныя цифры для HTTP-сервераў зазвычай станавяць 25%–40% менш RAM, чым у Node.js; пераканайцеся самі ў сваёй навантажэнні, прычымляючыся да гэтых даных.
  • Аккумулятары ўключаныя. Файлы .env завантажаюцца аўтоматычна без dotenv, а час выконання включае вбудованныя кліенты для SQLite, Postgres, S3 і Redis.
  • Дзе Node.js яшчэ мае перавагу

    • Зрэласць. Node.js мае болей 15 гадоў історыі выкарыстоўвання ў працэсах і формальныя версіі з давгастраўнай падтрымкай, на якія рэгулююць свае планы падпрыемства. Bun молодзейшы і яшчэ усунець недастаткі сумяшання пры спецыяльных ситуаціях.
    • Натыўныя дадаткі. Большасць пакетаў npm (часта наводзіцца, што гэта ад 95% і больш) працуюць без змян, але старэйшыя пакеты, якія компілююць код на C++ за дапамой node-gyp, можа ўсё ж сталкнуцца з проблемамі.

    Чаму Bun запускаецца і працюе быстра

    Гэта не проста „Zig перамагае C++“

    Bun напісаны на Zig, і ўтаму хочацца прызначыць його швальнасць саме мове. На практыцы скомпіляваны Zig і скомпіляваны C++ працуюць з аднаковай швальнасцю на CPU. Разлік вырабляецца заўсёды дзякуя дизайну. Node.js мае багатыя гады накопіленаўых абстракцый, тады калі Bun пераімплементаваў роботу з файламі, обробку страк і сетевыя функцыі з нуля, акцэнтаваўшыся на утриманні ад некалькіх выкарыстоўвання памяці.

    Іншы двайчарник JavaScript

    Node.js работае на V8 — двіжку, якій Google створыў для Chrome. Bun выкарыстоўвае JavaScriptCore — двіжак, якій Apple створыў для Safari. JavaScriptCore налаштаваны для шырокага запуску і актыўнай оптымізацыі памяці, што дапамагае адказваць на пытанні пра час запуску Bun. Кожны двіжак мае сферы, дзе ён працуе быстрэй, таму службы з довгачасовай роботой і вялікім вычыслювальным навантажэнням трэба теставаць, а не проста гадаць, што ў яных будзе павышэння эфективнасці.

    Корыста не абмежваецца толькі macOS

    Хоча JavaScriptCore быў створаны для Safari, як ён, так і Bun компілююцца натыўна для Linux на архітектурах x86_64 і ARM64, а таксама для Windows. Характэрыстыкі выдання пераходзяць на звычныя хмарныя серверы, незалежна ад операцыйной системы.

    Работа Bun на AWS Lambda

    Bun можа выступаць як HTTP-бэкенд за дапамою свайго власнага API Bun.serve() або за дапамою вядомых фрэймворкаў, такіх як Express, Fastify і Hono. У AWS Lambda його шырокія можлівасці з быстрым запускам у стане «холадны» можа зменшыць як час адпаведзі, так і вартасць выканання. Lambda не прысвячае кераванага рантайму Bun, які можна было б выбраць у консолі, таму команды зазвычай выбіраюць адна з трох падходаў:

    • Спецыяльны шар рантайму. Публікуйце бінарны файл bun як шар Lambda і запускайце його на базовым образе Linux provided.al2023.
    • Образ контейнера. Створыце функцыю на базе офіцыйнага Docker-образа oven/bun, выкладзіце яго на Amazon ECR і разместіце як контейнер.
    • Стварыце з Bun, запускайце на Node. Іспользуйце bun build, каб збіркаваць код у адны файл .js, а пасля запускайце гэты файл на кераваным рантайме Node.js у Lambda.

    Трэці варыянт — гэты самы консерватывны: вы атрымляеце шырокія можлівасці зборкі ад Bun, заўсёды выкарыстоўваючы падтрымваныя AWS рэнтайм-сервісы ў працоўным режыме. Вы адмовляецеся ад API, спецыяльных для рэнтайму Bun, і прыроджаных пераваг пачатку роботы, таму гэты варыянт падходзіць для команд, якія хочуць поступова перайсці на Bun.

    Як Bun выканае TypeScript

    Файлы можна запускаць безпосередня за дапамою каманды bun, незалежна ад таго, чы ў яных JavaScript чы TypeScript: bun index.js, bun index.ts або bun --watch index.ts, каб файлы автаматычна перазапускаліся праз змены.

    Калі запускаецца файл з расширэнням .ts, транспайлер Bun на месцы адключае анотаціі типоў і робіць гэта выключна ў памяці. Ён не запісвае папку dist/, каталог .build/ чы тымчасовыя файлы .js на дыск.

    Важным застережэннем ўсё тое, што адзначэнне типаў не ёсць тым самым, чым ях перакантрольванне. Ёжчы запуск, Bun не выкарыстоўвае статычнага перакантрольвання типаў пад час выконання, таму код зі спалучэннямі типаў будзе продовжваць працаваць. Перакантрольванне типаў адбываецца ў вашым рэдагувальніку, такім як VS Code або Cursor, а таксама ў системах CI, дзе можна запусціць bunx tsc --noEmit. Цей крок у системах CI трэба вважаць обав’язковым.

    Пашаговая міграцыя існуючага проекту Node.js

    Паколькі Bun следуе API-ям Node і стандартам npm, звычайны проект можа быть перенесены з калькама змян. Выпрацавуйце це на гілцы і ў канцы запускайце весь комплект тэстаў.

    Крок 1: Адключыце старыя модулі і файлы блокавання

    Пачаткавайце з чыстага дрэва завіснасцей, каб Bun сам вырашыў усё: адмахніце папку node_modules разам з файлом блокірацыі, які выкарыстоўваў проект — будзь то package-lock.json, yarn.lock чы pnpm-lock.yaml.

    Адмахненне старога файла блокірацыі означае, што версіі зноў будуць вырашаныя на адной з дыапазонаў, указаных у package.json, таму вы можете запрацаваць новейшыя версіі, чым раней. Якщо важна абовеснай відтворымасць, пераканаўцеся, чы версія Bun можа мігруваць існуючы файл блокірацыі, і перагляньце разлік вырашаных версій.

    Шаг 2: Інсталляцыя за дапамою Bun

    Заўядзіце bun install. Bun чытае ваш package.json, завантажае пакеты і стварае файл bun.lock, які трэба зберагчыць.

    Шаг 3: Адканаўленне скрыптав у package.json

    Заменіце апавязы на node, ts-node чыста tsx у раздзеле scripts:

    • start: "bun src/index.js" заменяе "node src/index.js";
    • dev: "bun --watch src/index.ts" заменяе "ts-node-dev src/index.ts";
    • test: "bun test" заменяе "jest" чыста "vitest".

    Засоб для запуску тэстаў у вялікай меры сумесны з API Jest, але тэсты, якія сильна завісяць ад спецыфічных методаў імітавання чыста налашоўкі Jest, можаць патрабаваць корэктавання.

    Шаг 4: Змена адзначэнняў TypeScript

    Для проектаў на TypeScript заменіце адзначэнняя типаў Node на адзначэнняя Bun, запусканымі командамі bun remove @types/node чыста bun add -d @types/bun.

    Пасля чаго апдэйтуйце элемент types у compilerOptions файла tsconfig.json. У старыях інструкцыйях там упомінаецца "bun-types"; але з ныям пакетам @types/bun гэты элемент зазвычай ўтвараецца як "bun", таму пераканайцеся ў документах Bun для TypeScript, які версія вы інсталавалі.

    Шаг 5: Заменіце модулі, якія не падходзяць

    Стандартныя модулі Node, такія як node:fs, node:path і node:http, працуюць без змян. Проблемы часта выклікаюць пакеты, якія залежаць ад натыўных C++ біндынгаў, і для дзеякых з іх існуюць простыя альтэрнатывы:

    • Заменіце bcrypt на bcryptjs або @node-rs/bcrypt;
    • Заменіце sqlite3 на вбудованы модуль Bun bun:sqlite;
  • З’явіться вызовы dotenv, тамушто Bun автаматычна чытае файл .env.
  • Акцыянальна падберыце гэтыя змены. Якщо той самы код павінен працаваць у Node, напрыклад у вышэўказанай настройцы Lambda толькі для складання, застаўце dotenv або явна чытайце настройкі, каб парадакт працы не разлічваўся между рэнтаймамі.

    Галоўныя выводы

    • Галоўная перадчыннасць Bun — адзіненне: адны бінарны файл заменяе менеджар пакетаў, запускчык TypeScript, фрэймворк тэстаў і инструмент для збірання коду.
    • Яго шырокасць вырахоўвана з уважнай перарыбачэнні коду і шыранаг запуску JavaScriptCore, а не з таго, што Zig за сваёй сутнасцю быстрейшы за C++.
    • Bun адмаўляе типы TypeScript у памяці, але ніколі іх не перакантролюе, таму ў CI застаўце параметр tsc --noEmit.
    • У Lambda вы можаце выбраць між спецыяльным шаром, абразам контэйнера або збіранням коду за дапамойкай Bun і ўпрацоўкай на кераваным Node.js.
    • Міграцыя здарожае пераважна механічная, але старанная ўвага трэба зусім да перызначэння файла блакітавання, вбудованных дадаткаў і будзь-яга паведання, якое залежыць ад автаматычнага чытання файла .env.