├── README.md ├── build-app-bundle-dengan-flutter.md ├── build-micro-fe-module-federation.md ├── dasar-dasar-sql.md ├── kenalan-dengan-deno.md ├── kenalan-dengan-go.md ├── kenalan-dengan-nodejs.md ├── kenalan-dengan-npm.md ├── kenalan-dengan-react.md ├── kenalan-dengan-typescript.md ├── memulai-dengan-git.md ├── menggunakan-eslint-dan-git-hook.md ├── oop-dalam-php.md ├── penulisan-es6-dan-pengenalan-fitur.md └── referensi-tool-programing.md /README.md: -------------------------------------------------------------------------------- 1 | # Programming Notes 2 | 3 | Ini adalah kumpulan catatan tentang teknologi khususnya di bidang 4 | programming & development 😎. silahkan bagi temen-temen yang mau share catatan 5 | hasil belajar temen-temen di repo ini langsung aja fork ya 😎dan jangan lupa 6 | klik ⭐️ nya ya 😃 7 | 8 | ## Cara Menambahkan Catatan Baru 9 | 10 | - Fork repo ini, dan buat branch baru 11 | - PR ke branch master dari repo ini 12 | - Jangan menambahkan kontributor sendiri ! 😃 13 | - Makasih buat kontribusinya, jangan lupa di share dan semoga bermanfaat 14 | 15 | ## List Catatan 16 | 17 | 1. [Penulisan ES6 & Pengenalan Fitur](https://github.com/randyviandaputra/my-notes/blob/master/penulisan-es6-dan-pengenalan-fitur.md) 18 | 2. [Kenalan dengan React](https://github.com/randyviandaputra/my-notes/blob/master/kenalan-dengan-react.md) 19 | 3. [Memulai dengan Git](https://github.com/randyviandaputra/my-notes/blob/master/memulai-dengan-git.md) 20 | 21 | ## Kontak Saya 22 | 23 | - Email : modulloe@gmail.com 24 | - Telegram : [@randyvp](https://t.me/randyvp) 25 | 26 | ## Kontributor 27 | 28 | | [
Randy Vianda Putra](https://github.com/randyviandaputra) | [
Ilham Fadillah](https://github.com/positiveneutron) | 29 | | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------: | 30 | 31 | 32 | ## License 33 | 34 | [MIT](http://opensource.org/licenses/MIT) Copyright (c) 2019 - Randy Vianda 35 | Putra 36 | -------------------------------------------------------------------------------- /build-app-bundle-dengan-flutter.md: -------------------------------------------------------------------------------- 1 | # Cara Build App Bundle dengan Flutter 2 | 3 | ## Daftar Isi 4 | - [App Bundle](#intro) 5 | - [Mengapa App Bundle](#mengapa-app-bundle) 6 | - [Build App Bundle](#build-app-bundle) 7 | - [Kesimpulan](#kesimpulan) 8 | 9 | ## App Bundle 10 | 11 | App Bundle merupakan format distribusi yang baru dan lebih efisien untuk membuat dan merelease suatu aplikasi. App Bundle mulai dikenalkan oleh Google pada tahun 2018. 12 | 13 | ## Mengapa App Bundle 14 | 15 | - App Bundle memiliki ukuran yang lebih kecil dibandingkan APK. 16 | - Memiliki user experience yang lebih baik untuk pengguna, karena App Bundle menyediakan apa yang benar-benar dibutuhkan. Seperti ukuran density, bahasa, resources. 17 | - Apabila pengembangan aplikasi menggunakan modular App Bundle sangat menguntungkan, dapat melakukan kostumisasi feature delivery. 18 | 19 | ## Build App Bundle 20 | 21 | Pertama, siapkan project aplikasi Flutter yang akan kamu build. Kamu dapat menggunakan Android Studio ataupun Visual Studio Code. 22 | 23 | ### Membuat keystore 24 | Untuk Mac / Linux, ketik perintah berikut di terminal : 25 | ``` 26 | keytool -genkey -v -keystore ~/nama_file_.jks -keyalg RSA -keysize 2048 -validity 10000 -alias key 27 | ``` 28 | Untuk Windows, gunakan perintah berikut : 29 | ``` 30 | keytool -genkey -v -keystore c:/Users/USER_NAME/nama_file.jks -storetype JKS -keyalg RSA -keysize 2048 -validity 10000 -alias key 31 | ``` 32 | Kemudian tekan enter, ikuti langkah-langkah berikut : 33 | 1. Masukan keystore password 34 | 2. Masukan password konfirmasi 35 | 3. Masukan nama depan dan nama belakang 36 | 4. Masukan unit organisasi 37 | 5. Masukan nama organisasi 38 | 6. Masukan nama kota 39 | 7. Masukan negara atau provinsi 40 | 8. Masukan 2 huruf dari kode negara asal 41 | 9. Jika sudah yakin ketik yes, jika belum ketik no 42 | 10. Tunggu beberapa saat, maka file keystore sudah berhasil dibuat 43 | 44 | ### Note 45 | Untuk keystore simpan ditempat yang aman, jangan sampai hilang. Karena apabila kalian lupa atau keystorenya hilang maka aplikasi yang kamu release tidak bisa diupdate lagi. 46 | 47 | ### Integrasi keystore 48 | Buat file baru bernama key.properties didalam folder project_kamu/android/key.properties. Kemudian isi seperti berikut : 49 | ``` 50 | storePassword= Masukan password store sebelumnya 51 | keyPassword= Masukan password key sebelumnya 52 | keyAlias= Masukan keyAlias 53 | storeFile= Masukan lokasi file keystore, contoh User/file/key.jks 54 | ``` 55 | 56 | ### Konfigurasi gradle 57 | Buka project_flutter/android/app/build.gradle 58 | 59 | Tambahkan kode berikut sebelum android { } 60 | ``` 61 | def keystoreProperties = new Properties() 62 | def keystorePropertiesFile = rootProject.file('key.properties') 63 | if (keystorePropertiesFile.exists()) { 64 | keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) 65 | } 66 | ``` 67 | 68 | Tambahkan dan ubah pada bagian buildTypes { } menjadi seperti berikut : 69 | ``` 70 | signingConfigs { 71 | release { 72 | keyAlias keystoreProperties['keyAlias'] 73 | keyPassword keystoreProperties['keyPassword'] 74 | storeFile file(keystoreProperties['storeFile']) 75 | storePassword keystoreProperties['storePassword'] 76 | } 77 | } 78 | buildTypes { 79 | release { 80 | signingConfig signingConfigs.release 81 | minifyEnabled true 82 | useProguard true 83 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 84 | } 85 | } 86 | ``` 87 | 88 | ### Menambahkan Proguard 89 | Secara default, Flutter tidak mengamankan dan melakukan minify. Untuk meningkatkan keamanan aplikasi yang akan kita release perlu ditambahkan konfigurasi proguard. Sehingga kode sumber aplikasi yang tergenerate disamarkan. 90 | 91 | Buat file baru pada folder android/app/proguard-rules.pro. Tambahkan kodenya seperti berikut : 92 | ``` 93 | ## Flutter wrapper 94 | -keep class io.flutter.app.** { *; } 95 | -keep class io.flutter.plugin.** { *; } 96 | -keep class io.flutter.util.** { *; } 97 | -keep class io.flutter.view.** { *; } 98 | -keep class io.flutter.** { *; } 99 | -keep class io.flutter.plugins.** { *; } 100 | -dontwarn io.flutter.embedding.** 101 | -dontwarn android.** 102 | ``` 103 | 104 | ### Konfigurasi Manifest 105 | Sebelum release aplikasi kamu, pastikan file AndroidManifest.xml pada folder android/app/src/main dan cek seperti label, icon, permission. Untuk menambahkan permission internet, tambahkan kode berikut didalam file AndroidManifest 106 | 107 | ``` 108 | 109 | ``` 110 | 111 | ### Build app bundle 112 | Sebelumnya saya sarankan kamu sudah update Flutter versi terbaru, karena versi lama untuk build App Bundle belum support untuk split app-armeabi-v7a dan app-arm64-v8a. 113 | 114 | Jika kamu ingin build app bundle yang otomatis versi armeabi-v7a dan arm64, gunakan perintah berikut di terminal : 115 | 116 | - Mode release : 117 | ``` 118 | flutter build appbundle --release 119 | ``` 120 | - Mode debug : 121 | ``` 122 | flutter build appbundle --debug 123 | ``` 124 | 125 | Jika kamu ingin memisahkan hanya untuk sistem yang spesifik, gunakan perintah seperti berikut contohnya : 126 | ``` 127 | flutter build appbundle --release --target-platform=android-arm 128 | ``` 129 | 130 | Tunggu sampai proses build app bundle selesai. Untuk mengecek file hasil generate, dapat dilihat pada folder : 131 | 132 | Release : 133 | project/build/app/outputs/bundle/release 134 | 135 | Debug : project/build/app/outputs/bundle/ 136 | 137 | ## Kesimpulan 138 | 139 | App Bundle sangat direkomendasikan oleh Google ketika kamu ingin release aplikasi ke Playstore. 140 | 141 | Tentunya catatan ini akan update lagi kedepannya, jangan lupa untuk share. Semoga bermanfaat ya 😃 -------------------------------------------------------------------------------- /build-micro-fe-module-federation.md: -------------------------------------------------------------------------------- 1 | ## What are micro frontends? 2 | 3 | Divide a monolithic app into multiple smaller apps. each smaller app is responsible for a distinct feature of the product. with micro frontends, multiple engineering teams can work in isolation. each smaller app is easier to understand and make changes without accidentally breaking another part of our app. 4 | 5 | ## What is the Module Federation? 6 | 7 | Introduced in Webpack 5, the Module Federation plugin gives developers a way to create multiple separate builds that form a single application. Any JavaScript application that is bundled with Webpack 5.0 or greater can dynamically load or share code and dependencies with any other at runtime. 8 | 9 | ## Why use Module Federation? 10 | 11 | - A better way to share code 12 | 13 | - Environment Independent 14 | 15 | - Resolves Dependency Issues 16 | 17 | ## Module Federation Configuration 18 | 19 | Module Federation is configuration-based, here basic configuration : 20 | ``` 21 | import {Configuration, container} from 'webpack'; 22 | 23 | export const webpackConfig: Configuration = { 24 | plugins: [ 25 | new container.ModuleFederationPlugin({ 26 | name: '', 27 | shared: [] 28 | }) 29 | ] 30 | }; 31 | export default webpackConfig; 32 | ``` 33 | Here are the key configuration options need to know. 34 | 35 | ### Name 36 | 37 | Name is the unique name for the exposed container. Module Federation uses the ContainerPlugin and when it is initialized, the name you entered will be used as the file name for the container’s relative path. 38 | ``` 39 | plugins: [ 40 | new container.ModuleFederationPlugin({ 41 | name: 'shop', 42 | }) 43 | ] 44 | }; 45 | ``` 46 | ### Filename 47 | 48 | Filename is used to specify the file name for the output bundle that also serves as an entry point to the bundle. 49 | ``` 50 | plugins: [ 51 | new container.ModuleFederationPlugin({ 52 | filename: 'shop/remoteHome.js' 53 | }) 54 | ] 55 | ``` 56 | ### Remote 57 | 58 | The remote option is a list of static remote modules that can be accessed by the local module. Remote can be an array or an object. 59 | ``` 60 | plugins: [ 61 | new container.ModuleFederationPlugin({ 62 | remotes: { 63 | ShopModule: 'ShopModule@http://localhost:3100/remoteHome.js' 64 | } 65 | }) 66 | ] 67 | ``` 68 | ### Exposes 69 | 70 | This is the path to the module or files exposed by the container; it can be an object or an array. 71 | ``` 72 | plugins: [ 73 | new container.ModuleFederationPlugin({ 74 | exposes: { 75 | HomeComponent: './projects/app1-home/src/app/home/home.component.ts', 76 | ShopModule: './projects/app1-home/src/app/shop/shop.module.ts' 77 | } 78 | }) 79 | ] 80 | ``` 81 | With Module Federation you can share not just modules, but other file types. The above configuration shows how to expose two different files. -------------------------------------------------------------------------------- /dasar-dasar-sql.md: -------------------------------------------------------------------------------- 1 | # Dasar-Dasar SQL 2 | 3 | Structured Query Language (SQL) adalah bahasa database standar yang digunakan dalam operasi basis data relasional. Baik itu untuk membuat, memelihara, dan serta melakukan operasi dasar seperti CRUD (create, retrieve, update, delete) hingga operasi kompleks yang melibatkan manipulasi data serta operasi aritmatika pada basis data relasional. Beberapa contoh basis data relasional yang umum digunakan adalah MySQL, PostgreSQL, dan SQL Server. 4 | 5 | Beberapa hal yang perlu diketahui dalam penggunaan SQL adalah SQL tidak case sensitive, artinya penulisan perintah-perintah pada SQL tidak terpengaruh oleh huruf kecil ataupun huruf besar. Namun disarankan mengkapitalkan kata-kata kunci seperti SELECT, UPDATE, DELETE dst. Untuk pembuatan tabel dan kolom, juga disarankan untuk menggunakan huruf kecil. 6 | 7 | Saat menjalankan beberapa perintah SQL atau umumnya disebut query ada kalanya kita ingin mendisable atau tidak menjalankan baris/query tertentu, hal yang dilakukan adalah dengan menambahkan tanda hubung ganda (--) di awal baris. Hal ini ekivalen dengan garis miring ganda (//) untuk tidak mengeksekusi baris tertentu pada beberapa bahasa pemrograman, misalnya PHP. 8 | 9 | Meskipun ada standar [ISO]() untuk penulisan SQL, namun pada implementasinya ada sedikit perbedaan dalam sintaks masing-masing basis data relasional. Jadi ada beberapa kemungkinan dimana ada sintaks yang berfungis di SQL Server tapi tidak berfungsi jika dijalankan di MySQL, begitupun sebaliknya. 10 | 11 | ### Primary Key 12 | Silahkan ditambahkan 13 | 14 | ### Foreign Key 15 | Silahkan ditambahkan 16 | 17 | ### Collation 18 | Silahkan ditambahkan 19 | 20 | ## Tipe Data 21 | Silahkan ditambahkan 22 | 23 | ## Sintaks Dasar SQL 24 | Beberapa perintah dasar dalam SQL meliputi perintah-perintah yang diperlukan dalam operasi dalam membuat dan menghapus database dan tabel di dalamnya, serta membuat, mengambil, memperbaharui dan memghapus data tertentu pada database. 25 | 26 | ### Membuat Database 27 | ```sql 28 | CREATE DATABASE nama_database; 29 | ``` 30 | 31 | ### Menghapus Database 32 | ```sql 33 | DROP DATABASE nama_database; 34 | ``` 35 | 36 | ### Membuat Tabel 37 | ```sql 38 | CREATE TABLE nama_tabel (kolom1 tipe_data(ukuran), column2 tipe_data(ukuran), column3 tipe_data(ukuran)); 39 | ``` 40 | 41 | ### Menghapus Tabel 42 | ```sql 43 | DROP TABLE nama_tabel; 44 | ``` 45 | 46 | ### Mengosongkan Tabel 47 | ```sql 48 | TRUNCATE TABLE nama_tabel; 49 | ``` 50 | 51 | > **Silahkan tambahkan catatan tambahan apa perbedaan antara perintah `DROP` dan perintah `TRUNCATE`** 52 | 53 | ## Operator 54 | 55 | **tunggu untuk langkah selanjutnya ... 😃** 56 | -------------------------------------------------------------------------------- /kenalan-dengan-deno.md: -------------------------------------------------------------------------------- 1 | # Kenalan dengan Deno 2 | -------------------------------------------------------------------------------- /kenalan-dengan-go.md: -------------------------------------------------------------------------------- 1 | # Kenalan dengan Go 2 | 3 | ## Daftar Isi 4 | 5 | - [Hello World](#hello-world) 6 | - [Variable](#variable) 7 | - [Function](#function) 8 | - [Pointer](#pointer) 9 | 10 | 11 | 12 | ## Hello World 13 | Program dalam Go terbuat dari paket - paket (`package`). Dan program mulai berjalan dalam `package` bernama `main` 14 | 15 | ``` 16 | package main 17 | 18 | import ( 19 | "fmt" 20 | ) 21 | 22 | func main() { 23 | fmt.Println("Hello World") // Hello World 24 | } 25 | ``` 26 | 27 | 28 | 29 | ## Variable 30 | Variable dalam Go dapat dideklarasikan dengan perintah `var` diikuti nama variable dan tipe data di akhir 31 | 32 | ``` 33 | package main 34 | 35 | import ( 36 | "fmt" 37 | ) 38 | 39 | var name string = "John Doe" 40 | var age int = 19 41 | 42 | func main() { 43 | fmt.Println(name) // John Doe 44 | fmt.Println(age) // 19 45 | } 46 | ``` 47 | 48 | Adapun cara singkat dalam medeklarasikan variabel yakni dengan statement `:=`. Dengan cara ini variabel akan secara terdeteksi tipe datanya. Namun cara ini hanya bisa dilakukan dalam fungsi 49 | 50 | ``` 51 | package main 52 | 53 | import ( 54 | "fmt" 55 | ) 56 | 57 | func main() { 58 | name := "John Doe" 59 | age := 19 60 | 61 | fmt.Println(name) // John Doe 62 | fmt.Println(age) // 19 63 | } 64 | ``` 65 | 66 | Dalam Go, dapat juga mendeklarasikan varible konstanta (varible yang nilainya tidak dapat diubah) dengan perintah `const`. Konstanta tidak dapat dideklarasikan dengan cara singkat seperti di atas 67 | 68 | ``` 69 | package main 70 | 71 | import "fmt" 72 | 73 | func main() { 74 | const name string = "John Doe" 75 | 76 | fmt.Println("Hello my name is", name) // Hello my name is John Doe 77 | } 78 | ``` 79 | 80 | 81 | 82 | ## Function 83 | Hampir sama dengan variable. Function dalam Go dapat dideklarasikan dengan perintah `func` diikuti nama function, tanda kurung dan tipe data di akhir. Tipe data tersebut merupakan tipe data dari nilai yang di-return oleh function tersebut (jika ada nilai yang di-return) 84 | 85 | ``` 86 | package main 87 | 88 | import ( 89 | "fmt" 90 | ) 91 | 92 | func greet() string { 93 | return "Hello world, this is my Go demo"; 94 | } 95 | 96 | func main() { 97 | fmt.Println(greet()) // Hello world, this is my Go demo 98 | } 99 | ``` 100 | 101 | Argumen juga dapat ditambahkan ke function dengan mendeklarasikan nama variable argumen diikuti tipe data dalam tanda kurung function 102 | 103 | ``` 104 | package main 105 | 106 | import ( 107 | "fmt" 108 | ) 109 | 110 | func greet() string { 111 | return "Hello world, this is my Go demo"; 112 | } 113 | 114 | func addAge(a int, b int) int { 115 | return a + b 116 | } 117 | 118 | func main() { 119 | age := 19 120 | 121 | fmt.Println(greet()) // Hello world, this is my Go demo 122 | fmt.Println("My age is ", addAge(age, 5)) // My age is 24 123 | } 124 | ``` 125 | 126 | 127 | 128 | ## Pointer 129 | Go memiliki pointer. Sebuah pointer menyimpan alamat memori dari sebuah nilai. Jika di-print, alamat memori akan berbentuk hexadesimal dengan awalan 0x. Untuk menggunakan pointer diperlukan operator `*` dan `&` 130 | 131 | Operator `&` mengambil alamat memori dari sebuah variable 132 | ``` 133 | i := 42 134 | p = &i 135 | 136 | fmt.Println(p) // 0x****** 137 | ``` 138 | 139 | Operator `*` mengambail nilai dari alamat memori 140 | ``` 141 | fmt.Println(*p) // 42 142 | 143 | *p = 21 144 | ``` 145 | 146 | ``` 147 | package main 148 | 149 | import "fmt" 150 | 151 | func main() { 152 | i := 42 153 | p := &i 154 | 155 | fmt.Println(p) // 0x****** 156 | fmt.Println(*p) // 42 157 | 158 | *p = 21 159 | 160 | fmt.Println(i) // 21 161 | } 162 | ``` 163 | -------------------------------------------------------------------------------- /kenalan-dengan-nodejs.md: -------------------------------------------------------------------------------- 1 | # NodeJS Crash Course 2 | 3 | Untuk memulai belajar NodeJS pertama-tama install terlebih dahulu NodeJS nya. NodeJS bisa didownload di link berikut: . Download versi yang terbaru. 4 | 5 | Apabila instalasi telah selesai, ketikkan `node --v` untuk memastikan bahwa NodeJS telah berhasil terinstall. 6 | 7 | Pada terminal kamu juga bisa secara langsung mencoba menuliskan kode melalui _REPL_ singkatan dari _Read Eval Print Loop_, mudahnya memungkinkan kita menulis kode JavaScript di console. 8 | 9 | ![1556978502785](https://i.ibb.co/KWD66t3/1556978502785.png) 10 | 11 | Untuk keluar dari REPL, tekan `CTRL + C`. Meski kita bisa menuliskan kode JavaScript di terminal, kita tentu tidak akan menuliskannya disana, disini saya akan menggunakan Visual Studio Code sebagai kode editor. 12 | 13 | Disini saya bekerja di Visual Studio Code pada folder `NODE_CRASH_COURSE`. 14 | 15 | ## Membuat Package.json 16 | 17 | Biasanya yang pertama kali kita lakukan ketika membuat project node adalah membuat `package.json`. Kita tidak perlu membuat file ini secara manual, kita akan menggenerate file nya dengan cara mengetikkan di terminal `npm init`. Kemudian isilah beberapa pertanyaan yang diajukan. 18 | 19 | `package.json` sendiri tujuan utamanya adalah menyimpan daftar _dependency-dependency_ yang aplikasi kita gunakan. Sehingga, ketika kita berganti komputer kita bisa langsung menginstall _dependency_ yang ada di daftar `package.json` akan diinstall semuanya dengan cara mengetikkan `npm install` di terminal. 20 | 21 | Maksud dari _dependency_ diatas adalah misalnya kita menginstall suatu _package atau module_ di aplikasi kita dengan cara `npm install nama_package`. 22 | 23 | ### Contoh Instalasi Package 24 | 25 | Disini kita akan coba menginstall sebuah package bernama `uuid`. Package ini berfungsi untuk menggenerate id secara random. 26 | 27 | Ketikkan di terminal `npm install uuid`. Setelah berhasil, maka akan terbuat folder `node_modules` yang mana di dalamnya ada modul `uuid`. Dan pada `package.json` juga akan terupdate bahwa terdapat _dependency_. **Package yang kita install akan diletakkan di dalam folder `node_modules`**. 28 | 29 | ### Dev Dependency 30 | 31 | Ada juga yang dinamakan _dev dependency_ dimana hanya diperlukan sewaktu _development_ atau pengembangan saja, tidak ketika aplikasi kita _deploy_ ke internet. 32 | 33 | Sekarang kita akan menginstall `nodemon` dimana package ini berguna untuk ketika kita ada perubahan pada kode, kita tidak perlu me-restart ulang server nya. `nodemon` akan kita install saat development saja. 34 | 35 | Ketikkan perintah berikut: `npm install --save-dev nodemon` atau lebih singkatnya `npm install -D nodemon`. 36 | 37 | ### NPM Install 38 | 39 | Misalnya kita ingin mengupload file aplikasi kita dan menggunakannya di komputer lain. Kita tidak meng-upload folder `node_modules`. Folder tersebut berisikan banyak sekali file dari _dependency_ yang aplikasi kita gunakan. Olehkarenanya, cobalah hapus folder `node_modules`, kemudian ketikkan di terminal `npm install`. Maka npm akan menginstall modul-modul yang diperlukan aplikasi kita. 40 | 41 | ## Hello World 42 | 43 | Selanjutnya, buatlah file `index.js` di folder utama, kemudian ketikkanlah kode berikut: 44 | 45 | ```javascript 46 | console.log('Hello from NodeJS...'); 47 | ``` 48 | 49 | Untuk menjalankan file ini, ketikkan di terminal `node index` atau `node index.js`. 50 | 51 | Berikut screenshot hasil nya: 52 | 53 | ![1556980124756](https://i.ibb.co/zhbH6VR/1556980124756.png) 54 | 55 | Pada kenyataannya nanti, ketika mengembangkan aplikasi kita akan memiliki banyak file. Tidak hanya satu file. File itu bisa berisi suatu _class, function_ dan lain-lain yang nantinya akan di-_export_ sehingga dapat kita gunakan. 56 | 57 | ## Membuat Module 58 | 59 | Buatlah sebuah file bernama `person.js`, lalu ketikkan kode berikut: 60 | 61 | ```java 62 | const person = { 63 | name: 'Fadli Hidayatullah', 64 | age: 22 65 | }; 66 | 67 | module.exports = person; 68 | ``` 69 | 70 | `module.exports = person` berfungsi untuk meng-ekspor `person` sehingga bisa digunakan di tempat lain. Jadi ketika modul ini di-_require_ di tempat lain, `person` inilah yang akan dikembalikan. Untuk dapat menggunakannya pada tempat lain misalnya di `index.js`. Kita gunakan fungsi `require(lokasi_file)`. 71 | 72 | Selanjutnya, pada `index.js` ketikkan kode berikut: 73 | 74 | ```javascript 75 | // ... 76 | const person = require('./person'); 77 | 78 | console.log(person); 79 | console.log(person.name); 80 | ``` 81 | 82 | Berikut hasilnya: 83 | 84 | ![1556980644672](https://i.ibb.co/qWQzs5R/1556980644672.png) 85 | 86 | Biasanya suatu modul tidak hanya suatu objek yang di ekspor tetapi, biasanya function atau class. Olehkarenanya, ubahlah kode yang ada di `person.js` menjadi sebuah class. 87 | 88 | ```javascript 89 | console.log('person.js'); 90 | console.log(__dirname, __filename); 91 | 92 | class Person { 93 | constructor(name, age) { 94 | this.name = name; 95 | this.age = age; 96 | } 97 | 98 | greeting() { 99 | console.log(`Hi. My name is ${this.name} and I am ${this.age}.`); 100 | } 101 | } 102 | 103 | module.exports = Person; 104 | ``` 105 | 106 | Dan file `index.js` menjadi berikut: 107 | 108 | ```javascript 109 | const Person = require('./person'); 110 | 111 | const person1 = new Person('Fadli', 22); 112 | 113 | person1.greeting(); 114 | ``` 115 | 116 | Ketika file `index.js` dijalankan maka berikut hasilnya: 117 | 118 | ![1556981230630](https://i.ibb.co/y6pd3KW/1556981230630.png) 119 | 120 | Ketika kita me-_require_ suatu modul, file yang di-_require_ kode nya juga akan dijalankan. Oleh sebab itulah mengapa `person.js` dan informasi `__dirname` dan `__filename` tampil pada terminal. 121 | 122 | ## Node Core Modules 123 | 124 | Sekarang, kita akan mencoba menggunakan modul-modul yang sudah disediakan oleh NodeJS. 125 | 126 | ### Modul Path 127 | 128 | Pada NodeJS terdapat package `path` yang bisa digunakan untuk bekerja dengan file dan direktori path. Disini kita akan melihat sekilas beberapa method yang nantinya akan kita gunakan. 129 | 130 | Buatlah sebuah folder baru bernama `reference`, kemudian buat file `path_demo.js`. Tulislah kode berikut ini: 131 | 132 | ```javascript 133 | const path = require('path'); 134 | 135 | // File name 136 | console.log(path.basename(__filename)); 137 | 138 | // Directory name 139 | console.log(path.dirname(__filename)); 140 | 141 | // Create path object 142 | console.log(path.parse(__filename).dir); 143 | 144 | // Concatenate paths 145 | console.log(path.join(__dirname, 'test', 'hello.html')); 146 | ``` 147 | 148 | ### Modul FS 149 | 150 | Disini kita akan mencoba bekerja dengan file sistem, diantaranya adalah: 151 | 152 | - Membuat folder 153 | - Membuat sekaligus menulis file 154 | - Meng-append file 155 | - Membaca file 156 | 157 | Buatlah sebuah file baru bernama `fs_demo.js` pada folder `reference`, kemudian tuliskan kode berikut: 158 | 159 | ```javascript 160 | const fs = require('fs'); 161 | const path = require('path'); 162 | 163 | // Create folder 164 | fs.mkdir(path.join(__dirname, '/test'), (err) => { 165 | // if (err) throw err; 166 | 167 | console.log('Folder created ...'); 168 | }); 169 | 170 | // Create and write to file 171 | fs.writeFile( 172 | path.join(__dirname, '/test', 'hello.txt'), 173 | 'Hello world!', 174 | (err) => { 175 | if (err) throw err; 176 | 177 | console.log('File written to ...'); 178 | 179 | // Append file 180 | fs.appendFile( 181 | path.join(__dirname, '/test', 'hello.txt'), 182 | 'Welcome Ramadhan Mubarrak', 183 | (err) => { 184 | if (err) throw err; 185 | 186 | console.log('File appended to ...'); 187 | }, 188 | ); 189 | }, 190 | ); 191 | 192 | // Read file 193 | fs.readFile(path.join(__dirname, '/test', 'hello.txt'), 'utf8', (err, data) => { 194 | if (err) throw err; 195 | 196 | console.log('Read data: '); 197 | console.log(data); 198 | }); 199 | ``` 200 | 201 | Terdapat metode _Synchronous_ dan _Asynchronous_. Ketika kita menggunakan Asynchronous maka kita harus menuliskan _function callback_-nya. 202 | 203 | ### Module OS 204 | 205 | Modul selanjutnya adalah modul `os`, memungkinkan kita untuk mengetahui informasi tentang Sistem Operasi dari platform yang sedang digunakan. 206 | 207 | Buatlah sebuah file baru bernama `os_demo.js` pada folder `reference`. Tulislah kode berikut ini: 208 | 209 | ```javascript 210 | const os = require('os'); 211 | 212 | // Platform 213 | console.log(os.platform()); 214 | 215 | // CPU Arch 216 | console.log(os.arch()); 217 | 218 | // CPU Core Info 219 | console.log(os.cpus()); 220 | 221 | // Free memory 222 | console.log(os.freemem()); 223 | 224 | // Total memory 225 | console.log(os.totalmem()); 226 | 227 | // Home directory 228 | console.log(os.homedir()); 229 | 230 | // OS Type 231 | console.log(os.type()); 232 | 233 | // Uptime 234 | console.log(os.uptime()); 235 | ``` 236 | 237 | ### Module URL 238 | 239 | Selanjutnya adalah modul `url` yang memungkinkan kita untuk bekerja dengan URL. 240 | 241 | Buatlah file baru bernama `url_demo.js` pada folder `reference`. Tuliskan kode berikut ini: 242 | 243 | ```javascript 244 | const url = require('url'); 245 | 246 | const myUrl = new URL( 247 | 'http://fadlihdytullah.id/hello.html?id=10&status=active', 248 | ); 249 | 250 | // Serialize URL 251 | console.log(myUrl.href); 252 | console.log(myUrl.toString()); 253 | 254 | // Host (root domain) 255 | console.log(myUrl.host); 256 | // Host (does not get port) 257 | console.log(myUrl.hostname); 258 | 259 | // Path name 260 | console.log(myUrl.pathname); 261 | 262 | // Serialize query 263 | console.log(myUrl.search); 264 | // Params object 265 | console.log(myUrl.searchParams); 266 | 267 | // Add param 268 | console.log(myUrl.searchParams.append('abc', '123')); 269 | 270 | // Loop through params 271 | myUrl.searchParams.forEach((value, key) => { 272 | console.log(`${key}: ${value}`); 273 | }); 274 | ``` 275 | 276 | ## EventEmitter 277 | 278 | Terkadang adakalanya lebih baik kita mengganti _callbacks_ dan _promises_ dengan _EventEmitter_. Mungkin untuk awal-awal agak sulit untuk dimengerti, namun mudahnya, kita bisa membuat _events listener_ dari suatu object dan mengaktifkannya. 279 | 280 | Untuk dapat menggunakan EventEmitter kita menggunakan modul `events`. Kita bisa men-_extend_ EventEmitter pada suatu class ataupun mewarisi sifat dari EventEmitter dengan modul `util`. 281 | 282 | Buatlah file baru bernama `event_demo.js` pada folder `reference`, kemudian tuliskan kode berikut: 283 | 284 | ```javascript 285 | const EventEmitter = require('events').EventEmitter; 286 | const util = require('util'); 287 | 288 | const myObject = function(thing) { 289 | EventEmitter.call(this); 290 | }; 291 | 292 | util.inherits(myObject, EventEmitter); 293 | 294 | myObject.prototype.doSomething = function(thing) { 295 | this.emit('something', thing); 296 | 297 | return this; // make it chainable method, for ease of use 298 | }; 299 | 300 | const obj = new myObject(); 301 | obj.on('something', (thing) => console.log(thing)); 302 | 303 | obj 304 | .doSomething('Ohayou!') 305 | .doSomething('Nan da yo') 306 | .doSomething('Yare yare na kimi wa...'); 307 | ``` 308 | 309 | Kemudian jalankan file tersebut, maka hasilnya adalah sebagai berikut: 310 | 311 | ![1557099198368](https://i.ibb.co/C8WPNhg/1557099198368.png) 312 | 313 | Selanjutnya buatlah file `logger.js` pada project folder, kemudian tuliskan kode berikut: 314 | 315 | ```javascript 316 | const EventEmitter = require('events'); 317 | const uuid = require('uuid'); 318 | 319 | module.exports = class Logger extends EventEmitter { 320 | log(msg) { 321 | this.emit('message', { id: uuid.v4(), msg }); 322 | return this; 323 | } 324 | }; 325 | ``` 326 | 327 | Pada `index.js`, kita akan menggunakan kelas `Logger`. 328 | 329 | ```javascript 330 | // ... kode sebelumnya 331 | const Logger = require('./logger'); 332 | 333 | const loggerObj = new Logger(); 334 | loggerObj.on('message', (data) => console.log(data)); 335 | 336 | loggerObj 337 | .log('Yare2 na') 338 | .log('Nan da yo') 339 | .log('Wakatta yo!'); 340 | ``` 341 | 342 | Ketika `index.js` dijalankan maka berikut hasilnya: 343 | 344 | ![1557099523275](https://i.ibb.co/6tVt3rh/1557099523275.png) 345 | 346 | > Referensi lebih lanjut: 347 | > > 348 | 349 | ## Membuat Server 350 | 351 | Untuk membuat server kita membutuhkan modul `http`. Berikut contoh sederhana dalam membuat server. 352 | 353 | Buatlah sebuah file baru bernama `http_demo.js` pada folder `reference`. Tulislah kode berikut: 354 | 355 | ```javascript 356 | const http = require('http'); 357 | 358 | http 359 | .createServer((req, res) => { 360 | res.end('Yosh! Sugoi desu.'); 361 | }) 362 | .listen(5000, () => console.log('Server running ...')); 363 | ``` 364 | 365 | Method `createServer()` membutuhkan function callback yang memiliki dua parameter, yakni `req` sebagai _request_ dan `res` sebagai _response_. 366 | 367 | Agar si server dapat bekerja maka kita harus membuat si server _listen_ terhadap suatu port tertentu, misalnya 5000. 368 | 369 | Maka ketika kita menjalankan file tersebut, server berhasil dibuat. 370 | 371 | ![1557102194790](https://i.ibb.co/Qcy0m0h/1557102194790.png) 372 | 373 | ### Merender File HTML 374 | 375 | Sejatinya, server nantinya akan menyajikan file HTML untuk ditampilkan pada user. Misalnya user melakukan request pada halaman utama, halaman about, halaman contact. 376 | 377 | Hapuslah semua kode pada `index.js`, kemudian tuliskan kode berikut: 378 | 379 | ```javascript 380 | const http = require('http'); 381 | const path = require('path'); 382 | const fs = require('fs'); 383 | 384 | const PORT = process.env.PORT || 5000; 385 | const server = http.createServer((req, res) => { 386 | res.end('

Home

'); 387 | }); 388 | 389 | server.listen(PORT, () => console.log(`Server is running on port ${PORT}`)); 390 | ``` 391 | 392 | Kita menggunakan `process.env.PORT` disini karena nantinya kita akan menyesuaikan port dari _environment_ yang kita gunakan, jika tidak ditemukan maka gunakan port 5000. 393 | 394 | Untuk mengetahui URL apa yang sedang diakses oleh user, kita gunakan `req.url`. Sehingga, kita bisa membuat rute atau _routing_ mengenai file mana yang nantinya kita akan render. 395 | 396 | Kita jug bisa menuliskan kode HTML pada `res.end()`. 397 | 398 | Jalankan lah file tersebut, akses `localhost:5000` atau sesuaikan port nya. Tapi, ketika kita mengubah file `index.js` , misalnya dari `res.end('

Home

')` menjadi `res.end('

Homepage

');` kita diharuskan me-restart server agar terjadi perubahan. 399 | 400 | Maka dari itulah sebelumnya kita install package `nodemon`, sehingga jika terjadi perubahan maka akan ter-restart otomatis. 401 | 402 | Untuk dapat melakukannya, buka file `package.json`. Ubahlah kode: 403 | 404 | ```json 405 | { 406 | "scripts": { 407 | "test": "echo \"Error: no test specified\" && exit 1" 408 | } 409 | } 410 | ``` 411 | 412 | Menjadi, 413 | 414 | ```json 415 | { 416 | "scripts": { 417 | "start": "node index", 418 | "dev": "nodemon index" 419 | } 420 | } 421 | ``` 422 | 423 | Kode `"start": "node index"` tidak akan melakukan update perubahan, tetapi ini merupakan skrip standar yang akan dijalankan ketika kita men-_deploy_ aplikasi kita. 424 | 425 | Kode yang membuat update perubahan secara otomatis yang akan kita lakukan saat _dev_ adalah `"dev" : "nodemon index"`. Untuk dapat menjalankan skrip ini, pada terminal ketikkan `npm run dev`. Maka apapun yang kamu ubah pada file `index.js` akan ter-update. 426 | 427 | ### Menambahkan Content-type 428 | 429 | Jika diperhatikan kita hanya menggunakan `res.end('

Homepage

')` maka ketika lihat `view page source` halaman utama nya dan _network_ nya tidaka akan kita temukan _template_ html serta _content-type_ bahwa file tersebut adalah HTML. 430 | 431 | Untuk itu tambahkan kode sebelum `res.end(

Homepage

)` dengan kode berikut: 432 | 433 | ```javascript 434 | res.writeHead(200, { 'Content-type': 'text/html' }); 435 | ``` 436 | 437 | Maka disini kita menulis _header_ nya 200 yang artinya OK, kemudian content type nya HTML. 438 | 439 | ### Merender File HTML 440 | 441 | Untuk melakukannya kita akan menggunakan modul `fs` untuk membaca file HTML nya, dan `path` untuk lokasi filenya. 442 | 443 | Buatlah folder baru pada root folder, berilah nama `public`. Pada folder inilah kita akan meletakkan file-file HTML dan CSS kita nantinya. 444 | 445 | Buatlah 2 file, yakni `index.html` dan `about.html`. Masing-masing kode nya dibawah ini: 446 | 447 | ```html 448 | 449 | 450 | 451 | 452 | 453 | 454 | Welcome 455 | 456 | 457 |

Welcome to the homepage

458 | 459 | 460 | ``` 461 | 462 | ```html 463 | 464 | 465 | 466 | 467 | 468 | 469 | About 470 | 471 | 472 |

About

473 | 474 | 475 | ``` 476 | 477 | Selanjutnya, kembalilah ke `index.html`. Ubahlah kode berikut ini, 478 | 479 | ```javascript 480 | if (req.url === '/') { 481 | res.writeHead(200, { 'Content-type': 'text/html' }); 482 | res.end('

Homepage

'); 483 | } 484 | ``` 485 | 486 | Menjadi, 487 | 488 | ```javascript 489 | if (req.url === '/') { 490 | fs.readFile(path.join(__dirname, 'public', 'index.html'), (err, content) => { 491 | if (err) throw err; 492 | 493 | res.writeHead(200, { 'Content-type': 'text/html' }); 494 | res.end(content); 495 | }); 496 | } 497 | 498 | if (req.url === '/about') { 499 | fs.readFile(path.join(__dirname, 'public', 'about.html'), (err, content) => { 500 | if (err) throw err; 501 | 502 | res.writeHead(200, { 'Content-type': 'text/html' }); 503 | res.end(content); 504 | }); 505 | } 506 | ``` 507 | 508 | #### RESTApi & Microservices 509 | 510 | Adakalanya nanti kamu akan mengembangkan suatu RESTApi atau microservices, yang biasanya data yang dikirim dalam bentuk JSON. Meskipun biasanya kita melakukannya menggunakan _express_, berikut cara melakukannya pada NodeJS. 511 | 512 | Tambahkan kode berikut ini setelah penutup _if_ untu route `/about`. 513 | 514 | ```javascript 515 | if (req.url === '/api/user') { 516 | const users = [ 517 | { id: 1, name: 'fadlihdytullah', age: 22 }, 518 | { id: 2, name: 'yusriron', age: 20 }, 519 | ]; 520 | 521 | res.writeHead(200, { 'Content-type': 'application/json' }); 522 | res.end(JSON.stringify(users)); 523 | } 524 | ``` 525 | -------------------------------------------------------------------------------- /kenalan-dengan-npm.md: -------------------------------------------------------------------------------- 1 | # NPM Crash Course 2 | 3 | Adakalanya kamu ingin menginstall suatu library, dengan NPM kita bisa melakukannya dengan mudah. 4 | 5 | ## Pengenalan Apa Itu NPM 6 | 7 | **Node Package Manager** 8 | 9 | Jika kamu pernah bekerja dengan teknologi lain, pada Ruby ada _Ruby Gems_, pada Python ada _Pip_, mudahnya NPM adalah _JavaScript Package Manager_ memudahkan kamu untuk menginstall modul/package/library dengan mudah, misalnya menginstall _Bootstrap, JQuery, Express_. 10 | 11 | **Pre-Installed with Node.js** 12 | 13 | **Instalasi modul/package di sistem kita dengan mudah** 14 | 15 | Modul ataupun package mudahnya library JavaScript. 16 | 17 | **Membuat developer mudah untuk berbagi _reuse_ kode** 18 | 19 | ## Apa yang Akan Kamu Pelajari 20 | 21 | - Install, remove, update, & list package 22 | - Berkenalan dengan _package.json_ 23 | - Local & global package 24 | - Dependency & dev-dependency 25 | - Commands & Shortcuts 26 | - Versioning 27 | - NPM Scripts 28 | 29 | ## Menggunakan NPM 30 | 31 | Untuk dapat menggunakan NPM, kamu harus menginstall Node.js terlebih dahulu. Node.js bisa di download di link berikut: 32 | 33 | Untuk melihat-lihat package yang ada di NPM, kamu bisa mengunjungi situs . 34 | 35 | Kita akan bermain-main dengan command NPM di terminal, olehkarena, buatlah project baru bernama `npm-app`, buka folder tersebut di teks editor kamu, kemudian bukalah terminal, pastikan terminal path nya ada di project folder tersebut. Disarankan menggunakan _git bash_ untuk terminal nya, jika kamu menggunakan windows. 36 | 37 | - `npm -v` atau `npm --version`, melihat versi NPM 38 | - `npm` melihat seluruh daftar command pada NPM 39 | 40 | ## Package.json File 41 | 42 | File `package.json` merupakan file yang sangat penting dalam dunia JavaScript, file ini berisi _manifest_ dan informasi mengenai app kita. 43 | 44 | Tapi, yang paling penting adalah di dalam file ini terdapat daftar _dependency_ yang digunakan aplikasi kita, _nama dan versi_ dari package yang digunakan. Sehingga, ketika kita deploy aplikasi kita ke internet, maka NPM dapat menginstall semua dependency yang ada. 45 | 46 | Kita juga bisa membuat _NPM Scripts_ untuk melakukan suatu _task_. 47 | 48 | Kita bisa membuat file ini secara manual, tetapi kita bisa dengan mudah membuat file `package.json` dengan perintah `npm init`. 49 | 50 | ### Membuat File Package.json 51 | 52 | Buka kembali terminal kamu dan ketikkan `npm init`, kamu akan dipaparkan beberapa pertanyaan informasi mengenai app yang akan dibuat. 53 | 54 | Berikut pertanyaan yang diajukan: 55 | 56 | - `npm init`, membuat file `package.json` 57 | - `package name`, nama package yang diinginkan 58 | - `version`, versi dari package nya 59 | - `description`, deskripsi package 60 | - `entry point`, file utama JavaScript nya, terkadang `app.js`, adajuga `server.js` 61 | - `test command`, dikosongkan saja 62 | - `git repository` git repository nya 63 | - `keywords` kata kunci dari package nya 64 | - `author`, author dari package 65 | - `licence`, defaultnya ISC, tetapi terkadang MIT 66 | 67 | Jika kamu ingin menggunakan jawaban default nya, ketikkan perintah `npm init -y` atau `npm init --yes`. Informasi tadi bisa dirubah pada file `package.json`. 68 | 69 | ### Konfigurasi Nilai Default NPM Init 70 | 71 | Untuk **mengubah** nilai default dari `package.json` ketika di `npm init`, gunakan perintah berikut 72 | 73 | ```bash 74 | npm config set init-author-name "Fadli Hidayatullah" 75 | # atau 76 | npm set init-licence "MIT" 77 | ``` 78 | 79 | Untuk **mengetahui** nilai default dari `package.json` ketika di `npm init`, gunakan perintah berikut 80 | 81 | ```bash 82 | npm config get init-author-name 83 | # atau 84 | npm get init-licence 85 | ``` 86 | 87 | Untuk **menghapus** nilai yang kita ubah dari `package.json` ketika di `npm init` sehingga kembali ke pengaturan default, gunakan perintah berikut 88 | 89 | ```bash 90 | npm config delete init-author-name 91 | ``` 92 | 93 | ## Menginstall Package 94 | 95 | Untuk menginstall suatu package atau modul, kita gunakan perintah, 96 | 97 | ```bash 98 | npm install package_name --save 99 | ``` 100 | 101 | Flag atau opsi `--save` berguna untuk menyimpan informasi package yang diinstall, kemudian didaftarkan pada object `dependency` di `package.json`. 102 | 103 | Sebagai contoh, kita akan menginstall package `lodash`. 104 | 105 | ```bash 106 | npm install lodash --save 107 | ``` 108 | 109 | Setelah berhasil diinstall maka, 110 | 111 | - Terdapat object dependecy pada `package.json` 112 | - Terdapat folder `node_modules` yang didalamnya terdapat `lodash` 113 | 114 | Mengapa flag atau opsi `--save` sangat penting? Ketika kita mem-push project kita ke github atau misalnya memindahkan project kita ke komputer lain, kita tidak mengikutsertakan `node_modules`. Hal ini dikarenakan folder tersebut nantinya berisikan banyak sekali modul-modul yang digunakan aplikasi kita, sehingga membuat project kita ukuran nya semakin besar jika kita upload. 115 | 116 | Jadinya, dengan menggunakan `--save` ketika menginstall suatu package, kita bisa dengan mudah menginstall kembali package tersebut di tempat lain. 117 | 118 | Sebagai contoh, seseorang mengkloning project kamu yang di upload di github. Tentu, kamu tidak mengikutsertakan folder `node_modules`, semua dependecy aplikasi kamu berada di `package.json`. 119 | 120 | Gunakan perintah, 121 | 122 | ```bash 123 | npm install 124 | ``` 125 | 126 | Untuk menginstall seluruh modul-modul yang diperlukan aplikasi tersebut. 127 | 128 | Setelah berhasil menginstall package di atas, maka isi dari `package.json`, kurang lebih seperti berikut, 129 | 130 | ```json 131 | { 132 | "name": "npm-app", 133 | "version": "1.0.0", 134 | "description": "", 135 | "main": "index.js", 136 | "scripts": { 137 | "test": "echo \"Error: no test specified\" && exit 1" 138 | }, 139 | "keywords": [], 140 | "author": "", 141 | "license": "ISC", 142 | "dependencies": { 143 | "lodash": "^4.17.11" 144 | } 145 | } 146 | ``` 147 | 148 | Buatlah sebuah file baru di _project folder_, ketikkan kode berikut, 149 | 150 | ```javascript 151 | const _ = require('lodash'); 152 | 153 | const numbers = [22, 43, 23, 93, 55, 87, 1]; 154 | 155 | console.table(numbers); 156 | 157 | _.each(numbers, function(number, i) { 158 | console.log(i, number); 159 | }); 160 | ``` 161 | 162 | [![Image from Gyazo](https://i.gyazo.com/9c1595bd375c855772d569b542980a4c.png)](https://gyazo.com/9c1595bd375c855772d569b542980a4c) 163 | 164 | ## Dev Dependency 165 | 166 | Ada juga yang dinamakan _dev-dependency_ dimana dependency ini hanya kamu gunakan saat _development_ bukan pada production. 167 | 168 | Sebagai contoh yang biasa kita gunakan saat development, salah satunya `gulp` salah satu tugasnya me-_minify_ file CSS kamu. 169 | 170 | ```bash 171 | npm install gulp gulp-sass --save-dev 172 | # atau 173 | npm install gulp gulp-sass -D 174 | ``` 175 | 176 | Setelah berhasil diinstall maka pada `package.json` akan ditambahkan object `devDependencies`. 177 | 178 | ```json 179 | { 180 | "name": "npm-app", 181 | "version": "1.0.0", 182 | "description": "", 183 | "main": "index.js", 184 | "scripts": { 185 | "test": "echo \"Error: no test specified\" && exit 1" 186 | }, 187 | "keywords": [], 188 | "author": "", 189 | "license": "ISC", 190 | "dependencies": { 191 | "lodash": "^4.17.11" 192 | }, 193 | "devDependencies": { 194 | "gulp": "^4.0.2", 195 | "gulp-sass": "^4.0.2" 196 | } 197 | } 198 | ``` 199 | 200 | Perintah `npm install` akan menginstall dependency dan juga dev-dependency. Jika kamu ingin menginstall regular dependency nya saja, maka gunakan perintah `npm install --production`. 201 | 202 | ## Menghapus Package 203 | 204 | Untuk menghapus package dapat dilakukan beberapa cara, berikut diantaranya, 205 | 206 | ```bash 207 | npm uninstall gulp gulp-sass --save-dev 208 | npm un stylus --save 209 | # atau 210 | npm remove lodash --save 211 | npm rm nodemon --save-dev 212 | ``` 213 | 214 | ## Install Versi Tertentu & Update 215 | 216 | ```bash 217 | npm install lodash@4.17.4 --save 218 | 219 | npm update lodash 220 | ``` 221 | 222 | ## Global Package 223 | 224 | Ketika kita menginstall package secara global, maka file nya tidak akan disimpan di `node_modules` dan didaftarkan di `package.json`. 225 | 226 | Package yang biasa kita install secara global adalah `nodemon` atau `live-server`. Package `nodemon` sangat berguna ketika kamu mengembangkan aplikasi menggunakan _express_ dimana `nodemon` akan nge-_watch_ perubahan yang kamu lakukan, sehingga tidak perlu me-restart server melihat perubahannya. 227 | 228 | ```bash 229 | npm install nodemon -g 230 | npm remove nodemon -g 231 | ``` 232 | 233 | Lantas, berada dimana package ini? 234 | 235 | ```bash 236 | npm root -g 237 | ``` 238 | 239 | ## Melihat Daftar Package 240 | 241 | ```bash 242 | npm list 243 | ``` 244 | 245 | Perintah `npm list` akan menampilkan semua dependency di semua modul. 246 | 247 | ```bash 248 | npm list --depth 0 249 | npm list --depth 1 250 | ``` 251 | 252 | ## Scripts 253 | 254 | Pada file `package.json` terdapat skrip, dimana dengan skrip ini, kita bisa menjalankan suatu _testing_ dengan _mocha_, atau menjalankan aplikasi yang awalnya `node index.js` menjadi `node start`, karena bisajadi ada orang lain yang mengkloning aplikasi kita dan ingin langsung menjalankan aplikasi. 255 | 256 | Bukalah file `package.json`, ubahlah kode berikut, 257 | 258 | ```json 259 | "test": "echo \"Error: no test specified\" && exit 1" 260 | ``` 261 | 262 | Menjadi, 263 | 264 | ```json 265 | "start": "node index.js", 266 | "dev": "nodemon index" 267 | ``` 268 | 269 | Untuk menjalankan skrip ini, pada terminal, 270 | 271 | ```bash 272 | npm start 273 | ``` 274 | 275 | Akan tetapi, untuk menjalankan skrip yang `dev`, terdapat sedikit perbedaan, 276 | 277 | ```bash 278 | npm run dev 279 | ``` 280 | 281 | ## Mengupload ke Github 282 | 283 | Jika kamu ingin mengupload project kamu ke Github dan tidak ingin mengikutsertakan suatu file atau folder, misalnya folder `node_modules`, buatlah file `.gitignore` pada root folder. 284 | 285 | Kemudian, tulislah daftar yang tidak ingin kamu sertakan ketika ingin di _push_. 286 | -------------------------------------------------------------------------------- /kenalan-dengan-react.md: -------------------------------------------------------------------------------- 1 | # Kenalan dengan React JS 2 | 3 | ## Disclaimer 4 | 5 | Note ini memang jauh dari sempurna dari segi banyak kontennya, tetapi secara 6 | berkala(per hari) akan selalu diupdate. 7 | 8 | ## Intro 9 | 10 | Seperti yang kita tahu [React](https://github.com/facebook/react) adalah library 11 | untuk view dalam pembuatan aplikasi Front End. Nah seiring berjalannya update 12 | terkini, pada note ini akan membahas perintah react dasar. Sangat 13 | direkomendasikan untuk memahami `JS ES6` terlebih dahulu. Salah satu note nya 14 | [disini](https://github.com/randyviandaputra/my-notes/blob/master/penulisan-es6-dan-pengenalan-fitur.md). 15 | 16 | ## Daftar Isi 17 | 18 | - [Komponen Fungsi](#komponen-fungsi) 19 | - [Bermain dengan Props](#bermain-props) 20 | - [Stateful dan Stateless](#state) 21 | - Akan diupdate/ bertambah ASAP^^ 22 | 23 | ## Komponen Fungsi 24 | 25 | Pada saat note ini dibuat, versi terakhir react 26 | yang digunakan adalah 16.8.6. The newest update nya komponen sekarang 27 | menggunakan fungsi tidak menggunakan class lagi. 28 | 29 |
Contoh Komponen, contoh di sandbox.io
30 | 31 | ```js 32 | function CustomFooter() { 33 | return
Copyright 2019
34 | } 35 | 36 | export default CustomFooter 37 | ``` 38 | 39 | Kalau ingin ngasih styling pada komponennya menggunakan CSS tinggal ditambahin 40 | sebelum return. 41 | 42 |
Styling Komponen
43 | 44 | ```js 45 | function CustomFooter() { 46 | const customStyle = { 47 | color: 'red', 48 | } 49 | 50 | return
Copyright 2019
51 | } 52 | 53 | export default CustomFooter 54 | ``` 55 | 56 | ## Bermain dengan Props 57 | 58 | Komponen dalam aplikasi web maupun native React 59 | seringkali terdari dari lebih dari 1 komponen. Props adalah teknik untuk 60 | mengirim data antar komponen tersebut. 61 | 62 |
Contoh Props
63 | 64 | ```js 65 | //CustomFooter.js 66 | function CustomFooter(copyrightYear = "defaultTahun") { 67 | return
Copyright {copyrightYear}
68 | } 69 | 70 | export default CustomFooter 71 | 72 | //App.js 73 | import CustomFooter from './components/CustomFooter.js' 74 | 75 | function App(){ 76 | return(
77 |
Aku tag native header
78 |
Aku tag native section
79 | 80 |
) 81 | } 82 | 83 | export default App 84 | ``` 85 | 86 | Gimana kalau mau passing props lain selain `copyrightYear` dengan ringkas? 87 | solusi menggunakan spread atribute. 88 | 89 | ```js 90 | //CustomFooter.js 91 | function CustomFooter({copyrightYear = "defaultTahun", ...props}) { 92 | return
Copyright {copyrightYear}
93 | } 94 | 95 | export default CustomFooter 96 | 97 | //App.js 98 | import CustomFooter from './components/CustomFooter.js' 99 | 100 | function App(){ 101 | return(
102 |
Aku tag native header
103 |
Aku tag native section
104 | 105 |
) 106 | } 107 | 108 | export default App 109 | ``` 110 | 111 | Snippet code diatas memberikan props `className` pada elemen `