[[:oktatas:web:express|< Express]]
====== Express - TypeScript ESBuild ======
* **Szerző:** Sallai András
* Copyright (c) 2024, Sallai András
* Szerkesztve: 2025
* Licenc: [[https://creativecommons.org/licenses/by-sa/4.0/|CC Attribution-Share Alike 4.0 International]]
* Web: https://szit.hu
===== Bevezetés =====
Ha "production" alkalmazást szeretnénk egyetlen, tömörített fájlba összerakni (bundle),
az ESBuild jó választás.
A TypseScript egy népszerű kiegészítése a JavaScript nyelvnek, használata
könnyebbé teheti a fejlesztés folyamatát.
Az ESBuild pedig a leggyorsabb build eszköz manapság, amit Go nyelven írtak.
Ebben a leírásban a TypeScript nyelven írt kódot az ESBuild eszközzel fordítjuk,
a teljes fejlesztéis folyamatban. Megnézzük, hogyan kell összeállítani egy ilyen projektet.
Egy projekt hordozása során problémát jelenthet, az ESBuild használata, mivel
Go nyelven íródott, natív kódként fut a node_modules könyvtárban. A probléma
akkor fordulhat elő, ha a projektet a **node_modules** könyvtárral együtt
visszük egy másik operációs rendszerre.
Ha a hordozás során node_modules könyvtár ki van zárva, nem lesz probléma.
Ha Git verzió követőt használunk, ez általában így szokott lenni, a
.gitignore fájlba be kerül a node_modules/ könyvtár. A másik gépen pedig telepítjük a
függőségeket, így nem fordul elő ez a probléma.
npm install
===== Ajánlott könyvtárszerkezet =====
app01/
|-src/
| `-index.ts
|-package.json
`-README.md
A projekt használata során automatikusan generálódik app, node_modules és a dist könyvtár.
===== package.json modulok beállítása =====
A "type" tulajdonságot állítsuk ESM-re vagyis "module" értékre:
{
"type": "module"
}
===== Függőségek =====
{
"devDependencies": {
"@types/express": "^5.0.0",
"@types/node": "^22.10.3",
"esbuild": "^0.24.2",
"typescript": "^5.7.2"
},
"dependencies": {
"express": "^4.21.2",
"nodemon": "^3.1.9"
},
}
===== Feladatok =====
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "nodemon app --watch app",
"dev": "node dev.js",
"build": "node build.js"
},
===== ESBuild scriptek =====
A fejlesztési folyamathoz:
import * as esbuild from 'esbuild';
(async () => {
let ctx = await esbuild.context({
entryPoints: ['src/**/*.ts'],
outdir: 'app',
bundle: true,
platform: 'node',
format: 'esm',
packages: 'external',
});
await ctx.watch();
})();
A kész termék elkészítéséhez, vagyis a build folyamathoz:
import * as esbuild from 'esbuild';
(async () => {
let ctx = await esbuild.build({
entryPoints: ['src/**/*.ts'],
outdir: 'dist',
bundle: true,
minify: true,
platform: 'node',
format: 'esm',
packages: 'external',
});
})();
===== Forrás és cél =====
* Az alkalmazást TypeScript nyelven az src könyvtárban írjuk.
* Az alkalmazást fejlesztési időben az app könyvtárból futtatjuk.
A TypeScript nyelven használhatunk ES modulokat, azaz "import" utasításokkal dolgozunk.
Az app könyvtárban a lefordított kód ESM formába fordul.
===== Teszt projekt állományai =====
{
"name": "app01",
"version": "0.0.1",
"description": "A project created by the Sinto command",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "nodemon app --watch app",
"dev": "node dev.js",
"build": "node build.js"
},
"devDependencies": {
"@types/express": "^5.0.0",
"@types/node": "^22.10.3",
"esbuild": "^0.24.2",
"typescript": "^5.7.2"
},
"dependencies": {
"express": "^4.21.2",
"nodemon": "^3.1.9"
},
"type": "module"
}
import express, { Request, Response } from 'express';
const app = express();
const PORT = 8000;
app.get('/', (req: Request, res: Response) => {
res.send('Helló Világ!');
});
app.listen(PORT, () => {
console.log(`Server is listening: ${PORT}`);
});
===== Fejlesztési folyamat =====
Indítsuk el az esbuild-t, majd a nodemon segítségével futtassuk az app könyvtárból az alkalmazást.
npm run dev
npm start
===== Következtetés =====
Az ESBuild remek választás ha szeretnénk "production" kódot egyetlen fájlban, tömörítve használni.
Azonban, nem kötelező fejlesztés teljes folyamata során is használni. A fejlesztést során fordíthatjuk a TypesCript kódot ts-node vagy tsc parancsokkal, az ESBuild eszközt pedig csak a build folyamat során futtatjuk.