Masukkan Password
23 Opsi Konfigurasi allowJs & sourceMap
Lecture ini melanjutkan pembahasan compilerOptions di tsconfig.json, dan kali ini ada beberapa option yang perlu kamu pahami:
allowJscheckJsjsxdeclarationdeclarationMapsourceMapβ bagian yang paling penting di lecture ini
Yang paling penting untuk dipahami adalah perbedaan antara mengikutsertakan JavaScript dalam compilation dan menghubungkan JavaScript hasil compile kembali ke TypeScript saat debugging.
1. Gambaran besar dulu
Sebelumnya kita sudah belajar:
{
"compilerOptions": {
"target": "ES2016",
"lib": ["ES2016", "DOM"]
}
}
Sekarang kita akan menambahkan beberapa option lain:
compilerOptions
β
βββ target
β β JavaScript versi apa yang dihasilkan?
β
βββ lib
β β API apa yang dikenal TypeScript?
β
βββ allowJs
β β Apakah file .js boleh ikut compilation?
β
βββ checkJs
β β Apakah JavaScript juga diperiksa?
β
βββ jsx
β β Bagaimana JSX diproses?
β
βββ declaration
β β Apakah .d.ts dibuat?
β
βββ declarationMap
β β Mapping untuk declaration files
β
βββ sourceMap
β Hubungkan JavaScript hasil compile
dengan source TypeScript untuk debugging
2. allowJs
Kita mulai dari:
"allowJs": true
Secara sederhana, allowJs berarti:
βTypeScript project saya boleh memasukkan file JavaScript (
.js) ke dalam proses compilation.β
Biasanya dalam project TypeScript kita punya:
src/
βββ app.ts
βββ user.ts
βββ config.ts
Semuanya TypeScript.
Tetapi bagaimana kalau project kita seperti ini?
src/
βββ app.ts
βββ user.ts
βββ old-code.js
βββ config.js
Ada campuran:
.ts
+
.js
Nah, allowJs berguna untuk kondisi seperti itu.
3. Tanpa allowJs
Misalnya:
{
"compilerOptions": {
"allowJs": false
}
}
atau option tersebut tidak digunakan.
Secara sederhana, project kita berfokus pada:
.ts
File JavaScript tidak dianggap sebagai source JavaScript yang ingin kita ikutkan ke compilation TypeScript.
4. Dengan allowJs: true
Kita bisa menulis:
{
"compilerOptions": {
"allowJs": true
}
}
Sekarang TypeScript bisa memasukkan file:
.ts
.js
ke dalam project compilation.
Misalnya:
src/
βββ app.ts
βββ user.ts
βββ helper.js
Maka helper.js juga bisa menjadi bagian dari project.
5. Kenapa kita membutuhkan allowJs?
Biasanya ketika melakukan migrasi dari JavaScript ke TypeScript.
Misalnya project lama kita seluruhnya JavaScript:
old-project/
βββ app.js
βββ user.js
βββ product.js
βββ config.js
βββ helper.js
Kemudian kita ingin pindah perlahan ke TypeScript.
Tidak realistis kalau kita langsung mengubah 100% file sekaligus.
Kita bisa melakukan:
Tahap 1
JavaScript
β
app.js
user.js
product.js
Tahap 2
Mulai tambahkan TypeScript
β
app.ts
user.js
product.js
Tahap 3
Migrasi bertahap
β
app.ts
user.ts
product.ts
Tahap 4
Semuanya TypeScript
allowJs membantu project JavaScript + TypeScript hidup berdampingan.
6. checkJs
Sekarang ada option kedua:
"checkJs": true
checkJs berarti:
βKalau ada file JavaScript, lakukan type/syntax checking terhadap file JavaScript tersebut.β
Ini berbeda dengan allowJs.
7. Perbedaan allowJs dan checkJs
Ini wajib kamu bedakan.
allowJs
Menjawab:
βApakah file
.jsboleh ikut project compilation?β
checkJs
Menjawab:
βApakah file
.jstersebut juga perlu diperiksa oleh TypeScript?β
Jadi:
allowJs
β
Boleh masuk?
checkJs
β
Perlu diperiksa?
8. Analogi allowJs vs checkJs
Bayangkan ada sebuah sekolah.
Ada siswa:
TypeScript students
JavaScript students
allowJs
Seperti mengatakan:
βSiswa JavaScript boleh masuk sekolah.β
checkJs
Seperti mengatakan:
βDan tugas siswa JavaScript juga akan diperiksa.β
Jadi:
allowJs = boleh masuk
checkJs = diperiksa
9. Contoh
Misalnya:
// helper.js
function add(a, b) {
return a + b;
}
Dengan:
{
"compilerOptions": {
"allowJs": true,
"checkJs": false
}
}
JavaScript boleh ikut project, tetapi TypeScript tidak melakukan checking seketat ketika checkJs diaktifkan.
Kalau:
{
"compilerOptions": {
"allowJs": true,
"checkJs": true
}
}
TypeScript juga akan memeriksa kode JavaScript tersebut dan melaporkan problem yang dapat dideteksinya.
10. Kapan allowJs + checkJs berguna?
Terutama ketika:
Project kita masih JavaScript tetapi sedang bermigrasi ke TypeScript.
Misalnya:
Project lama
β
JavaScript
β
Tambahkan TypeScript
β
allowJs: true
checkJs: true
β
Migrasi secara bertahap
Jadi kita tidak harus melakukan migrasi besar-besaran sekaligus.
11. Kenapa lecture tidak mengaktifkannya?
Project dalam lecture sudah menggunakan TypeScript:
app.ts
config.ts
dll.
Kemudian hasil compilation menghasilkan:
app.js
config.js
Nah, kalau kita mengaktifkan:
"allowJs": true
ada potensi file .js yang sudah merupakan hasil compilation ikut dianggap sebagai source JavaScript.
Contohnya:
app.ts
β
tsc
β
app.js
Kalau app.js kemudian dianggap sebagai input juga, kita bisa mendapatkan situasi:
app.ts
β
app.js
app.js
β
diproses lagi
Padahal kita tidak membutuhkan itu.
12. Jadi hati-hati dengan generated JavaScript
Misalnya project:
project/
βββ app.ts
βββ config.ts
βββ app.js β hasil compile
βββ config.js β hasil compile
Kalau allowJs diaktifkan sembarangan, file .js yang sebenarnya output bisa ikut terbaca sebagai input.
Makanya dalam project TypeScript murni, kita biasanya tidak perlu:
"allowJs": true
13. jsx
Option berikutnya:
"jsx": ...
Ini berhubungan dengan JSX, yang sangat umum digunakan dalam project React.
Contohnya:
const element = <h1>Hello World</h1>;
Perhatikan:
<h1>Hello World</h1>
Itu bukan syntax JavaScript biasa.
Itu adalah JSX.
14. Kenapa TypeScript punya option jsx?
Karena TypeScript perlu tahu:
βKalau saya menemukan JSX, bagaimana JSX tersebut harus diproses?β
Ada beberapa mode JSX yang bisa dipilih tergantung setup project dan versi React/TypeScript.
Untuk sekarang, yang penting:
jsx option
β
mengatur bagaimana JSX diproses
Kalau project kita bukan React dan tidak menggunakan JSX:
Kita tidak perlu memikirkan option ini.
Seperti yang dikatakan lecture.
15. declaration
Berikutnya:
"declaration": true
Ini sedikit lebih advanced.
Ketika declaration diaktifkan, TypeScript dapat menghasilkan file:
.d.ts
Misalnya:
app.ts
β
TypeScript Compiler
β
app.js
app.d.ts
16. Apa itu .d.ts?
.d.ts adalah declaration file.
File tersebut berisi informasi tentang type, tetapi bukan implementation utama.
Misalnya kita punya:
export function add(a: number, b: number): number {
return a + b;
}
Declaration file-nya kira-kira akan berisi:
export declare function add(a: number, b: number): number;
Perhatikan:
Implementation
β
return a + b
tidak ada di declaration file.
Declaration file lebih seperti:
βLibrary ini mempunyai function bernama
add, menerima duanumber, dan menghasilkannumber.β
17. Kapan declaration berguna?
Biasanya ketika kita membuat library/package untuk digunakan orang lain.
Misalnya kita membuat:
my-awesome-library
Orang lain meng-install:
my-awesome-library
Mereka perlu tahu:
function apa yang tersedia?
parameter-nya apa?
return type-nya apa?
class apa yang tersedia?
File .d.ts membantu TypeScript milik pengguna memahami API library kita.
18. declarationMap
Kemudian ada:
"declarationMap": true
Ini berhubungan dengan .d.ts dan mapping-nya.
Secara sederhana:
.ts
β
.d.ts
β
declaration map
Declaration map membantu tooling mengetahui hubungan antara declaration file dan source TypeScript.
Ini berguna terutama untuk library development dan pengalaman developer seperti navigasi ke source code.
Untuk project TypeScript biasa yang sedang belajar:
Belum perlu terlalu memikirkan
declarationMap.
19. Sekarang bagian paling penting: sourceMap
Nah, kita masuk ke option utama lecture:
"sourceMap": true
Ini sangat penting untuk debugging.
20. Masalahnya: browser menjalankan JavaScript, bukan TypeScript
Misalnya kita punya:
app.ts
Browser biasanya tidak menjalankan TypeScript secara langsung.
TypeScript kita compile:
app.ts
β
TypeScript Compiler
β
app.js
β
Browser
Jadi browser menjalankan:
app.js
bukan:
app.ts
21. Masalah ketika debugging
Misalnya app.ts kita:
const pi = 3.14;
console.log("value of pi is", pi);
Setelah compile:
const pi = 3.14;
console.log("value of pi is", pi);
Secara sederhana mungkin kelihatannya sama.
Tetapi pada project yang lebih kompleks, TypeScript bisa ditransformasikan.
Misalnya:
const add = (a: number, b: number): number => {
return a + b;
};
Output-nya mungkin berubah tergantung target.
Kalau kita debugging browser, browser melihat:
app.js
Bukan:
app.ts
22. Tanpa Source Map
Bayangkan kita memasang breakpoint:
app.js
line 10
Developer Tools akan menunjukkan JavaScript hasil compilation.
Masalahnya:
Kita sebagai developer sebenarnya lebih nyaman membaca dan debugging
app.ts.
Karena source code yang kita tulis adalah:
app.ts
bukan:
app.js
23. sourceMap: true
Sekarang kita aktifkan:
{
"compilerOptions": {
"sourceMap": true
}
}
Kemudian compile.
TypeScript akan menghasilkan:
app.ts
β
tsc
β
app.js
app.js.map
Ada file baru:
app.js.map
24. Apa itu .js.map?
File:
app.js.map
disebut source map.
Ia berfungsi sebagai semacam peta penghubung antara:
JavaScript hasil compilation
dan:
TypeScript source code
Secara sederhana:
app.ts
β
app.js
β
app.js.map
Source map membantu browser Developer Tools memahami:
βJavaScript di sini berasal dari bagian mana dari source TypeScript?β
25. Analogi source map
Bayangkan kamu menerjemahkan buku:
Bahasa Indonesia
β
Bahasa Inggris
Hasil akhirnya adalah buku bahasa Inggris.
Kalau kita menemukan kalimat bermasalah di buku bahasa Inggris, kita ingin tahu:
βKalimat ini asalnya dari halaman mana di buku Indonesia?β
Source map seperti peta terjemahan.
Source TypeScript
β
JavaScript output
β
source map
Source map membantu developer tools melakukan mapping tersebut.
26. Apa keuntungan sourceMap?
Dengan:
"sourceMap": true
Developer Tools browser dapat menampilkan source TypeScript.
Misalnya:
Sources
β
βββ app.ts
βββ config.ts
βββ user.ts
β
βββ app.js
βββ config.js
βββ user.js
Kemudian kita bisa:
- membuka
app.ts - memasang breakpoint di TypeScript
- menjalankan aplikasi
- melakukan debugging dari source TypeScript
Ini jauh lebih nyaman.
27. Sebelum source map
Tanpa source map:
Developer
β
Debug
β
app.js
β
JavaScript hasil compile
Kita harus berurusan dengan generated code.
28. Dengan source map
Dengan:
"sourceMap": true
alur debugging menjadi:
Developer
β
Debug
β
app.ts
β
Source Map
β
app.js
β
Browser
Jadi developer bekerja dengan source asli, sementara browser tetap menjalankan JavaScript hasil compilation.
29. File .map itu sebenarnya apa?
Kalau kamu buka:
app.js.map
isinya memang bisa terlihat sangat aneh.
Misalnya ada informasi seperti:
{
"version": 3,
"file": "app.js",
"sourceRoot": "",
"sources": ["app.ts"],
"names": [],
"mappings": "..."
}
Jangan khawatir.
Kamu tidak perlu membaca isi file .map secara manual.
Yang penting pahami:
File
.mapmenyimpan informasi mapping antara generated JavaScript dan source code asli.
30. Kenapa disebut “map”?
Karena dia melakukan mapping.
Misalnya:
app.js line 10
β
app.ts line 7
Atau secara konsep:
JavaScript output
β
β source map
β
TypeScript source
Jadi Developer Tools bisa mengetahui hubungan keduanya.
31. sourceMap tidak mengubah runtime logic
Ini juga penting.
Ketika kita mengaktifkan:
"sourceMap": true
kita tidak sedang menambahkan fitur JavaScript baru.
Source map terutama membantu development dan debugging.
Browser tetap menjalankan:
app.js
File:
app.js.map
digunakan oleh tooling untuk membantu developer.
32. Kenapa lecture mematikan sourceMap lagi?
Di lecture project-nya kecil.
Kalau:
"sourceMap": true
maka setiap:
app.ts
menghasilkan:
app.js
app.js.map
Jadi akan ada file tambahan:
app.js.map
config.js.map
user.js.map
...
Untuk project kecil yang sedang belajar, mungkin dianggap tidak perlu.
Maka lecture kembali:
// "sourceMap": true
Tetapi dalam project development yang lebih serius, source map sangat berguna untuk debugging.
33. Perbedaan semua option dalam lecture
Sekarang kita buat tabel supaya gampang diingat.
| Option | Fungsi sederhana |
|---|---|
allowJs | Mengizinkan .js ikut project compilation |
checkJs | Memeriksa kode .js |
jsx | Mengatur pemrosesan JSX |
declaration | Menghasilkan file .d.ts |
declarationMap | Mapping untuk declaration files |
sourceMap | Menghubungkan output JS dengan source code untuk debugging |
34. allowJs vs sourceMap jangan tertukar
Keduanya sama-sama berhubungan dengan .js, tetapi konteksnya berbeda.
allowJs
.js
β
boleh menjadi INPUT?
sourceMap
.ts
β
compile
β
.js
β
bagaimana debugging kembali ke .ts?
Jadi:
allowJs β INPUT
sourceMap β DEBUGGING
35. declaration juga jangan tertukar dengan sourceMap
declaration
Menghasilkan:
.d.ts
untuk menyediakan informasi type/API.
sourceMap
Menghasilkan:
.js.map
untuk mapping source code saat debugging.
Jadi:
declaration
β
.d.ts
β
Type information / library API
sourceMap
β
.js.map
β
Debugging / source mapping
36. Gambaran lengkap compilation
Misalnya:
app.ts
Dengan konfigurasi tertentu:
{
"compilerOptions": {
"target": "ES2016",
"sourceMap": true,
"declaration": true
}
}
Maka hasilnya bisa berupa:
app.ts
β
β
TypeScript Compiler
β
ββββββββββββββββ app.js
β
ββββββββββββββββ app.js.map
β
ββββββββββββββββ app.d.ts
Masing-masing memiliki tujuan berbeda:
app.js
β
yang dijalankan browser/runtime
app.js.map
β
membantu debugging
app.d.ts
β
memberikan informasi type/API kepada consumer
37. Satu konsep penting: compile vs debug
Kita bisa membagi option-option tadi menjadi beberapa kelompok.
Mengatur source yang boleh masuk
allowJs
Memeriksa source
checkJs
Mengatur output/transformasi tertentu
target
jsx
Menghasilkan informasi type untuk library
declaration
declarationMap
Membantu debugging
sourceMap
Ini membuat compilerOptions jauh lebih mudah dipahami.
38. Contoh nyata
Misalnya kamu membuat website:
src/
βββ app.ts
βββ user.ts
βββ helper.ts
HTML:
<button id="btn">Click Me</button>
TypeScript:
const button = document.getElementById("btn")!;
button.addEventListener("click", () => {
console.log("Button clicked");
});
Compile:
app.ts
β
tsc
β
app.js
Browser menjalankan:
app.js
Sekarang ada bug.
Kamu ingin breakpoint pada:
button.addEventListener(...)
Kalau sourceMap aktif:
{
"compilerOptions": {
"sourceMap": true
}
}
browser developer tools dapat membantu kamu debugging langsung dari:
app.ts
Itulah manfaat praktis sourceMap.
39. Mental model yang harus kamu punya
Coba bayangkan TypeScript compiler sebagai sebuah pabrik.
SOURCE
β
ββββββββββ΄βββββββββ
β β
app.ts helper.js
β β
ββββββββββ¬βββββββββ
β
TypeScript Compiler
β
ββββββββββββΌβββββββββββ
β β β
app.js app.js.map app.d.ts
β β β
β β β
Runtime Debugging Type info
Ini adalah gambaran yang sangat bagus untuk mengingat fungsi masing-masing file.
40. Ringkasan paling penting
Kalau besok kamu lupa semua detail lecture ini, ingat 6 kalimat berikut:
allowJs
βBolehkan file JavaScript ikut dalam project TypeScript?β
"allowJs": true
checkJs
βKalau file JavaScript ikut, apakah TypeScript harus memeriksanya?β
"checkJs": true
jsx
βBagaimana JSX diproses?β
Biasanya relevan untuk React/JSX.
declaration
βBuatkan file
.d.tsyang menjelaskan API/type library saya.β
"declaration": true
declarationMap
βBuat mapping untuk declaration files.β
Lebih advanced dan biasanya berguna saat membuat library.
sourceMap
βHubungkan JavaScript hasil compile dengan source asli supaya saya bisa debugging source TypeScript.β
"sourceMap": true
π§ Cheat Sheet Super Singkat
allowJs
β
.js boleh ikut?
checkJs
β
.js diperiksa?
jsx
β
JSX diproses bagaimana?
declaration
β
buat .d.ts
declarationMap
β
mapping .d.ts
sourceMap
β
debug .ts walaupun browser menjalankan .js
Dan khusus sourceMap, hafalkan alur ini:
app.ts
β
β tsc
β
app.js
β
β
Browser
β
Developer Tools
β
β
app.js.map
β
β
app.ts
Inti lecture ini: allowJs dan checkJs membantu project yang menggunakan JavaScript + TypeScript, sedangkan sourceMap membantu kita tetap debugging kode TypeScript asli meskipun browser sebenarnya menjalankan JavaScript hasil compilation.