Cara Menggunakan Vue.js Tanpa NPM di Proyek Legacy
Tahukah Kamu bahwa Vue.js bisa digunakan langsung di halaman web tanpa proses build dan npm? Ya, Vue.js dapat diintegrasikan seperti jQuery yang selama ini Kamu gunakan!
Mengapa Menggunakan Vue.js dari CDN?
Jika Kamu memiliki website legacy yang masih menggunakan jQuery dan ingin menambah fitur modern tanpa harus mengubah seluruh kode sumber, Kamu bisa mencoba cara mudah berikut untuk mengintegrasikan Vue.js melalui CDN.
Keuntungan Menggunakan Vue.js via CDN
- ✅ Tidak perlu setup build tools (webpack, vite, dll)
- ✅ Tidak perlu install npm packages
- ✅ Mudah diintegrasikan ke website lama
- ✅ Tetap mendapat developer experience modern
- ✅ Tidak perlu rewrite seluruh kode aplikasi
Tutorial: Menambahkan Vue.js ke Website Legacy
Berikut adalah langkah-langkah lengkap untuk mengintegrasikan Vue.js ke halaman web Kamu:
1. Tambahkan CDN Vue.js ke Tag <head> HTML
Pertama, tambahkan link CDN Vue.js ke bagian <head> pada file HTML Kamu:
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Vue.js CDN Example</title>
<!-- Tambahkan Vue.js dari CDN -->
<script src="https://cdn.jsdelivr.net/npm/vue@3/dist/vue.global.js"></script>
</head>
<body>
<!-- Konten HTML Kamu -->
</body>
</html>
Pilihan CDN Vue.js:
- Vue 3:
https://cdn.jsdelivr.net/npm/vue@3/dist/vue.global.js - Vue 2:
https://cdn.jsdelivr.net/npm/vue@2 - Unpkg:
https://unpkg.com/vue@3/dist/vue.global.js
2. Tentukan Elemen Root untuk Vue.js
Pilih elemen pada halaman (misalnya <div id="app">) yang akan menjadi root aplikasi Vue. Ini adalah area di mana Vue.js akan mengelola konten dan interaktivitas:
<body>
<div id="app">
<h1>{{ message }}</h1>
<button @click="updateMessage">Klik Saya!</button>
</div>
</body>
3. Tulis Script Vue.js
Tambahkan kode JavaScript Vue.js sebelum tag penutup </body>:
Untuk Vue 3:
<script>
const { createApp } = Vue;
createApp({
data() {
return {
message: 'Halo dari Vue.js 3!'
}
},
methods: {
updateMessage() {
this.message = 'Pesan telah diubah!';
}
}
}).mount('#app');
</script>
Untuk Vue 2:
<script>
new Vue({
el: '#app',
data: {
message: 'Halo dari Vue.js 2!'
},
methods: {
updateMessage() {
this.message = 'Pesan telah diubah!';
}
}
});
</script>
Contoh Lengkap: To-Do List Sederhana
Berikut contoh lengkap implementasi To-Do List menggunakan Vue.js dari CDN:
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Vue.js To-Do List</title>
<script src="https://cdn.jsdelivr.net/npm/vue@3/dist/vue.global.js"></script>
<style>
body {
font-family: Arial, sans-serif;
max-width: 600px;
margin: 50px auto;
padding: 20px;
}
.todo-item {
padding: 10px;
margin: 5px 0;
background: #f4f4f4;
border-radius: 5px;
display: flex;
justify-content: space-between;
align-items: center;
}
.completed {
text-decoration: line-through;
opacity: 0.6;
}
button {
padding: 5px 10px;
cursor: pointer;
}
input[type="text"] {
padding: 8px;
width: 80%;
margin-right: 10px;
}
</style>
</head>
<body>
<div id="app">
<h1>{{ title }}</h1>
<div>
<input
v-model="newTodo"
@keyup.enter="addTodo"
type="text"
placeholder="Tambahkan tugas baru...">
<button @click="addTodo">Tambah</button>
</div>
<div v-if="todos.length === 0" style="margin-top: 20px;">
<p>Tidak ada tugas. Tambahkan tugas pertama Kamu!</p>
</div>
<div v-else>
<div
v-for="(todo, index) in todos"
:key="index"
class="todo-item"
:class="{ completed: todo.done }">
<span @click="toggleTodo(index)">
{{ todo.text }}
</span>
<button @click="removeTodo(index)">Hapus</button>
</div>
</div>
<p style="margin-top: 20px;">
Total: {{ todos.length }} tugas |
Selesai: {{ completedCount }} |
Belum: {{ remainingCount }}
</p>
</div>
<script>
const { createApp } = Vue;
createApp({
data() {
return {
title: 'Daftar Tugas Saya',
newTodo: '',
todos: []
}
},
computed: {
completedCount() {
return this.todos.filter(todo => todo.done).length;
},
remainingCount() {
return this.todos.filter(todo => !todo.done).length;
}
},
methods: {
addTodo() {
if (this.newTodo.trim()) {
this.todos.push({
text: this.newTodo,
done: false
});
this.newTodo = '';
}
},
removeTodo(index) {
this.todos.splice(index, 1);
},
toggleTodo(index) {
this.todos[index].done = !this.todos[index].done;
}
}
}).mount('#app');
</script>
</body>
</html>
Integrasi dengan jQuery yang Sudah Ada
Kamu bisa menggunakan Vue.js dan jQuery bersamaan dalam satu halaman:
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<title>Vue.js + jQuery</title>
<!-- jQuery -->
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<!-- Vue.js -->
<script src="https://cdn.jsdelivr.net/npm/vue@3/dist/vue.global.js"></script>
</head>
<body>
<!-- Area jQuery -->
<div id="jquery-section">
<h2>Bagian jQuery</h2>
<button id="jquery-btn">Klik dengan jQuery</button>
<p id="jquery-output"></p>
</div>
<!-- Area Vue.js -->
<div id="app">
<h2>Bagian Vue.js</h2>
<button @click="count++">Klik dengan Vue: {{ count }}</button>
</div>
<script>
// jQuery code
$('#jquery-btn').click(function() {
$('#jquery-output').text('jQuery berfungsi!');
});
// Vue.js code
const { createApp } = Vue;
createApp({
data() {
return {
count: 0
}
}
}).mount('#app');
</script>
</body>
</html>
Kapan Sebaiknya Menggunakan Vue.js via CDN?
✅ Gunakan CDN Jika:
- Website legacy yang sulit diubah total
- Proyek kecil atau prototipe cepat
- Tidak butuh build tools dan toolchain modern
- Ingin menambah fitur interaktif tanpa migrasi besar
- Pembelajaran dan eksperimen Vue.js
❌ Jangan Gunakan CDN Jika:
- Proyek baru yang dibangun dari awal
- Aplikasi besar dengan banyak komponen
- Butuh optimasi performa maksimal
- Perlu Single File Components (.vue files)
- Memerlukan TypeScript dan modern tooling
Best Practices Vue.js CDN
1. Gunakan Versi Produksi
Untuk production, gunakan versi minified:
<!-- Development (dengan warning) -->
<script src="https://cdn.jsdelivr.net/npm/vue@3/dist/vue.global.js"></script>
<!-- Production (optimized) -->
<script src="https://cdn.jsdelivr.net/npm/vue@3/dist/vue.global.prod.js"></script>
2. Tentukan Versi Spesifik
Jangan gunakan @latest, tetapi tentukan versi spesifik:
<!-- ❌ Tidak disarankan -->
<script src="https://cdn.jsdelivr.net/npm/vue@latest"></script>
<!-- ✅ Disarankan -->
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.global.prod.js"></script>
3. Gunakan SRI (Subresource Integrity)
Untuk keamanan, tambahkan integrity hash:
<script
src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.global.prod.js"
integrity="sha384-..."
crossorigin="anonymous">
</script>
4. Pertimbangkan Caching
Gunakan CDN yang populer agar browser bisa memanfaatkan cache:
- jsDelivr:
https://cdn.jsdelivr.net/npm/vue@3 - unpkg:
https://unpkg.com/vue@3 - cdnjs:
https://cdnjs.cloudflare.com/ajax/libs/vue/3.4.15/vue.global.prod.min.js
Migrasi dari jQuery ke Vue.js
Jika Kamu ingin mulai migrasi dari jQuery ke Vue.js secara bertahap:
jQuery Code:
// jQuery
$('#button').click(function() {
$('#output').text('Hello World');
$('#output').addClass('active');
});
Vue.js Equivalent:
<div id="app">
<button @click="updateText">Klik</button>
<p :class="{ active: isActive }">{{ message }}</p>
</div>
<script>
const { createApp } = Vue;
createApp({
data() {
return {
message: '',
isActive: false
}
},
methods: {
updateText() {
this.message = 'Hello World';
this.isActive = true;
}
}
}).mount('#app');
</script>
Limitasi Vue.js via CDN
Perlu diingat beberapa limitasi saat menggunakan Vue.js dari CDN:
- Tidak ada Single File Components (.vue files)
- Tidak ada Hot Module Replacement (HMR)
- Tidak ada code splitting otomatis
- Tidak ada TypeScript support bawaan
- Tidak ada tree-shaking untuk optimasi bundle
- Tidak ada preprocessor (Sass, Less, etc)
Alternatif: Petite-Vue untuk Kasus Lebih Sederhana
Jika Kamu hanya butuh fitur dasar Vue.js, pertimbangkan menggunakan petite-vue (hanya 6KB):
<script src="https://unpkg.com/petite-vue" defer init></script>
<div v-scope="{ count: 0 }">
<button @click="count++">{{ count }}</button>
</div>
Petite-vue cocok untuk progressive enhancement dan interaksi sederhana.
Kesimpulan
Vue.js dapat diintegrasikan ke website legacy dengan mudah menggunakan CDN, tanpa perlu proses build atau npm. Cara ini sangat cocok untuk:
- ✅ Menambah fitur interaktif pada halaman lama
- ✅ Meningkatkan developer experience tanpa migrasi besar
- ✅ Pembelajaran dan prototyping cepat
- ✅ Transisi bertahap dari jQuery ke framework modern
Namun, untuk proyek baru dan aplikasi besar, tetap disarankan menggunakan Vue.js versi npm dengan build tools agar mendapatkan manfaat maksimal dari ekosistem Vue.js.
Resources
Artikel Terkait:
- Vue 3 Composition API — Kuasai Pengembangan Komponen Modern
- Mobile-First Responsive Design — Buat Website Adaptif
- React Hooks Deep Dive — Kuasai Pengembangan React Modern
Terakhir diperbarui: January 25, 2026