Membuat package JavaScript lalu meng-upload-nya ke NPM memang mudah, namun membuat workflow release yang aman, profesional, mudah dipahami user, dan tidak merusak production environment, itu cerita yang berbeda.
Banyak developer baru mulai sadar pentingnya:
- semantic versioning,
- dist-tag,
- alpha/beta/rc release,
- dan strategi publish,
setelah mengalami masalah seperti:
- versi beta terinstall di production,
- breaking changes tanpa warning,
- dependency conflict,
- atau user bingung harus install versi yang mana.
Di artikel ini kita akan membahas:
- apa itu semantic versioning,
- perbedaan alpha, beta, rc, dan stable,
- cara kerja dist-tag di NPM,
- apa itu package scope,
- perbedaan package scoped vs unscoped,
- serta workflow release yang biasa digunakan maintainer open-source professional.
Apa Itu Package NPM?
Package NPM adalah modul JavaScript/TypeScript yang dipublish ke registry NPM agar bisa digunakan project lain.
Contoh package tanpa scope:
```text id="3cqv4z" express lodash axios
Contoh package dengan scope:
```text id="qj3r8x"
@nestjs/common
@prisma/client
@myscope/mypackage
Apa Itu Scope di NPM?
Scope adalah namespace untuk package.
Formatnya:
```text id="j9x5ow" @scope/package-name
Contoh:
```text id="2s0zfh"
@myscope/mypackage
Di sini:
myscope→ nama organisasi/usermypackage→ nama package
Kenapa Menggunakan Scope Itu Penting?
Scope membantu:
- menghindari bentrok nama package,
- mengelompokkan package dalam satu organisasi,
- membuat branding package lebih profesional.
Misalnya:
```text id="4j1t0k" storage
Nama ini sangat generic dan mungkin sudah dipakai.
Dengan scope:
```text id="u4k7ye"
@myscope/storage
nama menjadi unik.
Scoped vs Unscoped Package
Unscoped Package
Contoh:
```text id="5j2k6q" mypackage
### Kelebihan
* nama lebih pendek
* lebih simpel
### Kekurangan
* rawan bentrok nama
* sulit branding
* banyak nama populer sudah dipakai
---
## Scoped Package
Contoh:
```text id="q1n8wx"
@myscope/mypackage
Kelebihan
- namespace unik
- lebih profesional
- cocok untuk organisasi/team
- ideal untuk ecosystem package
Kekurangan
- penulisan sedikit lebih panjang
Apa Itu Semantic Versioning?
Mayoritas package modern menggunakan format:
```text id="2f5m7z" MAJOR.MINOR.PATCH
Contoh:
```text id="6r8w2q"
1.4.2
Artinya:
1→ MAJOR → breaking changes4→ MINOR → fitur baru tanpa breaking2→ PATCH → bugfix kecil
Lalu Apa Itu Alpha, Beta, dan RC?
Sebelum package dianggap stable, biasanya ada beberapa fase release.
1. Alpha Release
Contoh:
```text id="m2p9kq" 1.0.0-alpha.0
## Karakteristik
* masih experimental
* API bisa berubah drastis
* banyak bug mungkin muncul
* belum cocok untuk production
Biasanya digunakan:
* internal testing
* proof of concept
* early experimentation
---
## Publish Alpha
```bash id="1r7m5x"
npm publish --tag alpha --access public
Install Alpha
```bash id="4k6x1v" npm install @myscope/mypackage@alpha
---
# 2. Beta Release
Contoh:
```text id="1v4m8x"
1.0.0-beta.0
Karakteristik
- fitur utama sudah tersedia
- API mulai stabil
- testing publik dimulai
- masih mungkin ada bug
Biasanya beta digunakan untuk:
- mendapatkan feedback community
- compatibility testing
- validasi API design
Publish Beta
```bash id="0x9w3j" npm publish --tag beta --access public
---
## Install Beta
```bash id="2m8k1w"
npm install @myscope/mypackage@beta
3. RC (Release Candidate)
Contoh:
```text id="9j4m6v" 1.0.0-rc.0
## Karakteristik
* hampir final
* API sudah stabil
* fokus bug fixing kecil
* siap menjadi stable release
Jika tidak ada masalah besar, RC biasanya akan dipromosikan menjadi stable version.
---
## Publish RC
```bash id="4q8w2x"
npm publish --tag rc --access public
Install RC
```bash id="5w1m9x" npm install @myscope/mypackage@rc
---
# 4. Stable Release (`latest`)
Contoh:
```text id="6x2m4p"
1.0.0
Ini adalah versi production-ready.
Saat user menjalankan:
```bash id="5m1q8r" npm install @myscope/mypackage
NPM otomatis mengambil versi dengan tag:
```text id="9v2x4m"
latest
Apa Itu Dist-Tag di NPM?
Dist-tag adalah label yang menunjuk ke versi tertentu di registry NPM.
Contoh:
```json id="6k4w1x" { "latest": "1.0.0", "beta": "1.1.0-beta.2", "rc": "1.1.0-rc.0" }
Artinya:
* install biasa → mendapatkan stable release
* install `@beta` → mendapatkan beta terbaru
* install `@rc` → mendapatkan RC terbaru
---
# Kenapa Dist-Tag Sangat Penting?
Tanpa dist-tag, user production bisa tidak sengaja menginstall versi unstable.
Contoh kesalahan umum:
```bash id="3m7v1x"
npm publish
Padahal versi package:
```text id="8q1m6p" 1.0.0-beta.0
Karena default publish menggunakan tag `latest`,
maka semua user baru akan mendapatkan versi beta.
Ini adalah kesalahan yang cukup sering terjadi pada maintainer package baru.
---
# Studi Kasus Workflow Release
Misalkan kita sedang membangun package:
```text id="0v8m2q"
@myscope/mypackage
Package ini masih dalam tahap development.
Tahap 1 — Alpha
Versi awal:
```text id="4x2m8q" 0.1.0-alpha.0
Publish:
```bash id="9m2w4x"
npm publish --tag alpha --access public
Tujuan:
- testing internal
- eksperimen API
- validasi architecture
Tahap 2 — Beta
Setelah fitur utama selesai:
```text id="5w8m2v" 0.2.0-beta.0
Publish:
```bash id="6m4q1x"
npm publish --tag beta --access public
Community mulai mencoba package:
```bash id="1x5m8q" npm install @myscope/mypackage@beta
Mulai muncul feedback:
* bug tertentu
* edge case
* compatibility issue
* API naming improvement
---
# Tahap 3 — RC
Semua fitur utama dianggap selesai.
Versi:
```text id="2m6q8w"
1.0.0-rc.0
Publish:
```bash id="8q2m5x" npm publish --tag rc --access public
Fokus utama:
* bug fixing
* dokumentasi
* performance
* backward compatibility
---
# Tahap 4 — Stable
Setelah RC dianggap aman:
```text id="6m1w8q"
1.0.0
Publish:
```bash id="7q5m2x" npm publish --access public
atau:
```bash id="3x9m2q"
npm publish --tag latest --access public
Sekarang user biasa akan mendapatkan stable release secara default.
Cara Mengecek Dist-Tag Package
Gunakan command berikut:
```bash id="8m2q4x" npm view @myscope/mypackage dist-tags
Contoh output:
```json id="4q8m2x"
{
"latest": "1.0.0",
"beta": "1.1.0-beta.2",
"rc": "1.1.0-rc.0"
}
Cara Mengubah Tag latest
Kadang kita ingin mempromosikan versi tertentu tanpa publish ulang.
Contoh:
```bash id="9x2m4q" npm dist-tag add @myscope/mypackage@1.0.0 latest
---
# Workflow Release yang Direkomendasikan
## Alpha Phase
```bash id="7m2q5x"
npm version prerelease --preid=alpha
npm publish --tag alpha
Beta Phase
```bash id="5x8m2q" npm version prerelease --preid=beta npm publish --tag beta
---
## RC Phase
```bash id="2q4m8x"
npm version prerelease --preid=rc
npm publish --tag rc
Stable Release
```bash id="4m8q2x" npm version major npm publish
---
# Kesalahan Umum Saat Publish Package
## 1. Beta Tidak Sengaja Menjadi `latest`
Penyebab:
```bash id="8m4q2x"
npm publish
tanpa --tag beta
2. Tidak Memahami Peer Dependency
Dependency optional seperti:
- database driver,
- cloud SDK,
- storage adapter,
sering menyebabkan runtime error jika tidak didokumentasikan dengan benar.
3. Semua Versi Langsung Stable
Tanpa:
- alpha,
- beta,
- atau RC,
developer kehilangan kesempatan mendapatkan feedback sebelum production release.
Penutup
Merilis package ke NPM bukan hanya soal menjalankan:
bash id="6q2m8x"
npm publish
Versioning dan release workflow adalah bagian penting dari software engineering modern.
Dengan memahami:
- semantic versioning,
- dist-tag,
- alpha/beta/rc release,
- dan strategi publish,
kamu bisa membuat package yang:
- lebih stabil,
- lebih aman digunakan,
- dan terasa jauh lebih profesional.
Baik kamu membuat:
- utility kecil,
- NestJS module,
- React library,
- atau ecosystem package besar,
workflow release yang baik akan membantu menjaga kualitas package dalam jangka panjang.

Posting Komentar
0Komentar