DEV Community

Ayus Irfang Filaras
Ayus Irfang Filaras

Posted on • Edited on

Optimasi NextJS dengan Aidomx React

Menata Ulang UI React dengan Pendekatan Deklaratif dan Terkontrol

Latar Belakang

Dalam proyek React berskala menengah hingga besar, pengelolaan komponen dan logika UI sering kali menjadi tantangan. Komponen UI tersebar di banyak file, logika bisnis tercampur dengan tampilan, dan perubahan kecil di satu bagian dapat berdampak besar pada keseluruhan aplikasi.

Masalah ini memunculkan kebutuhan akan sistem yang:

  • Memisahkan logika dan tampilan,
  • Dapat dikontrol secara terpusat,
  • Mendukung struktur UI yang dinamis,
  • Mudah untuk diuji dan dikembangkan lebih lanjut.

Apa itu Aidomx?

Aidomx adalah sistem berbasis rules yang memungkinkan kamu merender UI React secara deklaratif dan terpusat. Sistem ini dibagi menjadi dua bagian utama:

  • @aidomx/core: Mengelola virtual elements, komposisi logic, dan struktur berbasis identitas.
  • @aidomx/react: Bertugas sebagai integrasi React dan perender komponen berdasarkan rules dari core.

Dengan pendekatan ini, UI tidak lagi ditulis sebagai JSX biasa, melainkan dibentuk dari konfigurasi objek (rules) yang bisa didefinisikan, diubah, dan bahkan dienkripsi jika diperlukan.

Fitur Utama

  • UI berbasis aturan (rules-driven)
  • Pemisahan logika dan presentasi
  • Dukungan penuh untuk tema, skeleton, dan komposisi dinamis
  • Deklaratif dan mudah dikontrol
  • Performant, bahkan mengungguli rendering statis Next.js dalam beberapa kasus

Contoh Implementasi Sederhana

// rules/index.ts
import { defineRules } from '@aidomx/core'

export const rules = defineRules({
  root: 'container',
  components: [],
})
Enter fullscreen mode Exit fullscreen mode
// rules/welcome.ts
import type { RuleComponent } from '@aidomx/core'

const welcome: RuleComponent[] = [
  {
    name: 'title',
    design: {
    type: 'h1',
      className: 'text-xl font-bold',
      content: 'Welcome to Aidomx!',
    },
  },
]

export default welcome
Enter fullscreen mode Exit fullscreen mode

Untuk menerapkan rules, buat file :

// app/providers.tsx
"use client"

import { AidomxProvider } from '@aidomx/react'
import { rules } from '../rules'
import { ReactNode } from 'react'

export function Providers({ children }: { children: ReactNode }) {
  return (
    <AidomxProvider value={rules}>
      {children}
    </AidomxProvider>
  )
}
Enter fullscreen mode Exit fullscreen mode

Dan atur layout.tsxseperti berikut :

import type { Metadata } from 'next'
import { Geist, Geist_Mono } from 'next/font/google'
import './globals.css'
import { Providers } from './providers'

const geistSans = Geist({
  variable: '--font-geist-sans',
  subsets: ['latin'],
})

const geistMono = Geist_Mono({
  variable: '--font-geist-mono',
  subsets: ['latin'],
})

export const metadata: Metadata = {
  title: 'Create Next App',
  description: 'Generated by create next app',
}

export default function RootLayout({
  children,
}: Readonly<{
  children: React.ReactNode
}>) {
  return (
    <html lang="en">
      <body
        className={`${geistSans.variable} ${geistMono.variable} antialiased`}
      >
        <Providers>{children}</Providers>
      </body>
    </html>
  )
}
Enter fullscreen mode Exit fullscreen mode

Untuk melihat hasilnya, kita perlu membuat file Home.tsx seperti berikut :

// app/Home.tsx
'use client'

import { Aidomx } from '@aidomx/react'
import { useEffect, useRef, useState } from 'react'
import welcome from '../rules/welcome'

export default function Home() {
  const start = useRef(performance.now())
  const [renderTime, setRenderTime] = useState('')
  const [interactTime, setInteractTime] = useState('')
  const [mounted, setMounted] = useState(false)

  useEffect(() => {
    const end = performance.now()
    setRenderTime((end - start.current).toFixed(2) + 'ms')

    const interactStart = performance.now()
    const interactEnd = performance.now()
    setInteractTime((interactEnd - interactStart).toFixed(2) + 'ms')

    setMounted(true)
  }, [])

  if (!mounted) return <>Loading...</>

  return (
    <div className="p-6">
      <div className="mb-4 text-gray-500">
        <div>Waktu render: {renderTime}</div>
        <div>Waktu interaksi: {interactTime}</div>
      </div>
      <Aidomx name="container" scope={{ welcome }} />
    </div>
  )
}
Enter fullscreen mode Exit fullscreen mode

Dan atur page.tsx seperti berikut :

// app/page.tsx
import Home from './Home'

export default async function Page() {
  return <Home />
}
Enter fullscreen mode Exit fullscreen mode

Manfaat Aidomx

  • Konsistensi: Semua elemen UI dikontrol dari satu sumber aturan.

  • Adaptif: Perubahan UI dapat dikontrol berdasarkan identitas pengguna, lingkungan, atau kondisi lain.

  • Testability: Karena UI didefinisikan sebagai data, mudah diuji tanpa perlu merender DOM.

  • Enkripsi: Data sensitif di dalam komponen bisa dienkripsi dan didekripsi secara aman.

Kesimpulan

Aidomx lahir dari kebutuhan nyata untuk mengelola kompleksitas UI modern dengan cara yang terstruktur, modular, dan efisien. Dengan memisahkan logika dan tampilan, serta mendukung pendekatan deklaratif, Aidomx memberikan fondasi yang kuat untuk membangun antarmuka dinamis yang terkontrol penuh—tanpa mengorbankan performa atau fleksibilitas.

Repository github : @aidomx/react

Neon image

Set up a Neon project in seconds and connect from a Next.js application

If you're starting a new project, Neon has got your databases covered. No credit cards. No trials. No getting in your way.

Get started →

Top comments (0)

👋 Kindness is contagious

Dive into this insightful write-up, celebrated within the collaborative DEV Community. Developers at any stage are invited to contribute and elevate our shared skills.

A simple "thank you" can boost someone’s spirits—leave your kudos in the comments!

On DEV, exchanging ideas fuels progress and deepens our connections. If this post helped you, a brief note of thanks goes a long way.

Okay