Showing posts with label alampanji. Show all posts
Showing posts with label alampanji. Show all posts

Sunday, July 1, 2018

Setup Your React Apps From Scratch Using Webpack

Hai bertemu lagi pada quarter kali ini dengan saya, semoga tulisan saya banyak memberikanmu inspirasi, ya.

Pada kesempatan kali ini saya ingin sedikit berbagi tentang Konfigurasi awal sebuah project React yang di bundling menggunakan Webpack dari mulai proses development hingga menjadi file yang ready untuk production mode.

Sebelumnya saya ingin membahas sedikit apa itu webpack. Webpack adalah sebuah file bundling Javascript application.

Berikut konsep dasar yang harus diketahui dalam mem-bundling aplikasi Javascript:

Entry:

Berkas utama dimana webpack akan mengetahui semua dependensi aplikasi sehingga nantinya dependensi-dependensi tersebut bisa diproses menjadi satu berkas saja atau istilahnya di-bundle.

Ouput:

Berkas keluaran utama dari webpack hasil proses bundle.

Loader:

Berkas HTML, CSS, JavaScript maupun aset Gambar bisa di-import di berkas utama entry sebagai module.

Plugin:
Plugin tambahan terhadap berkas hasil keluaran bundle. 

1. Setting Babel, Transpiler ES6 ke Plain Javascript



React Apps ditulis menggunakan ES6 / ECMAScript6 atau ECMAScript 2015. Namun kebanyakan browser saat ini belum support untuk membaca ES6, jadi harus di compile menggunakan Babel agar dapat berjalan pada browser saat ini. Berikut install babel pada file project kita.

npm install babel-loader babel-core babel-preset-env babel-preset-react --save-dev

dan buat file .babelrc pada root aplikasi kita seperti dibawah ini:






















file .babelrc









Kemudian install react dengan mengetik script ini pada terminal:


npm install --save react react-dom



Buat file webpack.config.js seperti dibawah ini.

Ketik script ini pada terminal:





npm install html-webpack-plugin --save-dev


script diatas adalah plugin yang digunakan agar webpack dapat membaca file html.
const HtmlWebPackPlugin = require("html-webpack-plugin");
const htmlWebpackPlugin = new HtmlWebPackPlugin({
  template: "./src/index.html",
  filename: "./index.html"
});
var path = require('path')
module.exports = {
// parent path yang di build
  entry: './src/index.js',
// target lokasi path hasil build
  output: {
    path: path.join(__dirname, "./dist"),
    filename: 'bundle.js',
    publicPath:'/'
  },
// Hot loader development mode Webpack config
  devServer: {
    inline: true,
    historyApiFallback: true,
    contentBase: './src',
    port: 8100,
    hot: true
  },
  module: {
//list loader yang digunakan
    rules: [
      {
        test: /\.(js|jsx)$/,
        exclude: /node_modules/,
        use: {
          loader: "babel-loader",
          query: {
            plugins:[ 'transform-object-rest-spread' ]
          }
        }
      },
      {
        test:/\.(s*)css$/,
        use: [
        {
            loader: "style-loader"
        },
        {
loader: "css-loader"
        },
        {
           loader: "sass-loader" // compiles Sass to CSS
         }
        ]
      },
      {
        test: /\.(jpg|png|gif|svg|pdf|ico|eot|svg|ttf|woff|woff2)$/,
        use: [
            {
                loader: 'file-loader',
                options: {
                    name: '[path][name]-[hash:8].[ext]'
                },
            },
        ]
    },
    ]
  },
  plugins: [htmlWebpackPlugin]
};


File webpack.config.js merupakan file yang akan dieksekusi webpack terkait dengan module yang akan di bundling pada aplikasi kita.

Kemudian buat file package.json
{
  "name": "test",
  "version": "1.0.0",
  "description": "test react webpack",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
// mode development pada npm
    "start": "webpack-dev-server --mode development --open --hot",
    // mode production pada npm
"build": "webpack --mode production"
  },
  "author": "alampanji",
  "license": "ISC",
  "dependencies": {
    "antd": "^3.5.3",
    "babel-plugin-transform-object-rest-spread": "^6.26.0",
    "babel-preset-stage-2": "^6.24.1",
    "react": "^16.3.2",
    "react-dom": "^16.3.2",
    "react-router-dom": "^4.2.2"
  },
//dependency yang di install
  "devDependencies": {
    "axios": "^0.18.0",
    "babel-core": "^6.26.3",
    "babel-loader": "^7.1.4",
    "babel-preset-env": "^1.7.0",
    "babel-preset-react": "^6.24.1",
    "css-loader": "^0.28.11",
    "file-loader": "^1.1.11",
    "html-webpack-plugin": "^3.2.0",
    "node-sass": "^4.9.0",
    "sass-loader": "^7.0.1",
    "style-loader": "^0.21.0",
    "webpack": "^4.8.3",
    "webpack-cli": "^2.1.3",
    "webpack-dev-server": "^3.1.4"
  }
}


Config selesai~

Pada saat kita mengetik npm start, npm akan mengeksekusi webpack pada mode development dan membuka browser secara langsung seperti dibawah ini:
















dan pada script npm run build, npm akan mengeksekusi webpack pada mode production dan disimpan didalam folder dist


Dan kini aplikasi React anda berhasil berjalan dan di bundling dengan menggunakakan webpack

Reference:

https://webpack.js.org/

Happy Story With Redux

Pada beberapa project React yang saya pernah kerjakan, saya mendapat pelajaran yaitu jika aplikasi sudah sangat kompleks dan memiliki banyak Component, terlebih Component-Component tersebut saling memiliki keterikatan dalam artian memiliki banyak state yang harus di share ke Component lain hal tersebut jika dilakukan dengan menggunakan melempar props dari parent ke child akan sangat sulit dilakukan, karena harus secara hierarchy untuk merubah sebuah data atau state component tersebut. Untuk mempermudah pekerjaan dibutuhkan sebuah state management.




Konsep Unidirectional Data Flow: Konsep modern dalam membuat user interface
Pada React yang menggunakan konsep data flow yang satu arah (unidirectional data flow), kita sebagai Front-end Engineer dituntut harus teratur untuk merubah suatu state. Tidak seperti yang kita kenal dulu saat menggunakan Pattern MVC, data atau model dengan mudah dapat diubah melalui sebuah controller atau model. Jika di implementasikan pendekatan tersebut pada pembuatan User Interface, data atau state sangat sulit di maintain dan tidak predictable kapan terjadi perubahan pada state tersebut.

Flux Pattern:

Mengutip dari official website-nya, kurang lebih seperti in:
"Flux merupakan sebuah pattern atau arsitektur yang digunakan Facebook untuk membuat aplikasi Web. Reflux menyempurnakan React  dalam membuat Component View yang menggunakan Data flow satu arah".

Berikut gambar dibawah ini yang menjelaskan bagaimana arsitektur atau pattern Flux:





Jadi berdasarkan gambar diatas, sederhananya terdapat 4 Layer dalam aplikasi untuk merubah suatu view, yaitu Flux Memiliki:

- Action: Action simpelnya adalah sebuah method untuk mengeksekusi data pada view.

- Dispatcher:  Dispatcher berfungsi sebagai jembatan antara Action dan Store, Dispatcher mengirim data yang telah di proses sebelumnya pada action untuk diubah statenya yang ada pada store

- Store: Stores menyimpan semua state yang ada pada aplikasi.

- View: Representasi user interface aplikasi. Pada Flux, view bisa mengeksekusi sebuah Action.

Setelah mengenal Flux, Mencoba Redux.

Sebagai orang awam yang saat itu baru mempelajari React 1 bulan, saya sangat asing terhadap istilah-istilah tersebut. Terlebih otak saya masih diracuni oleh konsep MVC. Jadi sangat kesulitan untuk "Hijrah" pada konsep yang baru. Namun hal ini harus dilakukan karena Component aplikasi saya sudah banyak dan memiliki state yang harus di maintaince, terlebih deadline pekerjaan yang terus menekan. Hal tersebut mengharuskan untuk mempersingkat waktu development (dengan kata lain harus memggunakan state management) agar semua Team Front-End Happy. Dan hati ini akhirnya memilih Redux :D

Redux is "Flux - like".

Mengutip dari artikel Michael Mangilardi, "Redux adalah container state yang predictable untuk aplikasi Javascript dan tidak memiliki terikatan yang erat pada React (Agnostic)".




Menurut saya, Redux adalah tools dalam membungkus aplikasi dengan konsep Flux dengan layer yang lebih simple, dibawah ini merupakan arsitektur dari Redux:
















Semua layer yang ada pada Flux, tidak jauh berbeda namun konsep pada Redux berbeda. Terbukti dengan dihilangkannya layer Dispatcher dengan digantikan oleh Reducer. Secara singkat berikut pengertian layer tersebut:

- Action: List suatu aksi yang di eksekusi dari view untuk merubah store, action dapat mengirim data ke Reducer.

- Reducer: Hasil eksekusi action, dan mengembalikan data untuk merubah state yang ada didalam Store.

- Store: Kumpulan state yang disimpan didalam sebuah middleware Redux.

- View: Tampilan user interface aplikasi, jika ada perubahan pada store, View akan di render ulang.

Dalam menggunakan Redux, saya dan team sangat dimudahkan dalam membuat user interface menggunakan React, karena jika suatu state berubah tidak secara hierarchy harus memberi tahu perubahan tersebut.

Analogi sederhananya seperti ini:






















Setelah mengerti dan mempelajari Redux, saya harus melakukan sharing terhadap team Front-end dan setelah proses sharing dan pairing beberapa hari akhirnya team berhasil catch up dan satu pengertian dalam membuat sebuah Component React. Dan dengan menggunakan Redux terbukti membuat proses development semakin cepat dan kini semua team Happy :D


Reference:


https://facebook.github.io/flux/


https://css-tricks.com/learning-react-redux/


https://brigade.engineering/what-is-the-flux-application-architecture-b57ebca85b9e


https://medium.com/coding-artist/practical-redux-chapter-1-core-concepts-f5a53f74505c

Friday, December 15, 2017

Set-up Karma pada Grunt Task Runner


Pada kesempatan kali ini, saya akan membahas mengenai cara setting Karma Test Runner yang dapat di run melalui Grunt Javascript Task Runner. Sebelum melakukan hal tersebut ada baiknya kita mengetahui apa itu Karma dan Grunt. 


Singkatnya, Karma adalah sebuah Javascript Test Runner yang dibuat oleh Angular team, Karma digunakan pada Unit Testing sebuah aplikasi Javascript, khususnya Angular. Sedangkan Grunt adalah sebuah Javascript Task Runner dan sebagai build tools aplikasi javascript.

Yang perlu dipahami terlebih dahulu adalah file settingan pada Gruntfile.js. Gruntfile.js merupakan script yang ditulis untuk melakukan task-task pada project yang kita buat. Seperti menjalankan hot swap dengan melakukan watch terhadap segala perubahan file hingga task melakukan build otomatis dengan me-minified semua file pada project kita. Semua task pada Grunt bisa kita buat sebebas mungkin, namun dengan membutuhkan dependency lain untuk menjalankan suatu task yang dibuat.

Contoh task Grunt yang ada pada file Gruntfile.js:



Nah kemudian untuk membuat task Grunt yang menjalankan service Karma, pertama kita harus menginstall Karma server terlebih dahulu dengan command dibawah ini melalui npm:

npm install karma --save-dev.

Setelah karma terinstall, buatlah konfigurasi karma pada grunt.initConfig seperti dibawah ini:


perlu diketahui bahwasannya, atribute configFile merupakan sebuah file config karma yang bisa dibuat melalui command karma init pada folder test.

kurang lebih seperti ini gambaran file karma.conf.js:


Setelah itu pada list of files [], kita harus memasukan file-file yang dibutuhkan pada unit testing tersebut. mulai dari file angular, dependency-dependency lainnya dan jangan lupa test script yang akan masuk kedalam skenario pengujian kita.

untuk menjalankannya pada grunt kita hanya melakukan command dibawah ini:

grunt test

dan hasilnya seperti ini....


Oke cukup sekian penjelasannya mengenai Grunt dan Karma. Sampai jumpa di lain kesempatan dan 
Happy coding :D

References:










Sunday, September 17, 2017

Mengenal Layouting dengan Flexbox CSS-3

Hello Sahabat Nostra, kembali lagi dengan saya pada kesempatan kali ini yang akan membahas mengenai konsep Layouting Flexbox pada CSS 3. 

Oke, pertama kita harus tahu dulu apa sih yang dimaksud dengan Flexbox itu? Dan apa faedahnya penggunaan sistem Layouting Flexbox pada tampilan antarmuka yang kita buat?

Yak menurut pemahaman yang saya baca dari berbagai sumber, Flexbox atau Flexible Box merupakan suatu module dalam CSS 3 yang berfungsi membuat suatu container pada tampilan halaman website menjadi fleksibel terhadap konten-konten yang ada didalamnya dengan memanfaatkan space yang tersedia. Dengan kata lain manfaat flexbox tersebut adalah kita tidak perlu lagi melakukan styling yang rumit pada setiap device yang resolusinya berbeda-beda karena konten secara otomatis melakukan penyesuaian dengan container yang telah kita set sebagai flex tadi.

Yang perlu dipahami, suatu container flex dibentuk berdasarkan 2 garis secara horizontal (main axis) dan vertical (cross axis). Berikut ilustrasi sebuah container flex:











Secara default garis horizontal (main axis) tersebut akan meletakan item-item(item flex) dimulai dari kiri kekanan pada container flex. Dan garis vertical pada flex container (cross axis) akan meletakan item flex dari atas kebawah pada container flex.

Dibawah ini merupakan beberapa property dari module flex yang perlu dipahami:
-display: flex  = Untuk menginisialisasi container sebagai flex.
-justify-content: #value =  Untuk mengatur item flex secara horizontal.
-align-items: #value = Untuk mengatur item flex secara horizontal.
-flex-direction: #value = Untuk mengatur penempatan item pada container.

Berikut ini adalah cara belajar mengenal konsep flexbox dengan cara interaktif melalui link ini :

Tampilan Flexbox Froggy

Nah sekian pengenalan mengenai flexbox layout, sampai jumpa pada kesempatan selanjutnya.


References:

http://www.tutorial-webdesign.com/tutorial-flexbox-basic/

http://learnlayout.com/flexbox.html

https://www.w3schools.com/css/css3_flexbox.asp

Sunday, March 19, 2017

Mengenal Zeplin. Tools asik untuk kolaborasi antara designer dengan developer

Sebagai front-end developer terkadang saya sulit sekali untuk mengimplementasikan desain aplikasi yang di provide oleh desainer karena terbatasnya informasi terkait assets yang di attach pada desain aplikasi tersebut.

Oleh karena itu pada kesempatan kali ini saya ingin memperkenalkan sebuah tools bernama Zeplin yang berfungsi sebagai tempat berkolaborasi mengenai desain aplikasi yang dibuat agar gap antara designer dan developer (khususnya front-end) tidaklah terlalu jauh.

Zeplin merupakan tools kolaborasi yang interaktif untuk developer dan designer dalam mengembangkan user interface aplikasi baik web ataupun mobile (android/ios). Bisa dilihat dokumentasi Zeplin disini .

Halaman Home Zeplin:


Zeplin free hanya untuk penggunaan 1 project. Untuk 3 project dikenai biaya 17 Dollar/bulan dan untuk 12 project dikenai biaya 26 Dollar/bulan. Zeplin dapat mengimport assets desain berbasis Photoshop atau Sketch (hanya tersedia di Mac), namun pada tutorial kali ini saya menggunakan Sketch. Let's Start :D

Sebelumnya saya telah memiliki 2 Account yang telah terdaftar pada Zeplin sebagai Designer dan Developer. Role Designer dapat melakukan upload file design aplikasi dan detail informasi assets tersebut dapat dilihat dalam bentuk desain assets aplikasi yang dibuat, contohnya CSS untuk website.

Setelah mendaftar, Zeplin meminta untuk menginstall Aplikasi Zeplin ke PC. Lakukan install dan login menggunakan PC kemudian buat project baru dan pilih platform project apa yang akan dibuat. Pada yang saya contohkan saya memilih aplikasi Web.


Berikut dibawah ini gambar detail project dan member pada project yang dibuat:


User 'panjialam' saya Rolenya pada saat login project sebagai Designer. Kemudian selanjutnya saya akan mengundang user lain (Developer) untuk join ke dalam project. Pilih invite kemudian ketik username dan pilih "invite" username yang tampil tersebut.

Nah saat ini saya telah menginvite alampanji yang berperan Developer. Developer nantinya dapat melihat hasil generate Desain dalam format script CSS/LESS/SASS dengan kata lain developer tidak perlu bekerja 2kali dengan memikirkan styling aplikasinya, Menarik bukan?

Memulai mendesain pada Sketch...

Seperti yang sudah saya bilang tadi Zeplin mendukung desain yang dapat di import pada Project dalam format photoshop dan sketch namun pada tutorial saya kali ini saya mencoba menggunakan sketch sebagai source desain yang diimport ke Zeplin. Sketch merupakan tools design UI yang hanya tersedia pada Mac. Sketch merupakan software berbayar dan kita dapat menggunakannya Free Trial selama 30 hari saja.

Oke untuk create design pada Sketch pilih File > New From Template dan Pilih Web Design seperti gambar berikut:


Kemudian buat desain web seperti contoh gambar berikut:


Kemudian selection desain tersebut dan pilih Plugins > Zeplin kemudian pilih Export Selected Artboard seperti gambar dibawah ini:

Pada langkah ini, Sketch akan mengexport desain yang sudah di selection kedalam file project Zeplin yang telah kita buat sebelumnya, jika success akan seperti gambar seperti ini:


Nah setelah sukses, kembali lagi pada file project Zeplin dan file desain Sketch tadi akan ada di project seperti gambar berikut:

Seperti yang sudah saya bilang tadi, sebagai Developer kita dapat melihat hasil generate styling dalam format CSS/LESS/SASS/Stylus dll. Pilih komponen dan stylingnya dapat dilihat seperti ini:


Dan styling CSS komponennya bisa kita copy dengan mengklik 'copy' seperti gambar berikut:
Sekian tutorial yang saya sampaikan, semoga dapat mempermudah pekerjaan Designer dan Developer yang HQQ (re: Hakiki). Terimakasih sampai bertemu pada blog selanjutnya :D








Friday, March 17, 2017

AngularJS Tips & Tricks: Cara membuat image rotate tanpa menggunakan directive

Pada kesempatan kali ini saya akan membahas tentang Tips and Tricks AngularJS mengenai membuat image rotate tanpa menggunakan directive.

Image rotate adalah suatu fitur manipulasi tampilan gambar agar dapat dilihat dari berbagai macam perspektif. Image rotate diperlukan jika teman-teman sedang memiliki project yang berkaitan dengan fitur preview image pada halaman html, namun gambar yang ditampilkan harus dapat di putar agar dapat melihat tampilan gambar dari berbagai macam sisi. Sebenarnya fitur ini dapat didukung oleh berbagai macam directive yang dapat kita dapatkan melalui bower atau npm, namun terkadang directive yang kita dapat tidak sesuai dengan versi angular yang ada pada project kita. Lalu bagaimana membuat sendiri fitur image rotate tersebut tanpa dan mengimplementnya pada project kita? Mari kita pelajari bersama :D

Siapkan controller yang bernama imageRotateTestCtrl seperti gambar dibawah ini:


Controller diatas akan merefer ke file project html yang akan menjadi tampilan pada halaman web. Dibawah ini merupakan tampilan yang akan menjadi target image yang akan di rotate:

kemudian dibawah ini adalah source code view halamannya yang diberi nama image-rotate.html :



pada tampilan diatas terlihat bahwa tag image akan mengimplement css class bernama 'classRotate' yang di binding dari controller menggunakan angular (ng-class) dan ketika button di click menjalankan function doRotate('min') pada controller yang berfungsi untuk melakukan pengubahan classRotate. Berikut source code function doRotate pada imageRotateTestCtrl:






function doRotate() melakukan pemanggilan class "rotated-image-min-90, rotated-image-min-180, dst" dari css yang ditampung ke variabel $scope.classRotate sesuai kondisi variable deg ketika diklik melalui button, variable deg yang nilainya negatif akan memutar image 90 derajat kekiri begitu pula sebaliknya. berikut source code script file cssnya:



Dan... jeng jeng ini adalah screenshot halaman web ketika tombol rotate (left/right) di klik:




Sekian tutorial kali ini, sampai bertemu pada kesempatan selanjutnya :D