Akademi Manajemen Informatika

Daftar Isi:

Dalam pengembangan aplikasi web, framework backend memainkan peran Krusial dalam menyediakan fondasi dan kerangka kerja yang robust Kepada membangun aplikasi yang scalable dan maintainable. Framework backend membantu developer dalam mempermudah pengelolaan data, logika aplikasi, autentikasi, dan berbagai fungsi backend lainnya yang Krusial Kepada aplikasi web yang modern.

Bun adalah runtime JavaScript all-in-one yang dibuat dengan tujuan Kepada mempercepat pengembangan aplikasi. Bun menyediakan environment development yang ringan dan Segera Kepada menjalankan Javascript dan Typescript, Membikin bundling, transpiling, dan menjalankan kode lebih efisien. Dengan dukungan yang luas Kepada API NodeJS dan kecepatan yang tinggi, Bun menjadi pilihan menarik bagi developer yang mencari runtime yang Segera dan efisien.

Baca Juga: Mengenal Bun, Runtime Javascript Segera

Ketika ini sudah tersedia banyak opsi framework backend Javascript, tetapi kebanyakan Lagi berjalan di NodeJS. Nah, pada artikel kali ini Diriku akan membahas tentang Elysia, sebuah framework backend yang berjalan di Bun. Diriku akan menjelaskan mulai dari pengenalan, Keistimewaan, hingga panduan praktis Kepada memulai proyek dengan Elysia menggunakan Bun. Langsung saja kita ke pembahasannya ya Kolega-Kolega.

Apa itu Elysia?

Elysia adalah framework backend web yang dibangun di atas Bun. Tujuan Penting dari pengembangan Elysia adalah Kepada menyediakan framework yang mudah digunakan, efisien, dan Mempunyai performa tinggi Kepada pengembangan aplikasi web modern. Elysia memanfaatkan kecepatan dan efisiensi Bun Kepada memberikan pengalaman pengembangan yang optimal.

Eksplor apa itu ElysiaJS

Situs ElysiaJS

Keistimewaan Elysia

  1. Performa Tinggi: Berkat Bun, Elysia dapat menjalankan aplikasi dengan performa yang sangat tinggi. Bun sebagai runtime yang Segera dan efisien memberikan keuntungan besar dalam hal kecepatan eksekusi kode.
  2. Mudah Digunakan: Elysia dirancang dengan developer experience yang sederhana, memudahkan pengembang Kepada memulai dan mengembangkan proyek mereka tanpa kurva belajar yang curam.
  3. Skalabilitas: Dengan desain yang modular, Elysia memungkinkan pengembang Kepada membangun aplikasi yang scalable, mendukung pertumbuhan aplikasi dari kecil hingga besar.
  4. Dukungan Typescript: Elysia mendukung Typescript secara penuh, memberikan manfaat tambahan dalam hal type safety dan pengembangan yang lebih robust.
  5. Integrasi Mulus dengan Ekosistem Javascript: Elysia dirancang Kepada bekerja dengan Berkualitas dengan berbagai library dan tools dalam ekosistem Javascript, membuatnya Luwes dan mudah diintegrasikan dengan proyek yang sudah Eksis.

Quick Start Elysia

Kepada memulai proyek dengan Elysia menggunakan Bun, ikuti langkah-langkah berikut:

Instalasi Bun

  1. Unduh dan Install Bun:

Kunjungi situs Formal Bun di Situs Formal Bun dan ikuti petunjuk instalasi sesuai dengan sistem operasi yang kalian gunakan.

curl -fsSL https://bun.sh/install | bash
  1. Pengecekan Instalasi Bun:

Setelah instalasi selesai, pastikan Bun telah terinstal dengan Betul dengan menjalankan perintah berikut di terminal:

bun --version

Membikin Proyek Elysia

  1. Inisialisasi Proyek Baru:

Buat direktori baru Kepada proyek kalian dan inisialisasi proyek dengan Bun.

mkdir elysia-project

cd elysia-project

bun init

Screenshot init bun

  1. Install Dependencies:

Install Elysia dan @elysiajs/swagger sebagai dependensi dalam proyek kalian.

bun add elysia @elysiajs/swagger
  1. Menambahkan Scripts pada package.json

Tambahkan kode di Rendah ini pada file package.json kalian.

"scripts": {
	"dev": "bun --watch src/index.ts",
	"build": "bun build src/index.ts",
	"start": "NODE_ENV=production bun src/index.ts"
},

Script diatas merujuk pada tahapan-tahapan berbeda dalam mengembangkan sebuah aplikasi:

  • dev – Memulai Elysia dalam mode development dengan reload Mekanis Ketika kode berubah.
  • build – Build aplikasi Kepada penggunaan production.
  • start – Memulai server production Elysia.
READ  Coding di visual studio code - Si Text Editor canggih

Struktur Proyek Elysia

Setelah menginisialisasi proyek, struktur direktori proyek akan terlihat seperti ini:

elysia-project/
	├── node_modules/
	├── src/
	│ └── index.ts
	├── .gitignore
	├── bun.lockb
	├── package.json
	├── README.md
	└── tsconfig.json
  • node_modules/: Direktori ini berisi dependensi proyek.
  • src/: Direktori ini berisi kode sumber aplikasi.
  • index.ts: File Penting aplikasi tempat kita akan menulis kode backend menggunakan Elysia.
  • .gitignore: File ini berisi daftar file dan direktori yang harus diabaikan oleh Git.
  • bun.lockb: File ini digunakan oleh Bun Kepada mengelola dependensi.
  • package.json: File ini berisi informasi proyek dan dependensi.
  • README.md: File ini berisi dokumentasi proyek.
  • tsconfig.json: File ini berisi konfigurasi Typescript.

Hands-on Membikin REST API Sederhana dengan Elysia

Sekarang, kita akan Membikin REST API sederhana menggunakan Elysia. Disini Diriku akan menggunakan bahasa Typescript dan studi kasus yang akan kita gunakan adalah API CRUD (Create, Read, Update, Delete) Kepada mengelola kontak.
Berikut merupakan langkah-langkahnya:

Membikin API CRUD Kontak

  1. Definisikan types

Buat file types.d.ts pada root project dan tambahkan type Kepada kontak.

type Contact {
	id: number;
	name: string;
	email: string;
}
  1. Buat file db.ts di folder src

File ini akan berperan sebagai pusat operasi CRUD dari API kontak. Tambahkan kode di Rendah ini pada file db.ts.

const contacts: Contact[] = [];
let nextId = 1;

export class ContactDB {
    async getContacts(): PromiseContact[]> {
        return contacts;
    }

    async getContact(id: number): PromiseContact | undefined> {
        return contacts.find(c => c.id === id);
    }

    async addContact(contact: OmitContact, 'id'>): PromiseContact> {
        const newContact = { ...contact, id: nextId++ };
        contacts.push(newContact);

        return newContact;
    }

    async updateContact(id: number, updatedContact: OmitContact, 'id'>): Promisestring | undefined> {
        const contactIndex = contacts.findIndex(c => c.id === id);
        if (contactIndex !== -1) {
            contacts[contactIndex] = { ...updatedContact, id };

            return "success";
        } else {
            return undefined;
        }
    }

    async removeContact(id: number): Promisestring | undefined> {
        const contactIndex = contacts.findIndex(c => c.id === id);
        if (contactIndex !== -1) {
            contacts.splice(contactIndex, 1);

            return "success";
        } else {
            return undefined;
        }
    }
}
  1. ** Buat plugin instance contactApi pada file index.ts**

Buat plugin instance contactApi pada file index.ts Kepada mengelompokkan route dengan prefix /api.

..
import { Elysia } from 'elysia';
..
const contactApi = new Elysia({ prefix: '/api' })
...
  1. Endpoint Kepada Menambah Kontak

Tambahkan endpoint Kepada menambah kontak baru pada contactApi.

...
import { ContactDB } from './db';
...
.post(
        "/contacts",
        async ({ db, body }: { db: ContactDB, body: Contact }) => {
            const id = (await db.addContact(body)).id

            return { success: true, message: `Contact ${id} added` };
        },
        {
            detail: {
                summary: 'Add contact',
                description: 'Add contact to the database',
                requestBody: {
                    content: {
                        'application/json': {
                            schema: {
                                type: 'object',
                                properties: {
                                    name: { type: 'string' },
                                    email: { type: 'string' }
                                },
                                example: {
                                    name: 'Wahyu',
                                    email: '[email protected]'
                                },
                                required: ['name', 'email']
                            }
                        }
                    }
                },
                responses: {
                    200: {
                        description: 'Success',
                        content: {
                            'application/json': {
                                schema: {
                                    type: 'object',
                                    properties: {
                                        success: {
                                            type: 'boolean',
                                            example: true
                                        },
                                        message: {
                                            type: 'string',
                                            example: 'Contact 1 added'
                                        }
                                    },
                                    required: ['success', 'message']
                                }
                            }
                        }
                    },
                    400: {
                        description: 'Bad Request',
                        content: {
                            'application/json': {
                                schema: {
                                    type: 'object',
                                    properties: {
                                        success: {
                                            type: 'boolean',
                                            example: false
                                        },
                                        message: {
                                            type: 'string',
                                            example: 'Invalid request'
                                        }
                                    },
                                    required: ['success', 'message']
                                }
                            }
                        }
                    }
                }
            }
        }
    )
    ...
  1. Endpoint Kepada Mendapatkan Sekalian Kontak
READ  7 Manfaat belajar coding (Mulai di 2024 ini!)

Tambahkan endpoint Kepada mendapatkan list Sekalian kontak pada contactApi.

...
.get('/contacts',
        async ({ db }: { db: ContactDB }) => {
            const contacts = await db.getContacts();
            return {
                success: true,
                data: contacts
            };
        },
        {
            detail: {
                summary: 'Get contacts',
                description: 'Get all contacts from the database',
                responses: {
                    200: {
                        description: 'Success',
                        content: {
                            'application/json': {
                                schema: {
                                    type: 'object',
                                    properties: {
                                        success: {
                                            type: 'boolean'
                                        },
                                        data: {
                                            type: 'array',
                                            items: {
                                                $ref: '#/components/schemas/Contact'
                                            },
                                            example: [{
                                                id: 1,
                                                name: 'Wahyu',
                                                email: '[email protected]'
                                            }]
                                        }
                                    },
                                    required: ['success', 'data']
                                }
                            }
                        }
                    }
                }
            }
        }
    )
    ...
  1. Endpoint Kepada Mendapatkan Kontak Berdasarkan ID

Tambahkan endpoint Kepada mendapatkan kontak berdasarkan ID pada contactApi.

...
.get('/contacts/:id',
        async ({ db, params }: { db: ContactDB, params: { id: string } }) => {
            const id = parseInt(params.id);
            if (id === undefined) {
                return { success: false, message: 'Invalid request' };
            }

            const contact = await db.getContact(id);
            if (contact === undefined) {
                return { success: false, message: 'Not found' };
            }

            return { success: true, data: contact };
        },
        {
            detail: {
                summary: 'Get contact by ID',
                description: 'Get contact from the database by ID',
                parameters: [
                    {
                        name: 'id',
                        in: 'path',
                        description: 'Contact ID',
                        required: true,
                        schema: {
                            type: 'number'
                        }
                    }
                ],
                responses: {
                    200: {
                        description: 'Success',
                        content: {
                            'application/json': {
                                schema: {
                                    type: 'object',
                                    properties: {
                                        success: {
                                            type: 'boolean'
                                        },
                                        data: {
                                            type: 'object',
                                            properties: {
                                                id: {
                                                    type: 'number'
                                                },
                                                name: {
                                                    type: 'string'
                                                },
                                                email: {
                                                    type: 'string'
                                                }
                                            },
                                            example: {
                                                id: 1,
                                                name: 'Wahyu',
                                                email: '[email protected]'
                                            },
                                            required: ['id', 'name', 'email']
                                        }
                                    },
                                    required: ['success', 'data']
                                }
                            }
                        }
                    },
                    404: {
                        description: 'Not Found',
                        content: {
                            'application/json': {
                                schema: {
                                    type: 'object',
                                    properties: {
                                        success: {
                                            type: 'boolean',
                                            example: false
                                        },
                                        message: {
                                            type: 'string',
                                            example: 'Contact not found'
                                        }
                                    },
                                    required: ['success', 'message']
                                }
                            }
                        }
                    }
                }
            }
        }
    )
    ...
  1. Endpoint Kepada Mengupdate Kontak

Tambahkan endpoint Kepada mengupdate kontak berdasarkan ID pada contactApi.

...
.put(
        "/contacts/:id",
        async ({ db, params, body }: { db: ContactDB, params: { id: string }, body: Contact }) => {
            const id = parseInt(params.id);
            if (id === undefined) {
                return { success: false, message: 'Invalid request' };
            }

            const contact = await db.updateContact(id, body);
            if (contact === undefined) {
                return { success: false, message: 'Not found' };
            }

            return { success: true, message: `Contact ${id} updated` };
        },
        {
            detail: {
                summary: 'Update contact',
                description: 'Update contact in the database',
                parameters: [
                    {
                        name: 'id',
                        in: 'path',
                        description: 'Contact ID',
                        required: true,
                        schema: {
                            type: 'number'
                        }
                    }
                ],
                requestBody: {
                    content: {
                        'application/json': {
                            schema: {
                                type: 'object',
                                properties: {
                                    name: { type: 'string' },
                                    email: { type: 'string' }
                                },
                                example: {
                                    name: 'Wahyu Ivan',
                                    email: '[email protected]'
                                },
                                required: ['name', 'email']
                            }
                        }
                    }
                },
                responses: {
                    200: {
                        description: 'Success',
                        content: {
                            'application/json': {
                                schema: {
                                    type: 'object',
                                    properties: {
                                        success: {
                                            type: 'boolean',
                                            example: true
                                        },
                                        message: {
                                            type: 'string',
                                            example: 'Contact 1 updated'
                                        }
                                    },
                                    required: ['success', 'message']
                                }
                            }
                        }
                    },
                    400: {
                        description: 'Bad Request',
                        content: {
                            'application/json': {
                                schema: {
                                    type: 'object',
                                    properties: {
                                        success: {
                                            type: 'boolean',
                                            example: false
                                        },
                                        message: {
                                            type: 'string',
                                            example: 'Invalid request'
                                        }
                                    },
                                    required: ['success', 'message']
                                }
                            }
                        }
                    },
                    404: {
                        description: 'Not Found',
                        content: {
                            'application/json': {
                                schema: {
                                    type: 'object',
                                    properties: {
                                        success: {
                                            type: 'boolean',
                                            example: false
                                        },
                                        message: {
                                            type: 'string',
                                            example: 'Contact not found'
                                        }
                                    },
                                    required: ['success', 'message']
                                }
                            }
                        }
                    }
                }
            }
        }
    )
  1. Endpoint Kepada Menghapus Kontak
READ  Belajar Metode Kepada Membikin website dari dasar / Kosong

Tambahkan endpoint Kepada menghapus kontak berdasarkan ID pada contactApi.

...
.delete(
        "/contacts/:id",
        async ({ db, params }: { db: ContactDB, params: { id: string } }) => {
            const id = parseInt(params.id);
            if (id === undefined) {
                return { success: false, message: 'Invalid request' };
            }

            const contact = await db.removeContact(id);
            if (contact === undefined) {
                return { success: false, message: 'Not found' };
            }

            return { success: true, message: `Contact ${id} removed` };
        },
        {
            detail: {
                summary: 'Remove contact',
                description: 'Remove contact from the database',
                parameters: [
                    {
                        name: 'id',
                        in: 'path',
                        description: 'Contact ID',
                        required: true,
                        schema: {
                            type: 'number'
                        }
                    }
                ],
                responses: {
                    200: {
                        description: 'Success',
                        content: {
                            'application/json': {
                                schema: {
                                    type: 'object',
                                    properties: {
                                        success: {
                                            type: 'boolean',
                                            example: true
                                        },
                                        message: {
                                            type: 'string',
                                            example: 'Contact 1 removed'
                                        }
                                    },
                                    required: ['success', 'message']
                                }
                            }
                        }
                    },
                    404: {
                        description: 'Not Found',
                        content: {
                            'application/json': {
                                schema: {
                                    type: 'object',
                                    properties: {
                                        success: {
                                            type: 'boolean',
                                            example: false
                                        },
                                        message: {
                                            type: 'string',
                                            example: 'Contact not found'
                                        }
                                    },
                                    required: ['success', 'message']
                                }
                            }
                        }
                    }
                }
            }
        }
    );
  1. Buat instance Elysia baru

Buat instance Elysia baru dan tambahkan plugin contactApi, Swagger dan property ContactDB pada file index.ts. Swagger disini adalah sebuah open-source project yang memungkinkan kita Kepada Membikin dokumentasi API dengan mudah. Setalah itu, set server agar berjalan pada port 3000.

...
import { swagger } from '@elysiajs/swagger'
...
new Elysia()
    .use(swagger({
        documentation: {
            info: {
                title: 'Contact API',
                version: '1.0.0',
                description: 'Contact API project. Developed using Elysia framework, bun, and TypeScript.'
            }
        }
    }))
    .use(contactApi)
    .decorate('db', new ContactDB())
    .listen(3000);
  1. Menjalankan Server:

Kepada menjalankan server, gunakan perintah berikut di terminal:

bun dev

Server akan berjalan di http://localhost:3000 dan kalian sudah Bisa mengakses API yang telah dibuat. Kepada Menonton dokumentasi API dengan Swagger, akses endpoint /swagger.
Screenshot Swagger

Kepada Menonton project dan source code secara penuh: Link Github Proyek

Penutup

Elysia menawarkan solusi modern Kepada pengembangan backend web dengan memanfaatkan kekuatan dan kecepatan Bun sebagai fondasinya. Dengan kemudahan integrasi dan dukungan penuh Kepada Typescript, Elysia memberikan pengalaman development yang Segera dan efisien. Semoga artikel ini membantu kalian dalam memulai dan mengembangkan API menggunakan Elysia dan Bun. Selamat mencoba!