Episode ini membedah arsitektur inti Vue 3: sistem reaktivitas berbasis Proxy, pipeline template compilation, siklus hidup komponen, anatomy Single File Component, serta cara application instance di-mount dan plugin terdaftar.

Episode 1 menjelaskan mengapa Vue ada. Episode 2 menjawab bagaimana Vue bekerja. Sebelum kalian menulis komponen demi komponen, pahami mesin di baliknya: bagaimana data menjadi reaktif, bagaimana template menjadi DOM, dan bagaimana sebuah komponen lahir lalu mati.
Episode ini membedah arsitektur utama Vue 3 dari tiga lapisan: sistem reactivity berbasis Proxy, pipeline compilation dari template ke Virtual DOM, dan component lifecycle. Terakhir kita bedah anatomy Single File Component dan cara aplikasi di-mount beserta plugin. Ini adalah episode yang paling teknis di fase pertama — tahan dulu, karena semua konsep di sini akan kalian rasakan langsung mulai episode 3.
Di Vue 3, reaktivitas dibangun di atas Proxy JavaScript. Saat kalian memanggil reactive({...}) atau ref(0), Vue membungkus object dengan Proxy yang mencegat pembacaan dan penulisan properti:
import { reactive, effect } from "vue";
const state = reactive({ count: 0 });
effect(() => {
console.log("count sekarang", state.count);
});Saat effect dijalankan, ia membaca state.count, dan Proxy mencatat bahwa efek tersebut bergantung pada properti itu. Ketika suatu saat properti diubah, Proxy memberi tahu efek untuk dijalankan ulang. Inilah dependency tracking: setiap efek tahu data apa yang dia butuhkan.
Dua API utama reaktivitas:
ref(0) membungkus nilai primitif; akses lewat .value.reactive({...}) membungkus object; akses langsung tanpa .value.const jumlah = ref(0);
const user = reactive({ nama: "Arman" });
jumlah.value = 1;
user.nama = "Budi";jumlah.value = 1 mengubah nilai ref, sedangkan user.nama = "Budi" mengubah properti object reaktif. Di template, .value pada ref otomatis di-unwrap sehingga kalian cukup menulis {{ jumlah }}.
Tip
Ref mempertahankan reaktivitas bahkan saat di-destructure atau diteruskan ke fungsi, karena nilainya selalu diakses lewat .value. Object reaktif akan kehilangan reaktivitas jika di-destructure — gunakan toRefs untuk mempertahankannya.
Template Vue tidak dibaca langsung oleh browser. Alurnya:
template -> render function -> virtual dom -> patch -> dom nyataIni membuat pengembangan tetap deklaratif (kalian menulis template), sementara performa dijaga karena hanya perbedaan yang disentuh di DOM.
Di project Vite, kompilasi template terjadi saat build melalui plugin Vue, sehingga bundle yang dikirim ke browser berisi fungsi render — bukan template mentah. Ini menjawab kenapa aplikasi Vue tidak memerlukan compiler di production: kompilasi sudah dilakukan di waktu build.
Setiap komponen melewati fase-fase berikut:
import { onMounted, onUpdated, onUnmounted } from "vue";
onMounted(() => {
console.log("komponen dipasang ke DOM");
});
onUpdated(() => {
console.log("komponen diperbarui");
});
onUnmounted(() => {
console.log("komponen dilepas");
});Urutannya: setup berjalan paling awal, lalu komponen di-mount (pernah onMounted), diperbarui setiap ada perubahan data (pernah onUpdated), dan akhirnya dilepas (onUnmounted). Di onMounted kalian biasanya mengambil data atau memulai interval; di onUnmounted kalian membersihkannya.
Single File Component (SFC) mengemas struktur, perilaku, dan tampilan satu komponen dalam satu file:
<script setup>
import { ref } from "vue";
const nama = ref("Dunia");
</script>
<template>
<h1>Halo, {{ nama }}</h1>
</template>
<style scoped>
h1 {
color: #42b883;
}
</style>Tiga blok utama: <script setup> untuk logika dengan composition API, <template> untuk markup, dan <style scoped> untuk CSS yang hanya berlaku di komponen ini. scoped bekerja dengan menambahkan atribut unik ke setiap elemen saat kompilasi, mencegah style bertabrakan antar komponen.
Antarmuka komponen terdiri dari tiga arah komunikasi:
<script setup>
const props = defineProps({ judul: String });
const emit = defineEmits(["klik"]);
</script>
<template>
<button @click="emit('klik')">{{ props.judul }}</button>
</template>defineProps dan defineEmits adalah macro kompilator — kalian cukup deklarasi, dan kompilator mengekstraknya secara otomatis. Detail lengkap komunikasi antar komponen akan kita bedah di episode 6.
Sebuah aplikasi Vue dimulai dari satu root component yang di-mount ke elemen DOM:
import { createApp } from "vue";
import App from "./App.vue";
import { createPinia } from "pinia";
const app = createApp(App);
app.use(createPinia());
app.mount("#app");createApp(App) membuat application instance, app.use(createPinia()) mendaftarkan plugin Pinia, dan app.mount("#app") memasang aplikasi ke elemen dengan id app. Plugin adalah mekanisme untuk menambahkan kemampuan global — seperti routing, state management, atau i18n — tanpa mengubah kode aplikasi.
Episode 2 membedah mesin Vue dari dalam: sistem reaktivitas berbasis Proxy dengan dependency tracking, pipeline template yang dikompilasi menjadi Virtual DOM, siklus hidup komponen yang terukur, dan anatomy SFC dengan <script setup>, template, serta scoped style.
Inti yang harus dibawa pulang:
Proxy dan dependency tracking.ref untuk nilai primitif, reactive untuk object.createApp, plugin didaftarkan dengan app.use.Di episode 3 selanjutnya kita akan memulai proyek Vue sungguhan — struktur folder src/components dan src/views, cara kerja dev server dan hot module replacement, serta konfigurasi ESLint, Prettier, dan lint-staged untuk menjaga kualitas kode sejak hari pertama.