- Published on
Konfigurasi Lengkap Next.js Blog (kawruhnology)
- Authors
- โ Pendahuluan
- 1. ๐ Struktur Proyek dan Persiapan
- 2. โ๏ธ Konfigurasi Inti yang Harus Dicek
- 3. ๐จ Styling dan Tema
- 4. ๐ง TypeScript Konfigurasi
- 5. โ Linting & Formatting
- 6. ๐ Build & Deploy
โ Pendahuluan
kawruhnology merupakan sebuah proyek sumber terbuka (open-source) berbasis Next.js yang dirancang sebagai platform blog statis modern. Proyek ini mengedepankan prinsip modularitas, kinerja optimal, dan kemudahan pengelolaan konten, terutama bagi pengguna yang memiliki latar belakang teknis, seperti pengembang web atau penulis dokumentasi.
Teknologi yang Digunakan
kawruhnology dibangun menggunakan tumpukan teknologi modern berikut:
- Next.js (dengan App Router) sebagai fondasi framework React.
- Tailwind CSS untuk styling berbasis utility classes.
- TypeScript untuk pengembangan yang lebih aman dan terstruktur.
- Contentlayer sebagai content framework untuk memproses file Markdown/MDX menjadi data terstruktur yang siap digunakan di React.
- GitHub Pages sebagai platform deployment untuk hosting statis.
- Pliny sebagai layer tambahan yang menyediakan plugin, helper, dan preset untuk blog teknikal modern.
Siapa yang Cocok Menggunakannya
Platform ini ditujukan bagi pengguna dengan kriteria berikut:
- Pengembang web atau full-stack developer yang ingin memiliki blog pribadi dengan kendali penuh atas kode sumber.
- Penulis teknis yang terbiasa menggunakan Markdown dan menginginkan alur kerja berbasis Git.
- Komunitas atau tim yang ingin membuat blog kolaboratif berbasis file.
- Pengguna yang membutuhkan struktur konten fleksibel namun tidak ingin bergantung pada CMS konvensional.
Hasil Akhir yang Akan Dicapai
Dengan mengikuti konfigurasi dan panduan yang disajikan dalam artikel ini, pengguna akan dapat menjalankan proyek kawruhnology secara lokal, mengelola konten dalam format Markdown, serta melakukan deploy ke GitHub Pages. Hasil akhir berupa sebuah situs blog statis modern, dengan dukungan tema gelap/terang, komentar berbasis GitHub (Giscus), estimasi waktu baca, pencarian lokal, dan struktur SEO-friendly.
1. ๐ Struktur Proyek dan Persiapan
1.1. Clone dan Instalasi
Langkah pertama sebelum memulai konfigurasi adalah melakukan kloning repositori dan menginstal dependensi yang dibutuhkan oleh proyek.
- a. Clone Repositori
git clone https://github.com/slametsampon.git
cd kawruhnology
Perintah di atas akan menyalin seluruh isi proyek dari GitHub ke direktori lokal.
- b. Instalasi Dependensi
Gunakan npm atau yarn untuk menginstal semua paket yang didefinisikan dalam package.json.
npm install
atau jika menggunakan yarn:
yarn install
- c. Menjalankan Proyek di Mode Pengembangan
Setelah dependensi berhasil diinstal, jalankan proyek secara lokal dengan perintah:
npm run dev
Aplikasi akan tersedia di http://localhost:3000 dan siap diuji di browser.
1.2. Struktur Folder
Struktur direktori dalam proyek kawruhnology mengikuti konvensi Next.js berbasis App Router, serta menambahkan beberapa direktori khusus untuk keperluan pengelolaan konten, UI, dan konfigurasi.
Berikut adalah penjelasan direktori penting:
| Folder | Deskripsi |
|---|---|
/app | Direktori utama untuk routing dan struktur halaman menggunakan App Router |
/components | Berisi komponen UI yang dapat digunakan kembali (reusable components) |
/content | Tempat penyimpanan konten artikel dalam format .mdx |
/css | File konfigurasi styling, seperti globals.css |
/data | Data statis seperti metadata situs, konfigurasi author, dsb |
/layouts | Layout halaman global atau spesifik |
/public | Aset statis seperti gambar, ikon, dan favicon |
/.contentlayer | Folder hasil generate dari Contentlayer |
/out | Hasil export static setelah build (next export) |
next.config.js | Konfigurasi Next.js, termasuk basePath dan export |
tailwind.config.ts | Konfigurasi Tailwind CSS |
contentlayer.config.ts | Konfigurasi struktur konten MDX dan integrasi Contentlayer |
tsconfig.json | Konfigurasi TypeScript |
package.json | Daftar dependensi dan skrip yang digunakan oleh proyek |
Struktur ini dirancang agar proyek mudah dipelihara, fleksibel untuk dikembangkan, dan tetap ringan untuk dijalankan di berbagai lingkungan.
2. โ๏ธ Konfigurasi Inti yang Harus Dicek
Untuk memastikan proyek kawruhnology berjalan sebagaimana mestinya, terdapat beberapa file konfigurasi inti yang perlu diperiksa dan disesuaikan. Bagian ini akan menguraikan konfigurasi tersebut berdasarkan fungsinya dalam sistem, serta bagaimana keterkaitannya satu sama lain.
2.1. contentlayer.config.ts
- Apa itu Contentlayer
Contentlayer adalah content framework untuk Next.js yang mengubah file Markdown/MDX menjadi data JSON yang siap digunakan di komponen React. File konfigurasi contentlayer.config.ts mendefinisikan bagaimana file MDX diproses, dikategorikan, dan diubah menjadi struktur data yang dapat dipakai di blog.
- Definisi
Blog,Authors,Page,Post
Pada file ini, terdapat empat jenis dokumen (DocumentType) yang didefinisikan:
- Blog โ Artikel blog utama, berada di
content/blog/**/*.mdx. - Authors โ Profil penulis, berada di
content/authors/**/*.mdx. - Page โ Halaman statis umum, berada di
content/pages/**/*.mdx. - Post โ Postingan alternatif, berada di
content/posts/**/*.mdx.
Setiap jenis dokumen memiliki properti fields yang menentukan struktur frontmatter, dan computedFields untuk memproses data tambahan.
- Fungsi
computedFields
Objek computedFields digunakan untuk menghasilkan data otomatis dari konten, seperti:
readingTime: estimasi waktu baca (menggunakanreading-time)slug: path URL yang dibentuk dari struktur filetoc: daftar isi dari heading MDXfilePath,path: informasi metadata filestructuredData: schema JSON-LD untuk keperluan SEO (khusus tipeBlog)
Field ini memungkinkan pemisahan konten dan logika, serta membantu dalam rendering dinamis.
- Fitur Tambahan: Generate
tag-data.json,author-data.json, dan Search Index
Di akhir file contentlayer.config.ts, terdapat fungsi onSuccess() yang akan dijalankan setelah proses build selesai. Fungsi ini menjalankan tiga fitur tambahan:
createTagCount()Membaca seluruh artikelBlogdan menghitung jumlah tag, lalu menyimpan hasilnya ke file JSON:./app/tag-data.jsoncreateAuthorCount()Sama seperti di atas, namun untuk menghitung jumlah artikel per author:./app/author-data.jsoncreateSearchIndex()Jika pencarian lokal (kbar) diaktifkan, data blog akan disimpan dalampublic/search.json, sesuai konfigurasi padasiteMetadata.search.kbarConfig.
Fitur-fitur ini meningkatkan skalabilitas situs blog, terutama untuk penggunaan fitur navigasi dan pencarian.
- Integrasi dengan
siteMetadata
Properti structuredData dan fungsi createSearchIndex() menggunakan data dari siteMetadata.js, seperti:
siteUrlโ untuk menyusun URL lengkap artikelsocialBannerโ gambar default untuk previewsearch.kbarConfig.searchDocumentsPathโ path file index pencarian
Dengan ini, contentlayer.config.ts tidak berdiri sendiri, melainkan terintegrasi dengan metadata global situs.
2.2. siteMetadata.js
File ini menyimpan metadata global yang dapat digunakan di seluruh aplikasi, baik untuk kebutuhan SEO, branding, maupun integrasi layanan pihak ketiga.
- Metadata Situs
Beberapa properti penting yang digunakan di berbagai tempat:
title,author,descriptionโ ditampilkan di halaman, header, dan meta tagsiteUrlโ digunakan untuk menyusun URL absolut dalam structured datasiteLogo,socialBannerโ digunakan sebagai aset visual di situs dan sosial media
Catatan: Disarankan untuk menghapus trailing slash pada siteUrl untuk menghindari duplikasi URL (//).
- Konfigurasi Komentar (Giscus)
Dukungan komentar dilakukan melalui integrasi Giscus, dengan konfigurasi berikut:
comments: {
provider: 'giscus',
giscusConfig: {
repo: process.env.NEXT_PUBLIC_GISCUS_REPO,
...
}
}
Giscus memerlukan sejumlah variabel environment yang harus disediakan, seperti NEXT_PUBLIC_GISCUS_REPOSITORY_ID, category, dan categoryId.
- Integrasi Analytics (Umami)
File ini juga menyertakan konfigurasi untuk Umami Analytics, meskipun belum aktif secara default:
analytics: {
umamiAnalytics: {
umamiWebsiteId: process.env.NEXT_UMAMI_ID;
}
}
Jika ingin mengaktifkannya, pengguna perlu menyertakan variabel .env yang sesuai dan menyesuaikan kebijakan CSP (Content Security Policy) pada next.config.js.
- Konfigurasi Pencarian (kbar)
Fitur pencarian lokal menggunakan kbar diaktifkan dengan konfigurasi berikut:
search: {
provider: 'kbar',
kbarConfig: {
searchDocumentsPath: 'search.json'
}
}
Path ini digunakan oleh Contentlayer untuk menyimpan data hasil indexing agar bisa diakses frontend.
2.3. next.config.js
File next.config.js berfungsi untuk mengatur perilaku global Next.js, dan dalam proyek kawruhnology, file ini telah disesuaikan untuk mendukung hosting statis di GitHub Pages.
basePathuntuk GitHub Pages
Karena GitHub Pages hanya bisa menayangkan proyek di subfolder (misalnya ``), properti basePath disesuaikan berdasarkan mode:
basePath: isProd ? '/kawruhnology' : '';
Konfigurasi ini memastikan bahwa semua routing di Next.js menggunakan prefix yang sesuai saat di-deploy.
output: export
Proyek menggunakan output: 'export' agar dapat menghasilkan output statis menggunakan next export. Ini penting untuk kompatibilitas dengan GitHub Pages.
images.unoptimized
Untuk mencegah error saat build, konfigurasi berikut digunakan:
images: {
unoptimized: true;
}
Next.js tidak mendukung Image Optimization pada mode export, sehingga konfigurasi ini wajib.
- Variabel
env.BASE_PATH
Agar nilai basePath dapat digunakan di komponen frontend, variabel lingkungan berikut diekspor:
env: {
BASE_PATH: isProd ? '/kawruhnology' : '';
}
Penggunaan variabel ini memungkinkan penyesuaian aset statis atau routing secara dinamis di komponen React.
- Tambahan SVGR
Webpack dikustomisasi untuk mendukung import SVG sebagai React component:
use: ['@svgr/webpack'];
Dengan ini, file SVG dapat digunakan langsung seperti komponen JSX.
2.4. .env dan .env.production
- Contoh Isi
Proyek ini menyertakan file .env.production dengan isi:
BASE_PATH=/kawruhnology
Variabel ini digunakan oleh next.config.js untuk menentukan basePath.
- Kapan Digunakan
File .env.production digunakan saat proses build atau deploy di lingkungan produksi (GitHub Pages). Pastikan environment variable NODE_ENV=production disetel saat menjalankan:
npm run build
- Tips Membuat
.env.example
Agar kolaborator atau pengguna lain dapat mengetahui konfigurasi yang dibutuhkan, disarankan untuk membuat file .env.example dengan isi sebagai berikut:
# Base path untuk GitHub Pages
BASE_PATH=/kawruhnology
# Giscus konfigurasi komentar
NEXT_PUBLIC_GISCUS_REPO=
NEXT_PUBLIC_GISCUS_REPOSITORY_ID=
NEXT_PUBLIC_GISCUS_CATEGORY=
NEXT_PUBLIC_GISCUS_CATEGORY_ID=
# Umami Analytics (opsional)
NEXT_UMAMI_ID=
File ini sebaiknya dikomit ke dalam repositori, namun file .env dan .env.production tetap diabaikan melalui .gitignore.
Konfigurasi pada tahap ini bersifat krusial, karena kesalahan kecil seperti
basePathyang tidak sesuai, struktur konten yang tidak dikenali Contentlayer, atau metadata yang tidak lengkap dapat menyebabkan halaman tidak dapat dibuka dengan benar.
3. ๐จ Styling dan Tema
Styling pada proyek kawruhnology dikonfigurasi menggunakan Tailwind CSS, yang merupakan utility-first CSS framework yang dirancang untuk pengembangan antarmuka yang efisien dan konsisten. Selain itu, proyek ini juga menggunakan PostCSS sebagai CSS processor untuk kompatibilitas lintas browser.
3.1. tailwind.config.ts
File tailwind.config.ts berisi konfigurasi utama Tailwind CSS dalam proyek kawruhnology. Konfigurasi ini memuat berbagai pengaturan untuk mendukung styling yang fleksibel dan konsisten, serta optimal untuk konten blog berbasis Markdown.
- ๐ Pengaturan
content
content: [
'./node_modules/pliny/**/*.js',
'./app/**/*.{js,ts,jsx,tsx}',
'./pages/**/*.{js,ts,tsx}',
'./components/**/*.{js,ts,tsx}',
'./layouts/**/*.{js,ts,tsx}',
'./data/**/*.mdx',
],
Pengaturan ini menentukan lokasi file yang akan dipindai Tailwind untuk mendeteksi class yang digunakan. Seluruh struktur proyek, termasuk App Router (/app), komponen, layout, dan file MDX, telah dicakup secara komprehensif.
Catatan: Folder content/ tidak disebutkan secara eksplisit, namun karena MDX diproses melalui Contentlayer, ini tidak menjadi kendala selama outputnya masuk ke komponen React yang terdeteksi dalam jalur content.
- ๐ก๏ธ
safelist
safelist: ['border-primary-500', 'bg-primary-500', 'text-primary-500'],
Kelas-kelas yang didefinisikan dalam safelist akan tetap disertakan dalam hasil build, meskipun tidak ditemukan secara eksplisit dalam source code. Ini penting untuk mendukung penggunaan class Tailwind yang bersifat dinamis atau berdasarkan kondisi runtime.
- ๐
darkMode
darkMode: 'class',
Mode gelap diaktifkan melalui class dark pada elemen HTML. Ini memberikan fleksibilitas untuk pengguna atau sistem dalam mengatur tema terang/gelap secara manual maupun otomatis (misalnya menggunakan next-themes).
- ๐จ Customisasi
theme
Blok extend dalam theme digunakan untuk memperluas konfigurasi default Tailwind. Berikut beberapa penyesuaian yang dilakukan:
- ๐
lineHeight
lineHeight: {
11: '2.75rem',
12: '3rem',
13: '3.25rem',
14: '3.5rem',
}
Menambahkan pilihan line height tambahan untuk kontrol layout yang lebih presisi, khususnya pada heading atau paragraf dalam konten blog.
- ๐ค
fontFamily
fontFamily: {
sans: ['var(--font-space-grotesk)', ...fontFamily.sans],
}
Mengatur font utama (sans-serif) menggunakan variabel CSS --font-space-grotesk, yang memungkinkan integrasi dengan font custom yang di-load secara global.
- ๐จ
colors
colors: {
primary: colors.pink,
gray: colors.gray,
}
Mendefinisikan warna primary dan gray secara eksplisit menggunakan warna dari tailwindcss/colors. Warna primary digunakan secara luas di link, tombol, dan elemen interaktif lain dalam blog.
- โ๏ธ Konfigurasi
typography(Plugin@tailwindcss/typography)
Konfigurasi ini memungkinkan kontrol penuh terhadap tampilan konten yang menggunakan class prose, seperti artikel MDX. Konfigurasi dibagi menjadi dua mode:
DEFAULT(Light Mode)
- Maksimal lebar konten:
85ch - Warna link:
primary.500dengan efek hover - Heading (
h1,h2,h3): font tebal dan spasi khusus - Paragraph dan list: margin vertikal yang konsisten
- Inline code: warna
indigo.500
invert(Dark Mode)
- Warna teks diubah menjadi abu terang (
gray.100,gray.300) - Link tetap menggunakan warna
primary - Heading dan paragraf diberi margin serupa mode terang
Konfigurasi ini memastikan konten blog tetap mudah dibaca dan konsisten dalam kedua mode tema.
- ๐งฉ Plugin Tambahan
plugins: [require('@tailwindcss/forms'), require('@tailwindcss/typography')],
- @tailwindcss/forms: Menyediakan style dasar yang konsisten untuk elemen form (input, select, textarea).
- @tailwindcss/typography: Digunakan untuk styling otomatis pada konten
prose, seperti yang digunakan di artikel MDX.
3.2. postcss.config.js
module.exports = {
plugins: {
tailwindcss: {},
autoprefixer: {},
},
};
Konfigurasi PostCSS digunakan untuk memproses CSS akhir sebelum dikirim ke browser. Dalam proyek kawruhnology, hanya dua plugin yang digunakan:
tailwindcss: Mengubah class menjadi CSS nyata sesuai konfigurasi Tailwind.autoprefixer: Menambahkan vendor prefix CSS untuk memastikan kompatibilitas lintas browser modern.
Konfigurasi ini bersifat standar dan sudah mencukupi untuk mayoritas kebutuhan produksi tanpa tambahan plugin tambahan.
Kesimpulan
Konfigurasi styling dalam proyek kawruhnology telah dirancang untuk:
- Mendukung tema terang dan gelap
- Menyediakan styling yang rapi untuk konten Markdown
- Mendukung desain konsisten melalui utility class
- Memungkinkan penggunaan font dan warna kustom dengan mudah
Dengan pendekatan berbasis Tailwind CSS yang terstruktur, proyek ini memberikan fleksibilitas tinggi bagi pengembang untuk menyesuaikan tampilan blog tanpa harus menulis CSS dari awal.
4. ๐ง TypeScript Konfigurasi
Proyek kawruhnology ditulis menggunakan TypeScript untuk mendapatkan manfaat validasi tipe, pengembangan yang lebih aman, serta dokumentasi otomatis dari struktur data. File tsconfig.json merupakan pusat konfigurasi TypeScript, yang mengatur bagaimana kode dikompilasi, tipe ditangani, serta bagaimana modul dan path di-resolve.
4.1. tsconfig.json
Berikut ini adalah pembahasan konfigurasi tsconfig.json yang digunakan pada proyek ini.
- ๐ฏ Target Kompilasi dan Lingkungan
"target": "es5",
"lib": ["dom", "dom.iterable", "esnext"],
"module": "esnext",
"moduleResolution": "node",
"jsx": "preserve",
target: es5Menentukan versi JavaScript hasil kompilasi.es5memberikan kompatibilitas maksimal, tetapi tidak lagi relevan untuk mayoritas browser modern.- โ
Rekomendasi: Ganti menjadi
es2020untuk dukungan fitur modern dan build yang lebih optimal.
- โ
Rekomendasi: Ganti menjadi
libMenentukan environment yang didukung, termasuk DOM dan fitur ES terbaru.moduledanmoduleResolutionDisetel keesnextdannode, sesuai dengan kebutuhan modul ES dan kompatibilitas Next.js.jsx: preserveMempertahankan sintaks JSX agar dapat ditangani oleh Next.js saat build, bukan oleh TypeScript.
- โ Pengaturan Tipe & Validasi
"strict": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true,
"noEmit": true,
"esModuleInterop": true,
"resolveJsonModule": true,
"isolatedModules": true,
"incremental": true,
strict: trueMengaktifkan semua aturan ketat TypeScript untuk keamanan tipe maksimal.skipLibCheck: trueMenghindari pemeriksaan terhadap file.d.tseksternal untuk mempercepat build.forceConsistentCasingInFileNamesMencegah kesalahan path akibat perbedaan huruf kapital (terutama di sistem file case-sensitive).noEmit: trueTidak menghasilkan output.js, karena proyek ini menggunakan Next.js untuk build.esModuleInterop,resolveJsonModule,isolatedModulesMengaktifkan interoperabilitas dengan modul CommonJS, mendukung import JSON, serta menjaga kompatibilitas dengan Next.js.incrementalMemungkinkan build yang lebih cepat dengan menyimpan cache hasil kompilasi sebelumnya.
- ๐ Dukungan Path Alias
"baseUrl": ".",
"paths": {
"@/*": ["./*"],
"@/components/*": ["components/*"],
"@/data/*": ["data/*"],
"@/layouts/*": ["layouts/*"],
"@/css/*": ["css/*"],
"contentlayer/generated": ["./.contentlayer/generated"]
}
Konfigurasi ini memungkinkan penggunaan import alias yang lebih rapi dan mudah dipelihara. Contoh:
import Layout from '@/layouts/BaseLayout';
Daripada menggunakan import relatif seperti:
import Layout from '../../../layouts/BaseLayout';
Alias juga memudahkan integrasi dengan Contentlayer, seperti:
import { allBlogs } from 'contentlayer/generated';
Pastikan VSCode atau editor lain mendukung path alias sesuai
tsconfig.json.
- ๐ฅ
includedanexclude
"include": [
"next-env.d.ts",
"**/*.ts",
"**/*.tsx",
".next/types/**/*.ts",
".contentlayer/generated",
"app/layout.tsx",
"app/layout.tsx-min",
"app/layout-new.tsx"
],
"exclude": ["node_modules"]
include:- Memastikan semua file
.tsdan.tsxtermasuk saat kompilasi. - Menyertakan file dari
.nextdan.contentlayer/generatedagar TypeScript mengenali output runtime dan content. - File
app/layout.tsx-mindanlayout-new.tsxkemungkinan digunakan sebagai varian layout (opsional, tergantung pengembangan aktif).
- Memastikan semua file
exclude:- Mengecualikan
node_modules, sesuai praktik standar.
- Mengecualikan
โ Rekomendasi Perbaikan
| Aspek | Status Saat Ini | Rekomendasi |
|---|---|---|
target | es5 | Ubah ke es2020 |
| Path alias | โ Baik | Tidak perlu perubahan |
| Dukungan Contentlayer | โ Disertakan | Sudah sesuai |
| Include file tambahan | โ | Lengkap, cocok untuk App Router |
Konfigurasi strict | โ Aktif | Menunjukkan orientasi produksi |
- Kesimpulan
Konfigurasi tsconfig.json dalam proyek kawruhnology telah disusun dengan baik dan mencakup:
- Kompatibilitas penuh dengan Next.js App Router
- Integrasi dengan Contentlayer
- Penggunaan alias path untuk pengembangan yang lebih terstruktur
- Mode strict TypeScript untuk kualitas kode lebih baik
Satu-satunya penyesuaian yang disarankan adalah mengubah target kompilasi dari es5 ke es2020, mengingat proyek ini tidak ditujukan untuk browser lama dan sudah menggunakan fitur-fitur modern JavaScript.
5. โ Linting & Formatting
Untuk menjaga konsistensi, kualitas kode, dan menghindari kesalahan umum dalam pengembangan proyek, kawruhnology dilengkapi dengan sistem linting dan formatting berbasis ESLint dan Prettier, termasuk integrasi dengan husky dan lint-staged untuk validasi otomatis sebelum commit.
5.1. .eslintrc.js
File .eslintrc.js merupakan konfigurasi linting utama yang mengatur bagaimana ESLint menganalisis kode dalam proyek. Konfigurasi ini mencakup dukungan untuk TypeScript, JSX Accessibility (a11y), serta pengaturan khusus untuk Next.js.
- ๐ Struktur Konfigurasi
module.exports = {
root: true,
parser: '@typescript-eslint/parser',
env: {
browser: true,
amd: true,
node: true,
es6: true,
},
parserOptions: {
project: './tsconfig.json',
tsconfigRootDir: __dirname,
sourceType: 'module',
},
plugins: ['@typescript-eslint', 'jsx-a11y'],
extends: [
'eslint:recommended',
'plugin:@typescript-eslint/eslint-recommended',
'plugin:@typescript-eslint/recommended',
'plugin:jsx-a11y/recommended',
'next',
'next/core-web-vitals',
],
rules: {
...
},
};
- ๐ Penjelasan Komponen Utama
@typescript-eslint/parser: Memungkinkan ESLint memahami sintaks TypeScript.jsx-a11y: Menyediakan rule untuk meningkatkan aksesibilitas elemen JSX/HTML.next/core-web-vitals: Menambahkan rekomendasi performa dari tim Next.js.
- โ๏ธ Penyesuaian
rules
Beberapa rule telah disesuaikan sesuai kebutuhan pengembangan:
| Rule | Status | Penjelasan |
|---|---|---|
@typescript-eslint/no-explicit-any | off | Memungkinkan penggunaan any, berguna untuk prototipe awal |
@typescript-eslint/no-unused-vars | warn | Menampilkan peringatan, tetapi tidak memblokir build |
jsx-a11y/click-events-have-key-events | off | Dimatikan, memungkinkan interaksi tanpa key event tambahan |
jsx-a11y/anchor-is-valid | custom | Diatur khusus agar kompatibel dengan next/link |
react/react-in-jsx-scope | off | Tidak relevan di Next.js karena JSX sudah otomatis tersedia |
Konfigurasi ini memberikan keseimbangan antara kualitas kode dan kemudahan pengembangan, tanpa terlalu membatasi saat proses eksplorasi atau iterasi awal.
5.2. .eslintignore
File .eslintignore menentukan direktori atau file yang diabaikan oleh proses linting.
- Isi Saat Ini:
node_modules
.eslintrc.js
- Evaluasi:
- โ
node_modulesmemang seharusnya diabaikan. - โ ๏ธ
.eslintrc.jstidak perlu di-ignore, kecuali memang disengaja.
- ๐ก Rekomendasi:
Disarankan untuk menambahkan folder hasil build agar tidak ikut dianalisis:
node_modules
.next
out
5.3. Bonus: Lint, Format, dan Git Hooks
Proyek ini dilengkapi dengan berbagai alat bantu otomatisasi dalam package.json untuk mendukung linting dan formatting secara efisien.
- ๐งพ Script Terkait
"scripts": {
"lint": "next lint --fix --dir pages --dir app --dir components --dir lib --dir layouts --dir scripts --dir data",
"lintAll": "next lint --fix --dir .",
"format": "prettier --write ."
}
lint: Menjalankan ESLint dengan auto-fix pada folder tertentu.lintAll: Menjalankan ESLint pada seluruh direktori.format: Menjalankan Prettier untuk seluruh file.
- โ
Integrasi
huskydanlint-staged
Proyek ini juga menggunakan husky dan lint-staged untuk linting otomatis sebelum commit.
- Konfigurasi
lint-staged:
"lint-staged": {
"*.+(js|jsx|ts|tsx)": [
"eslint --fix"
],
"*.+(js|jsx|ts|tsx|json|css|md|mdx)": [
"prettier --write"
]
}
- File JavaScript/TypeScript akan diperbaiki otomatis oleh ESLint.
- File yang umum digunakan (
.json,.md,.css,.mdx) akan diformat dengan Prettier.
- Penggunaan:
husky akan menjalankan lint-staged sebelum proses commit berlangsung. Ini memastikan bahwa hanya kode yang sudah lolos linting dan diformat dengan benar yang akan tersimpan di repositori.
- Kesimpulan
Sistem linting dan formatting pada proyek kawruhnology telah dikonfigurasi secara menyeluruh untuk:
- Menjaga kualitas dan konsistensi kode
- Memberikan fleksibilitas selama proses pengembangan
- Mengintegrasikan linting secara otomatis dalam alur kerja Git
Konfigurasi ini meminimalkan kesalahan umum dan menjaga standar kode agar tetap terjaga dalam kolaborasi tim maupun proyek pribadi.
6. ๐ Build & Deploy
Proyek kawruhnology dikonfigurasi untuk menghasilkan situs statis menggunakan fitur export dari Next.js. Proses ini memungkinkan deployment ke GitHub Pages tanpa memerlukan server khusus. Langkah-langkah pada bagian ini mencakup build untuk produksi, serta proses deploy ke GitHub Pages.
6.1. ๐จ Build untuk Produksi
- Perintah:
next build && next export
next build: Melakukan proses kompilasi dan optimasi untuk produksi.next export: Mengekspor proyek ke dalam format statis (static HTML) ke direktoriout/.
Proyek ini telah dikonfigurasi dengan output: 'export' dalam file next.config.js, yang memungkinkan penggunaan next export tanpa konfigurasi tambahan.
๐ Hasil dari proses ini berada di dalam folder
/out, yang akan menjadi sumber utama untuk proses deploy ke GitHub Pages.
- ๐ Catatan:
Pada file package.json, script build saat ini hanya berisi:
"build": "next build"
Untuk memastikan proses export berjalan otomatis, sebaiknya diubah menjadi:
"build": "next build && next export"
6.2. ๐ Deploy ke GitHub Pages
Proyek ini menggunakan paket gh-pages untuk melakukan deploy folder out/ ke branch gh-pages di repositori GitHub.
- a. ๐ฆ Instal
gh-pages
Jika belum terpasang, jalankan:
npm install gh-pages --save-dev
Pada package.json Anda, gh-pages sudah termasuk di dalam devDependencies:
"gh-pages": "^6.3.0"
โ Tidak perlu instal ulang jika sudah ada.
- b. ๐ Tambahkan Script
deploy
Tambahkan script berikut ke dalam bagian scripts di package.json:
"deploy": "npm run build && gh-pages -d out"
Script ini akan:
- Melakukan build dan export proyek ke direktori
out. - Menggunakan
gh-pagesuntuk mendorong isiout/ke branchgh-pages.
- c. โ๏ธ Konfigurasi
next.config.js
Pastikan file next.config.js telah disesuaikan agar routing dan asset bekerja dengan benar saat di-hosting melalui GitHub Pages.
- Konfigurasi yang digunakan:
const isProd = process.env.NODE_ENV === 'production';
const nextConfig = {
output: 'export',
trailingSlash: true,
images: {
unoptimized: true,
},
basePath: isProd ? '/kawruhnology' : '',
env: {
BASE_PATH: isProd ? '/kawruhnology' : '',
},
webpack(config) {
config.module.rules.push({
test: /\.svg$/i,
issuer: /\.[jt]sx?$/,
use: ['@svgr/webpack'],
});
return config;
},
};
module.exports = withContentlayer(nextConfig);
- Keterangan:
output: 'export': Wajib untuk menghasilkan situs statis.trailingSlash: true: Membuat URL konsisten di GitHub Pages (/about/bukan/about).basePath: Menentukan prefix routing sesuai nama repositori (/kawruhnology).images.unoptimized: Mencegah error karenanext/imagetidak mendukung mode static export.
Pastikan nama repositori di GitHub sesuai dengan nilai
basePath.
- d. โ๏ธ Setup GitHub Pages
Setelah deploy berhasil, lakukan konfigurasi di GitHub:
Buka repositori di GitHub.
Masuk ke tab Settings โ Pages.
Pilih:
- Source:
gh-pagesbranch - Folder:
/ (root)
- Source:
Klik Save.
Setelah beberapa menit, situs akan tersedia di:
https://<username>.github.io/<nama-repositori>/
Contoh untuk repositori ini:
https://slametsampon.github.io/kawruhnology/
- e. (Opsional) Tambahkan
.nojekyll
Untuk mencegah GitHub Pages mengabaikan folder yang diawali _, tambahkan perintah berikut dalam script post-export:
"postexport": "echo > out/.nojekyll"
Atau jalankan secara manual:
touch out/.nojekyll
โ Rangkuman Proses Deploy
| Langkah | Status |
|---|---|
gh-pages terpasang | โ |
Script build + export | โ ๏ธ (perlu update) |
Script deploy tersedia | โ |
basePath disesuaikan | โ |
| GitHub Pages dikonfigurasi | โ ๏ธ (perlu manual) |
.nojekyll disiapkan | โ ๏ธ (opsional tapi disarankan) |
- Kesimpulan
Proyek kawruhnology telah dikonfigurasi secara optimal untuk proses export dan deploy ke GitHub Pages. Dengan sedikit penyesuaian pada script dan konfigurasi next.config.js, proses deploy dapat dilakukan secara otomatis dan konsisten.
Catatan Penyusunan Artikel ini disusun sebagai materi edukasi dan referensi umum berdasarkan berbagai sumber pustaka, praktik lapangan, serta bantuan alat penulisan. Pembaca disarankan untuk melakukan verifikasi lanjutan dan penyesuaian sesuai dengan kondisi serta kebutuhan masing-masing sistem.