<div class="km kn do aw ko b kp kq kr ks kt ku kv kw kx ky kz" data-selectable-paragraph="" id="55a1" style="background-color: white; box-sizing: inherit; color: rgba(0, 0, 0, 0.84); font-family: medium-content-serif-font, Georgia, Cambria, "Times New Roman", Times, serif; font-size: 21px; letter-spacing: -0.004em; line-height: 1.58; margin-bottom: -0.46em; margin-top: 2em;"> Banyak orang salah kaprah pada saat berbicara tentang <a class="dg ca la lb lc ld" href="https://developers.google.com/web/progressive-web-apps/" style="-webkit-tap-highlight-color: transparent; background-image: url("data:image/svg+xml; background-position: 0px calc(1em + 1px); background-repeat: repeat-x; background-size: 1px 1px; box-sizing: inherit; http: //www.w3.org/2000/svg\"><line x1=\"0\" y1=\"0\" x2=\"1\" y2=\"1\" stroke=\"rgba(0, 0, 0, 0.84)\" /></svg>"); text-decoration-line: none;" target="_blank"><em class="le" style="box-sizing: inherit;">Progressive Web App</em>(PWA)</a>, bahwa untuk bisa memiliki PWA harus <em class="le" style="box-sizing: inherit;">Single Page Application</em>(SPA), atau harus menggunakan <em class="le" style="box-sizing: inherit;">framework</em> modern seperti React, Angular, Polymer, dan lainnya. Sehingga banyak developer yang merasa bahwa mereka tidak bisa menerapkan PWA karena mereka masih menggunakan <em class="le" style="box-sizing: inherit;">server rendered framework</em> seperti PHP atau Ruby Framework. Padahal berbicara PWA, tentunya yang utama adalah kata <em class="le" style="box-sizing: inherit;">progressive</em> di mana maksud sebenarnya adalah peningkatan pengalaman user secara progresif atau bertahap. Nah pertanyaannya mulai dari mana sih kalau ingin membuat sebuah aplikasi PWA? Tulisan ini semoga bisa membantu kalian untuk menjawabnya.</div> <h1 class="lf lg do aw av dm lh li lj lk ll lm ln lo lp lq lr" data-selectable-paragraph="" id="09f6" style="background-color: white; box-sizing: inherit; color: rgba(0, 0, 0, 0.84); font-family: medium-content-sans-serif-font, "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", Geneva, Arial, sans-serif; font-size: 34px; letter-spacing: -0.022em; line-height: 1.12; margin: 1.95em 0px -0.28em;"> <span class="bi" style="box-sizing: inherit; font-weight: inherit;">Keamanan HTTPS Adalah Pondasi Dasar</span></h1> <div class="km kn do aw ko b kp ls kr lt kt lu kv lv kx lw kz" data-selectable-paragraph="" id="5c95" style="background-color: white; box-sizing: inherit; color: rgba(0, 0, 0, 0.84); font-family: medium-content-serif-font, Georgia, Cambria, "Times New Roman", Times, serif; font-size: 21px; letter-spacing: -0.004em; line-height: 1.58; margin-bottom: -0.46em; margin-top: 0.86em;"> Keamanan di web merupakan isu yang cukup besar karena banyaknya <em class="le" style="box-sizing: inherit;">phising</em>, <em class="le" style="box-sizing: inherit;">content hijacking</em>, dan isu keamanan lainnya. Sebagian besar isu ini mengeksploitasi kemudahan web yang sangat mudah diakses. Hanya dengan URL, kita bisa mengakses tanpa perlu meng-<em class="le" style="box-sizing: inherit;">install</em> apapun di perangkat kita. Dengan itu, <a class="dg ca la lb lc ld" href="https://developers.google.com/web/fundamentals/security/encrypt-in-transit/why-https" style="-webkit-tap-highlight-color: transparent; background-image: url("data:image/svg+xml; background-position: 0px calc(1em + 1px); background-repeat: repeat-x; background-size: 1px 1px; box-sizing: inherit; http: //www.w3.org/2000/svg\"><line x1=\"0\" y1=\"0\" x2=\"1\" y2=\"1\" stroke=\"rgba(0, 0, 0, 0.84)\" /></svg>"); text-decoration-line: none;" target="_blank">penggunaan HTTPS adalah wajib di sisi <em class="le" style="box-sizing: inherit;">web server</em></a>, karena hampir semua fungsi dari PWA cuma bisa berjalan di HTTPS. Dan sekarang dengan adanya <a class="dg ca la lb lc ld" href="https://letsencrypt.org/" style="-webkit-tap-highlight-color: transparent; background-image: url("data:image/svg+xml; background-position: 0px calc(1em + 1px); background-repeat: repeat-x; background-size: 1px 1px; box-sizing: inherit; http: //www.w3.org/2000/svg\"><line x1=\"0\" y1=\"0\" x2=\"1\" y2=\"1\" stroke=\"rgba(0, 0, 0, 0.84)\" /></svg>"); text-decoration-line: none;" target="_blank"><em class="le" style="box-sizing: inherit;">SSL certificate</em> gratis</a>, maka tidak ada alasan lagi untuk tidak menggunakan HTTPS di web kalian. Tentu ini juga panggilan buat para provider hosting untuk bisa menyediakan SSL gratis di semua server mereka. Tanpa dukungan pihak <em class="le" style="box-sizing: inherit;">hosting provider</em> maka web yang aman akan tetap menjadi isu.</div> <h1 class="lf lg do aw av dm lh li lj lk ll lm ln lo lp lq lr" data-selectable-paragraph="" id="4ccf" style="background-color: white; box-sizing: inherit; color: rgba(0, 0, 0, 0.84); font-family: medium-content-sans-serif-font, "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", Geneva, Arial, sans-serif; font-size: 34px; letter-spacing: -0.022em; line-height: 1.12; margin: 1.95em 0px -0.28em;"> Meningkatkan pengalaman pengguna secara bertahap</h1> <div class="km kn do aw ko b kp ls kr lt kt lu kv lv kx lw kz" data-selectable-paragraph="" id="11f2" style="background-color: white; box-sizing: inherit; color: rgba(0, 0, 0, 0.84); font-family: medium-content-serif-font, Georgia, Cambria, "Times New Roman", Times, serif; font-size: 21px; letter-spacing: -0.004em; line-height: 1.58; margin-bottom: -0.46em; margin-top: 0.86em;"> Setelah memiliki pondasi, baru kita bisa memulai untuk meningkatkan pengalaman pengguna web kita secara bertahap. Dan tentu tidak semua harus didukung, tapi kita perlu memilih berdasarkan jenis aplikasi web kita. PWA bukanlah teknologi yang semua komponen harus dibuat. Komponen PWA yang ada di bawah ini bersifat modular, jadi bisa saja beberapa komponen tidak digunakan, atau cuma mengimplementasi 2 atau 3 komponen saja. Dan berikut adalah tahapan yang kalian bisa coba.</div> <br /> <figure class="ly lz ma mb mc ep x y paragraph-image" style="background-color: white; box-sizing: inherit; clear: both; color: rgba(0, 0, 0, 0.8); font-family: medium-content-sans-serif-font, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif; margin: 56px auto 0px;"><div class="md me ed mf ab" style="box-sizing: inherit; cursor: zoom-in; position: relative; transition: transform 300ms cubic-bezier(0.2, 0, 0.2, 1) 0s; width: 680px; z-index: auto;"> <div class="x y lx" style="box-sizing: inherit; margin-left: auto; margin-right: auto; max-width: 816px;"> <div class="mj l ed mk" style="background-color: rgba(0, 0, 0, 0.05); box-sizing: inherit; margin: auto; position: relative;"> <div class="ml l" style="box-sizing: inherit; padding-bottom: 228.328px;"> <div class="cw mg gd n o gc ab cf mh mi" style="box-sizing: inherit; height: 228.328px; left: 0px; opacity: 0; overflow: hidden; position: absolute; top: 0px; transform: translateZ(0px); transition: opacity 100ms ease 400ms; width: 680px; will-change: transform;"> <img class="gd n o gc ab mm mn qz ra" height="274" src="https://miro.medium.com/max/60/1*l-A9d_a86O8KjMbxIDOTZA.png?q=20" style="box-sizing: inherit; filter: blur(20px); height: 228.328px; left: 0px; position: absolute; top: 0px; transform: scale(1.1); transition: visibility 0ms ease 400ms; vertical-align: middle; visibility: hidden; width: 680px;" width="816" /></div> <img class="nk nl gd n o gc ab ga" height="274" src="https://miro.medium.com/max/816/1*l-A9d_a86O8KjMbxIDOTZA.png" style="background: rgb(255, 255, 255); box-sizing: inherit; height: 228.328px; left: 0px; opacity: 1; position: absolute; top: 0px; transition: opacity 400ms ease 0ms; vertical-align: middle; width: 680px;" width="816" /></div> </div> </div> </div> <figcaption class="ba ds mp mq he cu x y mr ms av dr" data-selectable-paragraph="" style="box-sizing: inherit; color: rgba(0, 0, 0, 0.54); font-family: medium-content-sans-serif-font, "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", Geneva, Arial, sans-serif; font-size: 16px; line-height: 1.4; margin-left: auto; margin-right: auto; margin-top: 10px; max-width: 728px; text-align: center;">Skema komponen fungsi PWA</figcaption></figure><br /> <h1 class="lf lg do aw av dm lh li lj lk ll lm ln lo lp lq lr" data-selectable-paragraph="" id="102a" style="background-color: white; box-sizing: inherit; color: rgba(0, 0, 0, 0.84); font-family: medium-content-sans-serif-font, "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", Geneva, Arial, sans-serif; font-size: 34px; letter-spacing: -0.022em; line-height: 1.12; margin: 1.95em 0px -0.28em;"> 1. Siap untuk PWA</h1> <div class="km kn do aw ko b kp ls kr lt kt lu kv lv kx lw kz" data-selectable-paragraph="" id="9cbb" style="background-color: white; box-sizing: inherit; color: rgba(0, 0, 0, 0.84); font-family: medium-content-serif-font, Georgia, Cambria, "Times New Roman", Times, serif; font-size: 21px; letter-spacing: -0.004em; line-height: 1.58; margin-bottom: -0.46em; margin-top: 0.86em;"> Yang pertama adalah apakah website kalian sudah siap untuk PWA. Karena sebelum kita mencoba menerapkan fungsi PWA maka website kita harus siap untuk dioptimasi. Dua checklist yang saya rekomendasikan untuk memastikan website kalian siap untuk PWA adalah:</div> <ol class="" style="background-color: white; box-sizing: inherit; color: rgba(0, 0, 0, 0.8); font-family: medium-content-sans-serif-font, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif; list-style: none none; margin: 0px; padding: 0px;"> <li class="km kn do aw ko b kp kq kr ks kt ku kv kw kx ky kz mt mu mv" data-selectable-paragraph="" id="f97b" style="box-sizing: inherit; color: rgba(0, 0, 0, 0.84); font-family: medium-content-serif-font, Georgia, Cambria, "Times New Roman", Times, serif; font-size: 21px; letter-spacing: -0.004em; line-height: 1.58; list-style-type: decimal; margin-bottom: -0.46em; margin-left: 30px; margin-top: 2em; padding-left: 0px;"><a class="dg ca la lb lc ld" href="https://developers.google.com/web/fundamentals/security/encrypt-in-transit/enable-https" style="-webkit-tap-highlight-color: transparent; background-image: url("data:image/svg+xml; background-position: 0px calc(1em + 1px); background-repeat: repeat-x; background-size: 1px 1px; box-sizing: inherit; http: //www.w3.org/2000/svg\"><line x1=\"0\" y1=\"0\" x2=\"1\" y2=\"1\" stroke=\"rgba(0, 0, 0, 0.84)\" /></svg>"); text-decoration-line: none;" target="_blank">Menggunakan protokol HTTPS</a>. Tanpa HTTPS maka hampir sebagian besar komponen PWA tidak akan bisa diimplementasikan.</li> <li class="km kn do aw ko b kp mw kr mx kt my kv mz kx na kz mt mu mv" data-selectable-paragraph="" id="7522" style="box-sizing: inherit; color: rgba(0, 0, 0, 0.84); font-family: medium-content-serif-font, Georgia, Cambria, "Times New Roman", Times, serif; font-size: 21px; letter-spacing: -0.004em; line-height: 1.58; list-style-type: decimal; margin-bottom: -0.46em; margin-left: 30px; margin-top: 1.05em; padding-left: 0px;">Menggunakan <a class="dg ca la lb lc ld" href="https://developers.google.com/web/fundamentals/architecture/app-shell" style="-webkit-tap-highlight-color: transparent; background-image: url("data:image/svg+xml; background-position: 0px calc(1em + 1px); background-repeat: repeat-x; background-size: 1px 1px; box-sizing: inherit; http: //www.w3.org/2000/svg\"><line x1=\"0\" y1=\"0\" x2=\"1\" y2=\"1\" stroke=\"rgba(0, 0, 0, 0.84)\" /></svg>"); text-decoration-line: none;" target="_blank"><em class="le" style="box-sizing: inherit;">App Shell Architecture</em></a>, ini merupakan hal yang paling susah karena terkadang memerlukan penulisan ulang aplikasi. Tapi menurut saya, PWA tetap masih bisa diimplementasi walaupun ada beberapa hal yang terbatasi tanpa <em class="le" style="box-sizing: inherit;">App Shell Architecture</em> ini.</li> </ol> <h1 class="lf lg do aw av dm lh li lj lk ll lm ln lo lp lq lr" data-selectable-paragraph="" id="8890" style="background-color: white; box-sizing: inherit; color: rgba(0, 0, 0, 0.84); font-family: medium-content-sans-serif-font, "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", Geneva, Arial, sans-serif; font-size: 34px; letter-spacing: -0.022em; line-height: 1.12; margin: 1.95em 0px -0.28em;"> 2. Tingkatkan kecepatan loading dan respon</h1> <div class="km kn do aw ko b kp ls kr lt kt lu kv lv kx lw kz" data-selectable-paragraph="" id="336b" style="background-color: white; box-sizing: inherit; color: rgba(0, 0, 0, 0.84); font-family: medium-content-serif-font, Georgia, Cambria, "Times New Roman", Times, serif; font-size: 21px; letter-spacing: -0.004em; line-height: 1.58; margin-bottom: -0.46em; margin-top: 0.86em;"> Kecepatan <em class="le" style="box-sizing: inherit;">loading</em> dan respon menurut saya adalah yang paling penting dan harus menjadi langkah pertama untuk optimalisasi PWA. Tanpa kecepatan maka pengguna akan meninggalkan <em class="le" style="box-sizing: inherit;">website</em> kalian tanpa mencoba pengalaman lainnya. Bahkan <span class="ko nb" style="box-sizing: inherit; font-weight: 700;">data yang ada menyebutkan </span><a class="dg ca la lb lc ld" href="https://www.doubleclickbygoogle.com/articles/mobile-speed-matters/" style="-webkit-tap-highlight-color: transparent; background-image: url("data:image/svg+xml; background-position: 0px calc(1em + 1px); background-repeat: repeat-x; background-size: 1px 1px; box-sizing: inherit; http: //www.w3.org/2000/svg\"><line x1=\"0\" y1=\"0\" x2=\"1\" y2=\"1\" stroke=\"rgba(0, 0, 0, 0.84)\" /></svg>"); text-decoration-line: none;" target="_blank"><span class="ko nb" style="box-sizing: inherit; font-weight: 700;">3 detik website tidak tampil, 53% pengguna akan pergi</span></a>. Buat apa membuat sesuatu sedemikian baik tapi akhirnya orang tidak memakai karena terlalu lambat.</div> <div class="km kn do aw ko b kp kq kr ks kt ku kv kw kx ky kz" data-selectable-paragraph="" id="0d0d" style="background-color: white; box-sizing: inherit; color: rgba(0, 0, 0, 0.84); font-family: medium-content-serif-font, Georgia, Cambria, "Times New Roman", Times, serif; font-size: 21px; letter-spacing: -0.004em; line-height: 1.58; margin-bottom: -0.46em; margin-top: 2em;"> Dengan <em class="le" style="box-sizing: inherit;">loading</em> yang cepat maka pengguna akan dapat merasakan <em class="le" style="box-sizing: inherit;">value</em>yang kalian coba tawarkan dan selanjutnya baru menentukan apakah kalian bisa membuat mereka tinggal atau pergi.</div> <br /> <figure class="ly lz ma mb mc ep x y paragraph-image" style="background-color: white; box-sizing: inherit; clear: both; color: rgba(0, 0, 0, 0.8); font-family: medium-content-sans-serif-font, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif; margin: 56px auto 0px;"><div class="x y nc" style="box-sizing: inherit; margin-left: auto; margin-right: auto; max-width: 644px;"> <div class="mj l ed mk" style="background-color: rgba(0, 0, 0, 0.05); box-sizing: inherit; margin: auto; position: relative;"> <div class="nd l" style="box-sizing: inherit; padding-bottom: 411px;"> <div class="cw mg gd n o gc ab cf mh mi" style="box-sizing: inherit; height: 411px; left: 0px; opacity: 0; overflow: hidden; position: absolute; top: 0px; transform: translateZ(0px); transition: opacity 100ms ease 400ms; width: 644px; will-change: transform;"> <img class="gd n o gc ab mm mn qz ra" height="411" src="https://miro.medium.com/max/60/1*-eFQOPTVr3cR7wJXSSdGWQ.png?q=20" style="box-sizing: inherit; filter: blur(20px); height: 411px; left: 0px; position: absolute; top: 0px; transform: scale(1.1); transition: visibility 0ms ease 400ms; vertical-align: middle; visibility: hidden; width: 644px;" width="644" /></div> <img class="nk nl gd n o gc ab ga" height="411" src="https://miro.medium.com/max/644/1*-eFQOPTVr3cR7wJXSSdGWQ.png" style="background: rgb(255, 255, 255); box-sizing: inherit; height: 411px; left: 0px; opacity: 1; position: absolute; top: 0px; transition: opacity 400ms ease 0ms; vertical-align: middle; width: 644px;" width="644" /></div> </div> </div> <figcaption class="ba ds mp mq he cu x y mr ms av dr" data-selectable-paragraph="" style="box-sizing: inherit; color: rgba(0, 0, 0, 0.54); font-family: medium-content-sans-serif-font, "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", Geneva, Arial, sans-serif; font-size: 16px; line-height: 1.4; margin-left: auto; margin-right: auto; margin-top: 10px; max-width: 728px; text-align: center;">Source: DoubleClick — The need for mobile speed, September 2016</figcaption></figure><br /> <div class="km kn do aw ko b kp kq kr ks kt ku kv kw kx ky kz" data-selectable-paragraph="" id="47bc" style="background-color: white; box-sizing: inherit; color: rgba(0, 0, 0, 0.84); font-family: medium-content-serif-font, Georgia, Cambria, "Times New Roman", Times, serif; font-size: 21px; letter-spacing: -0.004em; line-height: 1.58; margin-bottom: -0.46em; margin-top: 2em;"> Untuk meningkatkan kecepatan <em class="le" style="box-sizing: inherit;">website</em>, kalian bisa melihat <a class="dg ca la lb lc ld" href="https://developers.google.com/web/fundamentals/performance/rail" style="-webkit-tap-highlight-color: transparent; background-image: url("data:image/svg+xml; background-position: 0px calc(1em + 1px); background-repeat: repeat-x; background-size: 1px 1px; box-sizing: inherit; http: //www.w3.org/2000/svg\"><line x1=\"0\" y1=\"0\" x2=\"1\" y2=\"1\" stroke=\"rgba(0, 0, 0, 0.84)\" /></svg>"); text-decoration-line: none;" target="_blank">beberapa petunjuk di sini</a>.</div> <h1 class="lf lg do aw av dm lh li lj lk ll lm ln lo lp lq lr" data-selectable-paragraph="" id="4fa4" style="background-color: white; box-sizing: inherit; color: rgba(0, 0, 0, 0.84); font-family: medium-content-sans-serif-font, "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", Geneva, Arial, sans-serif; font-size: 34px; letter-spacing: -0.022em; line-height: 1.12; margin: 1.95em 0px -0.28em;"> 3. Memasang <span class="ne" style="box-sizing: inherit; font-style: inherit;">service worker</span> untuk dukungan <span class="ne" style="box-sizing: inherit; font-style: inherit;">offline</span> dan peningkatan kecepatan serta pengalaman extra</h1> <div class="km kn do aw ko b kp ls kr lt kt lu kv lv kx lw kz" data-selectable-paragraph="" id="bda2" style="background-color: white; box-sizing: inherit; color: rgba(0, 0, 0, 0.84); font-family: medium-content-serif-font, Georgia, Cambria, "Times New Roman", Times, serif; font-size: 21px; letter-spacing: -0.004em; line-height: 1.58; margin-bottom: -0.46em; margin-top: 0.86em;"> <a class="dg ca la lb lc ld" href="https://developers.google.com/web/fundamentals/primers/service-workers/" style="-webkit-tap-highlight-color: transparent; background-image: url("data:image/svg+xml; background-position: 0px calc(1em + 1px); background-repeat: repeat-x; background-size: 1px 1px; box-sizing: inherit; http: //www.w3.org/2000/svg\"><line x1=\"0\" y1=\"0\" x2=\"1\" y2=\"1\" stroke=\"rgba(0, 0, 0, 0.84)\" /></svg>"); text-decoration-line: none;" target="_blank"><em class="le" style="box-sizing: inherit;">Service worker</em></a> adalah komponen yang bisa diprogram dan berada di antara <em class="le" style="box-sizing: inherit;">browser</em> dan <em class="le" style="box-sizing: inherit;">web server</em>. Dengan memasang <em class="le" style="box-sizing: inherit;">service worker</em> maka kita bisa melakukan cache pada resources yang dibutuhkan dan juga memungkinkan aplikasi kita tetap bisa diakses dengan baik walaupun di jaringan yang tidak stabil atau <a class="dg ca la lb lc ld" href="https://developers.google.com/web/fundamentals/instant-and-offline/offline-cookbook/" style="-webkit-tap-highlight-color: transparent; background-image: url("data:image/svg+xml; background-position: 0px calc(1em + 1px); background-repeat: repeat-x; background-size: 1px 1px; box-sizing: inherit; http: //www.w3.org/2000/svg\"><line x1=\"0\" y1=\"0\" x2=\"1\" y2=\"1\" stroke=\"rgba(0, 0, 0, 0.84)\" /></svg>"); text-decoration-line: none;" target="_blank">bahkan <em class="le" style="box-sizing: inherit;">offline</em></a>.</div> <div class="km kn do aw ko b kp kq kr ks kt ku kv kw kx ky kz" data-selectable-paragraph="" id="eb89" style="background-color: white; box-sizing: inherit; color: rgba(0, 0, 0, 0.84); font-family: medium-content-serif-font, Georgia, Cambria, "Times New Roman", Times, serif; font-size: 21px; letter-spacing: -0.004em; line-height: 1.58; margin-bottom: -0.46em; margin-top: 2em;"> Tujuannya adalah untuk kondisi pengguna yang sudah merasakan <em class="le" style="box-sizing: inherit;">value</em>yang kalian tawarkan dan mereka merasa ingin terus menggunakannya. Maka untuk pengguna seperti ini, mereka harus bisa merasakan pengalaman dari value yang ditawarkan lebih baik lagi. Seperti aplikasi tetap responsif di kondisi apapun.</div> <div class="km kn do aw ko b kp kq kr ks kt ku kv kw kx ky kz" data-selectable-paragraph="" id="cc75" style="background-color: white; box-sizing: inherit; color: rgba(0, 0, 0, 0.84); font-family: medium-content-serif-font, Georgia, Cambria, "Times New Roman", Times, serif; font-size: 21px; letter-spacing: -0.004em; line-height: 1.58; margin-bottom: -0.46em; margin-top: 2em;"> <em class="le" style="box-sizing: inherit;">Service worker</em> juga memungkinkan kita untuk melakukan fungsi ekstra seperti <a class="dg ca la lb lc ld" href="https://developers.google.com/web/updates/2015/12/background-sync" style="-webkit-tap-highlight-color: transparent; background-image: url("data:image/svg+xml; background-position: 0px calc(1em + 1px); background-repeat: repeat-x; background-size: 1px 1px; box-sizing: inherit; http: //www.w3.org/2000/svg\"><line x1=\"0\" y1=\"0\" x2=\"1\" y2=\"1\" stroke=\"rgba(0, 0, 0, 0.84)\" /></svg>"); text-decoration-line: none;" target="_blank"><em class="le" style="box-sizing: inherit;">background sync</em></a><em class="le" style="box-sizing: inherit;"> </em>di mana aplikasi bisa melakukan sinkronisasi data pada saat kondisi kembali online walaupun website tidak sedang dibuka, dan <a class="dg ca la lb lc ld" href="https://developers.google.com/web/updates/2015/03/push-notifications-on-the-open-web" style="-webkit-tap-highlight-color: transparent; background-image: url("data:image/svg+xml; background-position: 0px calc(1em + 1px); background-repeat: repeat-x; background-size: 1px 1px; box-sizing: inherit; http: //www.w3.org/2000/svg\"><line x1=\"0\" y1=\"0\" x2=\"1\" y2=\"1\" stroke=\"rgba(0, 0, 0, 0.84)\" /></svg>"); text-decoration-line: none;" target="_blank"><em class="le" style="box-sizing: inherit;">push notification</em></a><em class="le" style="box-sizing: inherit;"> </em>untuk mengirimkan notifikasi kepada pengguna atau menjalankan fungsi tertentu di aplikasi.</div> <h1 class="lf lg do aw av dm lh li lj lk ll lm ln lo lp lq lr" data-selectable-paragraph="" id="7c65" style="background-color: white; box-sizing: inherit; color: rgba(0, 0, 0, 0.84); font-family: medium-content-sans-serif-font, "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", Geneva, Arial, sans-serif; font-size: 34px; letter-spacing: -0.022em; line-height: 1.12; margin: 1.95em 0px -0.28em;"> 4. Push notification untuk mengingatkan value dan membawa pengguna kembali</h1> <div class="km kn do aw ko b kp ls kr lt kt lu kv lv kx lw kz" data-selectable-paragraph="" id="2338" style="background-color: white; box-sizing: inherit; color: rgba(0, 0, 0, 0.84); font-family: medium-content-serif-font, Georgia, Cambria, "Times New Roman", Times, serif; font-size: 21px; letter-spacing: -0.004em; line-height: 1.58; margin-bottom: -0.46em; margin-top: 0.86em;"> Setelah pengguna betah dengan <em class="le" style="box-sizing: inherit;">value</em> yang ditawarkan, maka selanjutnya adalah bagaimana untuk mengingatkan mereka akan <em class="le" style="box-sizing: inherit;">value</em> kalian. Salah satu caranya tentu dengan mengingatkan mereka. Dan media yang bisa dicoba selain <em class="le" style="box-sizing: inherit;">email</em> adalah dengan <a class="dg ca la lb lc ld" href="https://developers.google.com/web/fundamentals/push-notifications/" style="-webkit-tap-highlight-color: transparent; background-image: url("data:image/svg+xml; background-position: 0px calc(1em + 1px); background-repeat: repeat-x; background-size: 1px 1px; box-sizing: inherit; http: //www.w3.org/2000/svg\"><line x1=\"0\" y1=\"0\" x2=\"1\" y2=\"1\" stroke=\"rgba(0, 0, 0, 0.84)\" /></svg>"); text-decoration-line: none;" target="_blank"><em class="le" style="box-sizing: inherit;">push notification</em></a>.</div> <div class="km kn do aw ko b kp kq kr ks kt ku kv kw kx ky kz" data-selectable-paragraph="" id="16f4" style="background-color: white; box-sizing: inherit; color: rgba(0, 0, 0, 0.84); font-family: medium-content-serif-font, Georgia, Cambria, "Times New Roman", Times, serif; font-size: 21px; letter-spacing: -0.004em; line-height: 1.58; margin-bottom: -0.46em; margin-top: 2em;"> Tapi yang ini kalian harus berhati-hati jangan sampai terlalu sering mengingatkan dan akhirnya akan terganggu oleh notifikasi yang terlalu sering. Pastikan notifikasi yang kalian kirimkan memiliki kriteria agar pengguna tidak menganggap notifikasi kalian sebagai <em class="le" style="box-sizing: inherit;">spam</em> pengganggu. Karena hasil riset yang ada menunjukkan notifikasi adalah salah satu alasan sebuah aplikasi dihapus. Dan di <em class="le" style="box-sizing: inherit;">web</em>, bila notifikasi kalian diblok maka kemungkinan besar kalian akan diblok selamanya hingga pengguna mengganti perangkat.</div> <br /> <figure class="ly lz ma mb mc ep x y paragraph-image" style="background-color: white; box-sizing: inherit; clear: both; color: rgba(0, 0, 0, 0.8); font-family: medium-content-sans-serif-font, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif; margin: 56px auto 0px;"><div class="md me ed mf ab" style="box-sizing: inherit; cursor: zoom-in; position: relative; transition: transform 300ms cubic-bezier(0.2, 0, 0.2, 1) 0s; width: 680px; z-index: auto;"> <div class="x y nf" style="box-sizing: inherit; margin-left: auto; margin-right: auto; max-width: 905px;"> <div class="mj l ed mk" style="background-color: rgba(0, 0, 0, 0.05); box-sizing: inherit; margin: auto; position: relative;"> <div class="ng l" style="box-sizing: inherit; padding-bottom: 427.531px;"> <div class="cw mg gd n o gc ab cf mh mi" style="box-sizing: inherit; height: 427.531px; left: 0px; opacity: 0; overflow: hidden; position: absolute; top: 0px; transform: translateZ(0px); transition: opacity 100ms ease 400ms; width: 680px; will-change: transform;"> <img class="gd n o gc ab mm mn qz ra" height="569" src="https://miro.medium.com/max/60/1*E7LBDjGP8KitbD31FD9KrA.png?q=20" style="box-sizing: inherit; filter: blur(20px); height: 427.531px; left: 0px; position: absolute; top: 0px; transform: scale(1.1); transition: visibility 0ms ease 400ms; vertical-align: middle; visibility: hidden; width: 680px;" width="905" /></div> <img class="nk nl gd n o gc ab ga" height="569" src="https://miro.medium.com/max/905/1*E7LBDjGP8KitbD31FD9KrA.png" style="background: rgb(255, 255, 255); box-sizing: inherit; height: 427.531px; left: 0px; opacity: 1; position: absolute; top: 0px; transition: opacity 400ms ease 0ms; vertical-align: middle; width: 680px;" width="905" /></div> </div> </div> </div> <figcaption class="ba ds mp mq he cu x y mr ms av dr" data-selectable-paragraph="" style="box-sizing: inherit; color: rgba(0, 0, 0, 0.54); font-family: medium-content-sans-serif-font, "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", Geneva, Arial, sans-serif; font-size: 16px; line-height: 1.4; margin-left: auto; margin-right: auto; margin-top: 10px; max-width: 728px; text-align: center;">Source: <a class="dg ca la lb lc ld" href="http://www.uxbooth.com/articles/rules-for-creating-perfect-push-notifications/" style="-webkit-tap-highlight-color: transparent; background-image: url("data:image/svg+xml; background-position: 0px calc(1em + 1px); background-repeat: repeat-x; background-size: 1px 1px; box-sizing: inherit; http: //www.w3.org/2000/svg\"><line x1=\"0\" y1=\"0\" x2=\"1\" y2=\"1\" stroke=\"rgba(0, 0, 0, 0.84)\" /></svg>"); text-decoration-line: none;" target="_blank">http://www.uxbooth.com/articles/rules-for-creating-perfect-push-notifications/</a></figcaption></figure><br /> <h1 class="lf lg do aw av dm lh li lj lk ll lm ln lo lp lq lr" data-selectable-paragraph="" id="0df0" style="background-color: white; box-sizing: inherit; color: rgba(0, 0, 0, 0.84); font-family: medium-content-sans-serif-font, "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", Geneva, Arial, sans-serif; font-size: 34px; letter-spacing: -0.022em; line-height: 1.12; margin: 1.95em 0px -0.28em;"> 5. Add to homescreen untuk kemudahan akses</h1> <div class="km kn do aw ko b kp ls kr lt kt lu kv lv kx lw kz" data-selectable-paragraph="" id="00d3" style="background-color: white; box-sizing: inherit; color: rgba(0, 0, 0, 0.84); font-family: medium-content-serif-font, Georgia, Cambria, "Times New Roman", Times, serif; font-size: 21px; letter-spacing: -0.004em; line-height: 1.58; margin-bottom: -0.46em; margin-top: 0.86em;"> Setelah secara kecepatan akses sudah baik dan value sudah diterima dengan baik, selanjutnya adalah memudahkan pengguna untuk mengakses aplikasi kita semudah memilih <em class="le" style="box-sizing: inherit;">icon</em> aplikasi di layar <em class="le" style="box-sizing: inherit;">smart phone</em>. Untuk itu PWA sudah dilengkapi dengan komponen <a class="dg ca la lb lc ld" href="https://developers.google.com/web/fundamentals/app-install-banners/" style="-webkit-tap-highlight-color: transparent; background-image: url("data:image/svg+xml; background-position: 0px calc(1em + 1px); background-repeat: repeat-x; background-size: 1px 1px; box-sizing: inherit; http: //www.w3.org/2000/svg\"><line x1=\"0\" y1=\"0\" x2=\"1\" y2=\"1\" stroke=\"rgba(0, 0, 0, 0.84)\" /></svg>"); text-decoration-line: none;" target="_blank"><em class="le" style="box-sizing: inherit;">add to home screen</em></a> di mana aplikasi <em class="le" style="box-sizing: inherit;">web</em> kalian akan menawarkan opsi untuk menyimpan icon aplikasi kalian di home screen perangkat mereka.</div> <br /> <figure class="ly lz ma mb mc ep x y paragraph-image" style="background-color: white; box-sizing: inherit; clear: both; color: rgba(0, 0, 0, 0.8); font-family: medium-content-sans-serif-font, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif; margin: 56px auto 0px;"><div class="x y nh" style="box-sizing: inherit; margin-left: auto; margin-right: auto; max-width: 597px;"> <div class="mj l ed mk" style="background-color: rgba(0, 0, 0, 0.05); box-sizing: inherit; margin: auto; position: relative;"> <div class="ni l" style="box-sizing: inherit; padding-bottom: 721px;"> <div class="cw mg gd n o gc ab cf mh mi" style="box-sizing: inherit; height: 721px; left: 0px; opacity: 0; overflow: hidden; position: absolute; top: 0px; transform: translateZ(0px); transition: opacity 100ms ease 400ms; width: 597px; will-change: transform;"> <img class="gd n o gc ab mm mn qz ra" height="721" src="https://miro.medium.com/freeze/max/50/1*krd0HBNhJJEcSooQJGZ1CA.gif?q=20" style="box-sizing: inherit; filter: blur(20px); height: 721px; left: 0px; position: absolute; top: 0px; transform: scale(1.1); transition: visibility 0ms ease 400ms; vertical-align: middle; visibility: hidden; width: 597px;" width="597" /></div> <img class="nk nl gd n o gc ab ga" height="721" src="https://miro.medium.com/max/597/1*krd0HBNhJJEcSooQJGZ1CA.gif" style="background: rgb(255, 255, 255); box-sizing: inherit; height: 721px; left: 0px; opacity: 1; position: absolute; top: 0px; transition: opacity 400ms ease 0ms; vertical-align: middle; width: 597px;" width="597" /></div> </div> </div> <figcaption class="ba ds mp mq he cu x y mr ms av dr" data-selectable-paragraph="" style="box-sizing: inherit; color: rgba(0, 0, 0, 0.54); font-family: medium-content-sans-serif-font, "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", Geneva, Arial, sans-serif; font-size: 16px; line-height: 1.4; margin-left: auto; margin-right: auto; margin-top: 10px; max-width: 728px; text-align: center;">Add to home screen</figcaption></figure><br /> <div class="km kn do aw ko b kp kq kr ks kt ku kv kw kx ky kz" data-selectable-paragraph="" id="7dc7" style="background-color: white; box-sizing: inherit; color: rgba(0, 0, 0, 0.84); font-family: medium-content-serif-font, Georgia, Cambria, "Times New Roman", Times, serif; font-size: 21px; letter-spacing: -0.004em; line-height: 1.58; margin-bottom: -0.46em; margin-top: 2em;"> Cara agar tawaran ke pengguna bisa muncul adalah kalian harus melengkapi aplikasi kalian dengan <a class="dg ca la lb lc ld" href="https://developers.google.com/web/fundamentals/web-app-manifest/" style="-webkit-tap-highlight-color: transparent; background-image: url("data:image/svg+xml; background-position: 0px calc(1em + 1px); background-repeat: repeat-x; background-size: 1px 1px; box-sizing: inherit; http: //www.w3.org/2000/svg\"><line x1=\"0\" y1=\"0\" x2=\"1\" y2=\"1\" stroke=\"rgba(0, 0, 0, 0.84)\" /></svg>"); text-decoration-line: none;" target="_blank"><em class="le" style="box-sizing: inherit;">file manifest</em></a> lengkap dengan <em class="le" style="box-sizing: inherit;">icon</em> dan <em class="le" style="box-sizing: inherit;">meta data</em> lainnya. User yang merasakan value dan suka maka akan mencoba menggunakan aplikasi kalian lagi. Dengan memberikan kemudahan pada mereka untuk mengakses aplikasi kalian maka pengalaman pengguna akan lebih baik.</div> <h1 class="lf lg do aw av dm lh li lj lk ll lm ln lo lp lq lr" data-selectable-paragraph="" id="e0e4" style="background-color: white; box-sizing: inherit; color: rgba(0, 0, 0, 0.84); font-family: medium-content-sans-serif-font, "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", Geneva, Arial, sans-serif; font-size: 34px; letter-spacing: -0.022em; line-height: 1.12; margin: 1.95em 0px -0.28em;"> 6. Memudahkan pengguna untuk registrasi dan masuk ke website kalian</h1> <div class="km kn do aw ko b kp ls kr lt kt lu kv lv kx lw kz" data-selectable-paragraph="" id="480a" style="background-color: white; box-sizing: inherit; color: rgba(0, 0, 0, 0.84); font-family: medium-content-serif-font, Georgia, Cambria, "Times New Roman", Times, serif; font-size: 21px; letter-spacing: -0.004em; line-height: 1.58; margin-bottom: -0.46em; margin-top: 0.86em;"> Membuat user mendaftarkan diri mereka adalah salah satu bagian yang paling susah. Kendala pertama tentu memberikan alasan untuk mendaftarkan diri, kenapa mereka harus mendaftarkan diri mereka. Selanjutnya adalah adalah memudahkan usaha yang diperlukan untuk mendaftar atau masuk ke website kalian.</div> <div class="km kn do aw ko b kp kq kr ks kt ku kv kw kx ky kz" data-selectable-paragraph="" id="2cc7" style="background-color: white; box-sizing: inherit; color: rgba(0, 0, 0, 0.84); font-family: medium-content-serif-font, Georgia, Cambria, "Times New Roman", Times, serif; font-size: 21px; letter-spacing: -0.004em; line-height: 1.58; margin-bottom: -0.46em; margin-top: 2em;"> Dengan memudahkan pengguna mendaftar dan masuk ke website kalian maka kalian bisa lebih mudah dalam mempelajari tingkah laku mereka dan bisa mengetahui bagaimana kalian bisa memberikan value yang lebih baik lagi untuk pengguna kalian.</div> <div class="km kn do aw ko b kp kq kr ks kt ku kv kw kx ky kz" data-selectable-paragraph="" id="8f6c" style="background-color: white; box-sizing: inherit; color: rgba(0, 0, 0, 0.84); font-family: medium-content-serif-font, Georgia, Cambria, "Times New Roman", Times, serif; font-size: 21px; letter-spacing: -0.004em; line-height: 1.58; margin-bottom: -0.46em; margin-top: 2em;"> Beberapa cara untuk memudahkan pengguna untuk mendaftarkan diri dan masuk ke website kalian adalah <a class="dg ca la lb lc ld" href="https://developers.google.com/web/fundamentals/security/credential-management/" style="-webkit-tap-highlight-color: transparent; background-image: url("data:image/svg+xml; background-position: 0px calc(1em + 1px); background-repeat: repeat-x; background-size: 1px 1px; box-sizing: inherit; http: //www.w3.org/2000/svg\"><line x1=\"0\" y1=\"0\" x2=\"1\" y2=\"1\" stroke=\"rgba(0, 0, 0, 0.84)\" /></svg>"); text-decoration-line: none;" target="_blank">pengaturan <em class="le" style="box-sizing: inherit;">credentials</em></a>, masuk dengan akun social media seperti Facebook atau Twitter, serta <a class="dg ca la lb lc ld" href="https://developers.google.com/identity/one-tap/web/" style="-webkit-tap-highlight-color: transparent; background-image: url("data:image/svg+xml; background-position: 0px calc(1em + 1px); background-repeat: repeat-x; background-size: 1px 1px; box-sizing: inherit; http: //www.w3.org/2000/svg\"><line x1=\"0\" y1=\"0\" x2=\"1\" y2=\"1\" stroke=\"rgba(0, 0, 0, 0.84)\" /></svg>"); text-decoration-line: none;" target="_blank"><em class="le" style="box-sizing: inherit;">Google one-tap sign-up and auto sign-in</em></a>.</div> <h1 class="lf lg do aw av dm lh li lj lk ll lm ln lo lp lq lr" data-selectable-paragraph="" id="8ae3" style="background-color: white; box-sizing: inherit; color: rgba(0, 0, 0, 0.84); font-family: medium-content-sans-serif-font, "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", Geneva, Arial, sans-serif; font-size: 34px; letter-spacing: -0.022em; line-height: 1.12; margin: 1.95em 0px -0.28em;"> 7. Memudahkan proses pembayaran</h1> <div class="km kn do aw ko b kp ls kr lt kt lu kv lv kx lw kz" data-selectable-paragraph="" id="daa3" style="background-color: white; box-sizing: inherit; color: rgba(0, 0, 0, 0.84); font-family: medium-content-serif-font, Georgia, Cambria, "Times New Roman", Times, serif; font-size: 21px; letter-spacing: -0.004em; line-height: 1.58; margin-bottom: -0.46em; margin-top: 0.86em;"> Bila kalian adalah startup atau layanan yang memerlukan proses pembayaran, salah satu isu terbesar di <em class="le" style="box-sizing: inherit;">mobile</em> adalah kompleksitas pembayaran. Banyaknya informasi yang harus dimasukkan dengan layar dan papan ketik terbatas membuat orang kebanyakan jadi malas untuk melanjutkan.</div> <div class="km kn do aw ko b kp kq kr ks kt ku kv kw kx ky kz" data-selectable-paragraph="" id="eb06" style="background-color: white; box-sizing: inherit; color: rgba(0, 0, 0, 0.84); font-family: medium-content-serif-font, Georgia, Cambria, "Times New Roman", Times, serif; font-size: 21px; letter-spacing: -0.004em; line-height: 1.58; margin-bottom: -0.46em; margin-top: 2em;"> Konversi pembayaran di <em class="le" style="box-sizing: inherit;">mobile</em> masih di bawah <em class="le" style="box-sizing: inherit;">desktop</em> padahal dari sisi trafik <em class="le" style="box-sizing: inherit;">mobile</em> masih lebih besar dari <em class="le" style="box-sizing: inherit;">desktop</em>. Salah satu yang kalian bisa lakukan implementasi<em class="le" style="box-sizing: inherit;"> </em><a class="dg ca la lb lc ld" href="https://developers.google.com/web/updates/2015/06/checkout-faster-with-autofill" style="-webkit-tap-highlight-color: transparent; background-image: url("data:image/svg+xml; background-position: 0px calc(1em + 1px); background-repeat: repeat-x; background-size: 1px 1px; box-sizing: inherit; http: //www.w3.org/2000/svg\"><line x1=\"0\" y1=\"0\" x2=\"1\" y2=\"1\" stroke=\"rgba(0, 0, 0, 0.84)\" /></svg>"); text-decoration-line: none;" target="_blank"><em class="le" style="box-sizing: inherit;">auto fill checkout form</em></a> atau <a class="dg ca la lb lc ld" href="https://developers.google.com/web/fundamentals/payments/" style="-webkit-tap-highlight-color: transparent; background-image: url("data:image/svg+xml; background-position: 0px calc(1em + 1px); background-repeat: repeat-x; background-size: 1px 1px; box-sizing: inherit; http: //www.w3.org/2000/svg\"><line x1=\"0\" y1=\"0\" x2=\"1\" y2=\"1\" stroke=\"rgba(0, 0, 0, 0.84)\" /></svg>"); text-decoration-line: none;" target="_blank"><em class="le" style="box-sizing: inherit;">Payment Request API</em></a>untuk memudah pembayaran. Dua cara tersebut mampu mengurangi usaha yang diperlukan oleh pengguna untuk menyelesaikan proses pembayaran.</div> <h1 class="lf lg do aw av dm lh li lj lk ll lm ln lo lp lq lr" data-selectable-paragraph="" id="0f59" style="background-color: white; box-sizing: inherit; color: rgba(0, 0, 0, 0.84); font-family: medium-content-sans-serif-font, "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", Geneva, Arial, sans-serif; font-size: 34px; letter-spacing: -0.022em; line-height: 1.12; margin: 1.95em 0px -0.28em;"> Penutup</h1> <div class="km kn do aw ko b kp ls kr lt kt lu kv lv kx lw kz" data-selectable-paragraph="" id="fe6c" style="background-color: white; box-sizing: inherit; color: rgba(0, 0, 0, 0.84); font-family: medium-content-serif-font, Georgia, Cambria, "Times New Roman", Times, serif; font-size: 21px; letter-spacing: -0.004em; line-height: 1.58; margin-bottom: -0.46em; margin-top: 0.86em;"> Itulah 7 langkah yang kalian bisa coba untuk memberikan pengalaman progresif atau bertahap kepada pengguna kalian di web. Dari 7 langkah tersebut, tahapan 1–3 merupakan yang paling prioritas karena bertujuan untuk memberikan kemudahan untuk pengguna bisa mengenal <em class="le" style="box-sizing: inherit;">value</em> yang kalian tawarkan. Dan tidak harus sekaligus, kalian bisa mengimplementasikan komponen tersebut secara bertahap. Setelah itu kalian bisa melihat tergantung dari kebutuhan pengguna kalian.<br /> <br /> sumber : <a href="https://medium.com/wwwid/progressive-web-apps-mulai-dari-mana-bd223a941782" style="letter-spacing: -0.004em;">https://medium.com/wwwid/progressive-web-apps-mulai-dari-mana-bd223a941782</a></div>