DEV Community

Cover image for 我如何在15分鐘內開發了Nothing PWA
Henry Lim
Henry Lim

Posted on

4 1

我如何在15分鐘內開發了Nothing PWA

英文版 (English Version): Zero to 15 — Building a Nothing PWA in 15 mins

什麼是 Nothing?

原版的“Nothing” Android 應用程序是由Chilango Lab所開發的。這應用程序在Google Play 商店已經突破了一百萬下載了, 並有高達4.2顆星星的高評價🎉 。

而這Android版的Nothing應用,其實也沒有什麼功能。但是這應用裡卻又一個非常獨特的彩蛋 ( ͡° ͜ʖ ͡°).

話說如此,這Android版的Nothing應用程序大小卻是14MB。更慘的是,在安裝後卻佔據了19.24MB。這讓我突發奇想,我有什麼辦法能縮小這個應用程序的大小呢?


(左圖) Nothing Android 應用: 19.24MB — (右圖) Nothing 漸進式網頁應用: 205KB

解決方法是非常的簡單。我可以使用HTML, CSS, 和 JavaScript來縮小應用程序的大小。但是,我可以將它帶到更高的水平,那就是將它提升成漸進式網頁應用(PWA)。這樣,用戶能在沒有互聯網的情況之下使用,並還是可以正常地使用,同時也能將這PWA添加到主頁。

👩🏻‍🎨 Icon 設計

在我開始深入討論前,讓我先為這個Nothing PWA設計一個美麗的icon。

我今天所使用的工具是叫Launcher Icon Generator。這是由一名叫Roman Nurik的谷歌員工所開發的開源工具

我在超短的時間裡,使用了Launcher Icon Generator來設計了一個非常漂亮的icon(見上圖)。

此外,這個工具也會自動地講icon導出到不同的大小: 48px, 72px, 96px, 144px, 192px 以及 512px。這功能提供了極大的方便。

PWACompat

好的,我已經將icon設計好了,下一步就是icon放進網頁裡。

首先,我先創建一個新的Web App Manifest文件,並將icon的資料、應用的名字、主題顏色、等等寫在manifest.json文件中。這樣的話,Android版的Chrome將會在這PWA啟動時,會自動地顯示啟動畫面。

但是不是每個游覽器都支持這啟動畫面的功能。我要怎樣做才可以將這個功能帶到全部游覽器呢?

讓我來介紹PWACompat,PWACompat是一個能將Web App Manifest的功能帶到不支持Web App Manifest的瀏覽器的工具庫。這一來,這能將漸進式網頁應用(PWA)的功能帶到更多的瀏覽器。

這PWACompat非常容易地使用,您只需要在你的代碼中加入Web App Manifest (manifest.json)以及PWACompat (pwacompat.min.js) 即可 (見以下的代碼)。

<link rel="manifest" href="manifest.json" />
<script async src="https://cdn.jsdelivr.net/npm/pwacompat@2.0.6/pwacompat.min.js"
    integrity="sha384-GOaSLecPIMCJksN83HLuYf9FToOiQ2Df0+0ntv7ey8zjUHESXhthwvq9hXAZTifA"
    crossorigin="anonymous"></script>
Enter fullscreen mode Exit fullscreen mode


在Safari中的啟動畫面 (iOS)

就這樣,我成功地將PWA啟動畫面帶到了舊游覽器 (以上的例子是iOS的Safari)。但是這不是PWACompat全部的功能,PWACompat的功能是比你想像中還要多喔。

就讓我看看PWACompat有什麼其他的功能:

— 根據Manifest文件中的icon資料,自動地在<head>中添加icon meta標籤 (以及favicon)

— 根據Manifest文件中的theme_color 属性,自動地在<head>中添加主題顏色的meta標籤

— 等等

🏠 添加到主屏幕

這是我在漸進式網頁應用中最喜歡的功能了,那就是添加到主屏幕(A2HS)。但是,在Chrome 68之後,Chrome將會顯示一個比較小個的迷你信息欄,來取代之前的比較大個的安裝橫幅


😵 再見了,網絡應用安裝橫幅 (Chrome 67 前)

儘管如此,這個迷你信息欄也是一個暫時性的解決方案,這將會在未來的Chrome更新中去除。因此,我需要使用一個更好的添加到主屏幕的UX。


(左圖) 安裝按鈕 — (中圖) 安裝按鈕 + A2HS 迷你信息欄 — (右圖) A2HS 對話框

如果游覽器支持添加到主屏幕的功能,這將會在網頁上方顯示一個“安裝”按鈕。當用戶點擊安裝按鈕,網頁就會顯示A2HS對話框 (見以下的代碼)。


var installPromptEvent;
var btnInstall = document.querySelector('#install');

window.addEventListener('beforeinstallprompt', function (event) {
    event.preventDefault();
    installPromptEvent = event;
    btnInstall.removeAttribute('disabled');
});

btnInstall.addEventListener('click', function () {
    btnInstall.setAttribute('disabled', '');
    installPromptEvent.prompt();
    installPromptEvent.userChoice.then((choice) => {
        if (choice.outcome === 'accepted') {
            console.log('User accepted the A2HS prompt');
        } else {
            console.log('User dismissed the A2HS prompt');
        }
        installPromptEvent = null;
    });
});
Enter fullscreen mode Exit fullscreen mode

如果網頁符合了添加到主屏幕的條件,游覽器將會發動“beforeinstallprompt”的事件(event)

🥚 彩蛋


Spoiler Alert !!!

這是Nothing PWA裡的彩蛋: 科拿米秘技 (Konami Code) + 10 個小時的YouTube視頻


⬆️⬆️⬇️️⬇️⬅️➡️⬅️➡️👆🏻👆🏻

當用戶成功的完成了科拿米秘技,這Nothing PWA將會把用戶轉載到這個非常特別的YouTube視頻

在這Nothing PWA中,我是使用了這Konami-JS。我選擇使用這個的原因是因為它的文檔非常小,而且非常容易的使用。

並且如此,這Konami-JS也支持了手機。而唯一的分別是這科拿米秘技會從“上,上,下,下,左,右,左,右,B, A” 變成 “上,上,下,下,左,右,左,右,點擊,點擊”。

拉動刷新

就在這時,我發現到了一個小問題。若是用戶是使用著手機或是使用觸碰螢幕時,當他們在往下滑的時候,就會不小心刷新到網頁。

我應該要怎樣解決這個問題呢?

好消息是,我可以使用overscroll-behavior-y: contain來避免拉動刷新網頁。

就這樣,問題解決了!

☁️ 網頁託管

這Nothing PWA是部署在Netlify上。

什麼是Netlify呢?

Netlify是一個功能非常完整的前端網頁託管平台。而這次我選擇使用Netlify的原因十分簡單,那就是Netlify非常的容易使用,而且Netlify是可以免費使用的!


Netlify Dashboard

如果您要將您的網頁部署到Netlify的話,您有3個辦法: 使用命令行工具、手動部署、或者是使用持續部署。

命令行工具 (CLI)

這是部署網站最普遍的方式了。將Netlify命令行工具安裝到您的電腦,登錄到您的Netlify,初始化項目, 然後您就能將您的網站部署到Netlify了。

> brew tap netlify/netlifyctl 
> brew install netlifyctl
> netlifyctl login
> netlifyctl init
> netlifyctl deploy
Enter fullscreen mode Exit fullscreen mode

手動部署

這個方法是Netlify最簡單的部署網頁的方式: 拖放部署 (Drag and Drop)。

通過這個方式,開發者只需要將網頁的文件夾拖放進去Netlify的網站就可以了。這個功能非常酷,這讓我希望Firebase能在Firebase Hosting中添加這個功能。

持續部署 (Continuous Deployment)

這Nothing PWA我是使用持續部署來自動的講網頁部署到Netlify。

當我的GitHub項目連接到Netlify後,只要我將代碼push到GitHub時,Netlify就會自動地將網頁部署到Netlify。這自動部署,提供了自動更新的功能真是非常的方便!

🔒 HTTPS!

由於漸進式網頁應用的其中一個必要條件是來自安全的 origin, 所以我必須確保這網頁是有正确地实施HTTPS。

好消息是Netlify提供了免費的HTTPS給大家,這也包括了自定義域名。

Netlify也提供了一個非常棒的功能,那就是HSTS (HTTP Strict Transport Security)。啟動後,您的網頁將會強制性地被轉載到HTTPS版。這可以確保網頁是一直在HTTPS的情況下運行。

💡Lighthouse

Lighthouse是一個開源的自動化工具,用於改進網絡應用的質量。您可以使用Lighthouse來分析網頁的性能,SEO,等等。您可以根據Lighthouse報告來研究如果將您的網頁變到更好。

欸不錯哦? 我成功了在performance拿到97分,及PWA, accessibility, best practices 和 SEO都拿到了滿分100。 🔥

您可以在這裡查看完整的Lighthouse報告: https://builder-dot-lighthouse-ci.appspot.com/report.1533954675085.html

🎉 嘗試看看

就這樣,我成功了地在15分鐘內將一個19MB的Android應用程序轉換成一個漸進式網頁應用,並將應用縮小到205KB!🎉

🚀 您可以在這裡嘗試Nothing PWA: nothing.limhenry.xyz

這PWA的代碼可以在GitHub上找到: github.com/limhenry/nothing

AWS Security LIVE!

Join us for AWS Security LIVE!

Discover the future of cloud security. Tune in live for trends, tips, and solutions from AWS and AWS Partners.

Learn More

Top comments (0)

Heroku

Simplify your DevOps and maximize your time.

Since 2007, Heroku has been the go-to platform for developers as it monitors uptime, performance, and infrastructure concerns, allowing you to focus on writing code.

Learn More

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay