Githubは、選択した場合はすでに電子メールを介して通知を送信していますが、多くの調査では、プッシュ通知が電子メールよりも優れていることが示されています。このチュートリアルに従ってGitHubトラッカーを構築した後、次の方法を学びました。
サービスワーカーを追加し、トラッカーをPWA
以前のsvelte知識
。プッシュ通知が動作
アプリがクローズされている場合、通常の通知ではアプリを開いてもらう必要があります。 プッシュ通知は、サービスワーカーと呼ばれるものを使用することにより、Chromeのような最新のWebブラウザでサポートされています。サービスワーカーは、ブラウザのメインスレッドとは別に実行されるJavaScriptの小さな断片であり、その結果、アプリがPWA(Progressive Webアプリケーション)としてインストールされている場合、オフラインで実行できます。 プッシュ通知は、チャットアプリケーションで使用されて、ユーザーが未読メッセージ、ゲーム、ゲームイベントのユーザーに通知、ニュースサイト、ユーザーに記事を壊すことを通知し、他の多くの目的のために通知します。 アプリにプッシュ通知を表示する4つのステップがあります: window.notification.RequestPermission()で許可を要求します アプリをPWAに変換してインストールします
イベントをプッシュするように購読してください
プッシュイベントを受信したら、通知を送信します
ステップ1:トラッカーの作成
この記事では、ロールアップの代わりに、vite.jsでSvelteを使用してみましょう。 Viteは、その名前が示すように、ロールアップよりも速く、環境変数の組み込みサポートも提供します。 SvelteとViteを使用して新しいプロジェクトを作成するには、このコマンドを実行してください。次に、プロジェクトフォルダーにCDを使用すると、TailWindCSSをアプリケーションに追加して、これらのコマンドを使用してすべての依存関係をインストールできます。
<span>npm init vite </span>
でアプリケーションを開始します。
トラッカーがどのように動作するか最初のステップは、ユーザーにユーザー名を促すことです。 SRC/lib/usernameprompt.svelteを作成します。これがフォームの私のUIですが、あなたが望むようにそれを設計することができます:
このコンポーネントをapp.svelteのように追加します:
npx svelte-add tailwindcss <span># Install packages </span><span>yarn install # or npm install </span>
次に、メイントラッカーUIを追加しましょう。ファイルsrc/lib/tracker.svelteを作成し、その中の以下のコードを追加します:
<span><span><span><script</span>></span><span> </span></span><span><span> <span>let username = ""; </span></span></span><span><span> <span>async function submit() { </span></span></span><span><span> <span>// TODO </span></span></span><span><span> <span>} </span></span></span><span><span></span><span><span></script</span>></span> </span> <span><span><span><form</span> </span></span><span> <span><span>on:submit|preventDefault</span><span>="{submit}"</span> </span></span><span> <span>class<span>="mx-auto min-w-[350px] max-w-[1100px] w-[50%] border border-gray-500 rounded my-4 px-6 py-4"</span> </span></span><span><span>></span> </span> <span><span><span><h1</span> class<span>="text-center text-3xl m-4"</span>></span>Enter a username<span><span></h1</span>></span> </span> <span><span><span><p</span> class<span>="text-center text-xl m-4"</span>></span>Enter a username to use this tracker<span><span></p</span>></span> </span> <span><span><span><input</span> </span></span><span> <span>type<span>="text"</span> </span></span><span> <span>class<span>="rounded px-4 py-2 border border-gray-300 w-full outline-none"</span> </span></span><span> <span>placeholder<span>="Username"</span> </span></span><span> <span>aria-label<span>="Username"</span> </span></span><span> <span><span>bind:value</span><span>="{username}"</span> </span></span><span> <span>/></span> </span> <span><span><span><button</span> </span></span><span> <span>class<span>="mt-4 border border-transparent bg-blue-500 text-white rounded px-4 py-2 w-full"</span> </span></span><span> <span>></span> </span> Submit <span><span><span></button</span>></span> </span><span><span><span></form</span>></span> </span>
コンポーネントをテストするには、
<span><span><span><script</span>></span><span> </span></span><span><span> <span>import <span>UsernamePrompt</span> from "./lib/UsernamePrompt.svelte"; </span></span></span><span><span></span><span><span></script</span>></span> </span> <span><span><span><UsernamePrompt</span> /></span> </span>
app.svelte:
画面は次のようになります<span><span><span><script</span>></span><span> </span></span><span><span> <span>let repo = ""; </span></span></span><span><span> <span>function track() { </span></span></span><span><span> <span>// TODO </span></span></span><span><span> <span>} </span></span></span><span><span> </span></span><span><span> <span>function untrack(repo) { </span></span></span><span><span> <span>// TODO </span></span></span><span><span> <span>} </span></span></span><span><span></span><span><span></script</span>></span> </span> <span><span><span><form</span> </span></span><span> <span><span>on:submit|preventDefault</span><span>={track}</span> </span></span><span> <span>class<span>="mx-auto min-w-[350px] max-w-[1100px] w-[50%] border border-gray-500 rounded my-4 px-6 py-4"</span> </span></span><span><span>></span> </span> <span><span><span><h1</span> class<span>="text-center text-3xl m-4"</span>></span>GitHub tracker<span><span></h1</span>></span> </span> <span><span><span><input</span> </span></span><span> <span>type<span>="text"</span> </span></span><span> <span>class<span>="rounded px-4 py-2 border border-gray-300 w-full outline-none"</span> </span></span><span> <span>placeholder<span>="Enter the repository's URL"</span> </span></span><span> <span>aria-label<span>="Repository URL"</span> </span></span><span> <span><span>bind:value</span><span>={repo}</span> </span></span><span> <span>/></span> </span> <span><span><span><button</span> </span></span><span> <span>class<span>="mt-2 border border-transparent bg-blue-500 text-white rounded px-4 py-2 w-full"</span> </span></span><span> <span>></span>Track repository<span><span></button</span> </span></span><span> <span>></span> </span> <span><span><span><h2</span> class<span>="mt-4 text-2xl"</span>></span>Tracked repositories<span><span></h2</span>></span> </span> <span><span><span><ul</span> class<span>="m-2 list-decimal"</span>></span> </span> <span><!-- We'll use a loop to automatically add repositories here later on. --> </span> <span><span><span><li</span> class<span>="py-1 flex items-center justify-between"</span>></span> </span> <span><span><span><a</span> class<span>="text-gray-500 hover:underline"</span> href<span>="https://github.com/test/test"</span> </span></span><span> <span>></span>https://github.com/test/test<span><span></a</span> </span></span><span> <span>></span> </span> <button on:click={() => untrack("")} >Untrack<span><span><span></button</span> </span></span><span> <span>></span> </span> <span><span><span></li</span>></span> </span> <span><span><span></ul</span>></span> </span><span><span><span></form</span>></span> </span>
注:app.svelteを以前のコードに復元することを忘れないでください!
アプリケーションにプッシュイベントを送信するには、バックエンドサーバーが必要です。これは、新しい(多分)ExpressJSプロジェクトを作成し、それを個別に展開する必要があることを意味します。これはすべて、プッシュ通知を実験している人にとっては頭痛の種になります。 vercelクラウドは救助に機能します!クラウド関数は、エクスプレスルートのようなものです。 URLを取得すると、コードを実行して応答を提供できます。 Vercelはクラウド機能をサポートしています。 APIフォルダーにファイルを作成するだけです。クライアント側の秘密を公開することは決して良いことではないので、クラウド関数を使用してMongoDBと対話します。
まず、Mongodb Atlasにクラスターがあることを確認してください。 Mongodbには無料のプラン(
データベースに接続するには、接続文字列が必要です。新しいユーザーとパスワードをどこかに保存し、クラスターの概要にアクセスしてください。右側の接続ボタンをクリックし、[接続方法としてアプリケーションを接続]を選択します。以下の文字列に似た接続文字列が表示されます。
接続文字列ができたので、データベースに接続できますが、最初に、現在のアプリケーションをVercelに展開する必要があります。これを行う最も簡単な方法は、githubを使用することです
新しいgithubリポジトリを作成し、コードをプッシュします。次に、vercelダッシュボードに移動し、[新しいプロジェクト]ボタンをクリックします。 githubリポジトリをインポートし、フレームワークがviteであることを確認し、mongodb_urlと呼ばれる環境変数を追加します。 MongoDBデータベースの接続文字列にその値を設定します。ウェブサイトが展開されたら、Yarn DevからVercel Devにローカル開発コマンドを変更する必要があります。コマンドを実行すると、既存のプロジェクトにリンクするように求められたら、[はい]をクリックします。
注:npm i -g vercelでvercelCliをインストールしてください。 私のように、Vercel DevでViteを使用することに問題が発生した場合は、プロジェクトの
DevelopmentコマンドをViteのViteから$ポートに変更してください。 これにより、正しい環境変数をローカルに使用してクラウド関数を使用できます。
接続が多すぎずにMongoDBにアクセスできるヘルパーファイルを追加しましょう。ファイルAPI/_Mongo.jsを作成し、次のコードを入れます。 APIディレクトリ内のファイルは、クラウド関数として扱われない_意志ではありません。これにより、ヘルパーやその他のロジックを別々のファイルに追加できます。 メインクライアント自体の代わりに接続の約束をエクスポートすることで、サーバーレスプラットフォームで作業しているため、冗長接続が発生しません。 Esmodulesの代わりにcommonjsを使用して
を使用しますインポートの代わりにrequireを使用する方法に注意してください。これは、執筆時点で、vercel Cloud関数
これにより、APIディレクトリで必要なステートメントを使用できるようになりました。このコマンドにmongodb接続ドライバーをインストールします:
トラッカーは、今のところ実際には機能していないので、それを修正しましょう。 認証のために、ユーザーがMongoDBデータベースに入力しているというユーザー名を保存する必要があります。
ファイル /api /storeusername.jsを作成します。これはクラウド機能になり、http:// localhost:3000/api/storeusernameにマッピングされます。以下のコードを入れてください:
次に、Mongodbクライアントを次のように取得します: リクエストの本文からユーザー名を抽出します: 次に、このユーザー名をデータベースに保存する必要があります。
これは、ユーザーコレクションに新しいドキュメントを作成するはずです。
リポジトリの追跡 ファイルAPI/trackRepo.jsを作成します。これは、 /api /trackRepo:
そして最後に、データベースに追加してリポジトリを追跡するコードを追加します。
クラウド関数を追加して、リポジトリを追跡してみましょう。ファイルAPI/untrackrepo.jsを作成します。これは、 /api /untrackrepo:
ユーザーの追跡リポジトリにアクセスできるようになったので、追跡されたリポジトリの正確なリストを表示するには、tracker.svelteのHTMLテンプレートを更新しましょう。
でのみサポートされています。はい、サポートされているブラウザ アプリをインストール可能にするには、プログレッシブWebアプリに変換する必要があります。これは3段階のプロセスです: 3つのステップすべてが完了した場合、アプリケーションにアクセスすると、アドレスバーにインストールボタンが表示されます。
サービスワーカーを追加するには、CSSファイルと同様に、公開されているJavaScriptファイルを追加する必要があります。名前は実際には重要ではありませんが、通常はservice-worker.jsまたはsw.jsという名前です。このファイルはCSSのように公開される必要があるため、パブリックディレクトリに入れてください。
、 であることに注意する必要があります。 :// localhost:3000/service-worker.js、それはパブリックディレクトリにあるためです。
ページをリロードしてコンソールを開くと、上記のメッセージが表示されます。
アプリをオフラインにするには、サービスワーカーを使用してコンテンツをキャッシュする必要があります。アプリはクラウド機能を要求しているため、ネットワークがない場合は実際にはできません。そのため、アプリのキャッシュされた機能のないバージョンを表示する代わりに、オフラインであることを示すページを表示しましょう。 public/offline.htmlファイルを作成し、次のコードを入れます。
キャッシュが開かれ、cache.addを使用してキャッシュに目的のルートが追加されます。これは、インストール中に発生します。<span>npm init vite
</span>
認証
<span>npm init vite
</span>
npx svelte-add tailwindcss
<span># Install packages
</span><span>yarn install # or npm install
</span>
<span><span><span><script</span>></span><span>
</span></span><span><span> <span>let username = "";
</span></span></span><span><span> <span>async function submit() {
</span></span></span><span><span> <span>// TODO
</span></span></span><span><span> <span>}
</span></span></span><span><span></span><span><span></script</span>></span>
</span>
<span><span><span><form</span>
</span></span><span> <span><span>on:submit|preventDefault</span><span>="{submit}"</span>
</span></span><span> <span>class<span>="mx-auto min-w-[350px] max-w-[1100px] w-[50%] border border-gray-500 rounded my-4 px-6 py-4"</span>
</span></span><span><span>></span>
</span> <span><span><span><h1</span> class<span>="text-center text-3xl m-4"</span>></span>Enter a username<span><span></h1</span>></span>
</span> <span><span><span><p</span> class<span>="text-center text-xl m-4"</span>></span>Enter a username to use this tracker<span><span></p</span>></span>
</span>
<span><span><span><input</span>
</span></span><span> <span>type<span>="text"</span>
</span></span><span> <span>class<span>="rounded px-4 py-2 border border-gray-300 w-full outline-none"</span>
</span></span><span> <span>placeholder<span>="Username"</span>
</span></span><span> <span>aria-label<span>="Username"</span>
</span></span><span> <span><span>bind:value</span><span>="{username}"</span>
</span></span><span> <span>/></span>
</span>
<span><span><span><button</span>
</span></span><span> <span>class<span>="mt-4 border border-transparent bg-blue-500 text-white rounded px-4 py-2 w-full"</span>
</span></span><span> <span>></span>
</span> Submit
<span><span><span></button</span>></span>
</span><span><span><span></form</span>></span>
</span>
<span><span><span><script</span>></span><span>
</span></span><span><span> <span>import <span>UsernamePrompt</span> from "./lib/UsernamePrompt.svelte";
</span></span></span><span><span></span><span><span></script</span>></span>
</span>
<span><span><span><UsernamePrompt</span> /></span>
</span>
<span><span><span><script</span>></span><span>
</span></span><span><span> <span>let repo = "";
</span></span></span><span><span> <span>function track() {
</span></span></span><span><span> <span>// TODO
</span></span></span><span><span> <span>}
</span></span></span><span><span>
</span></span><span><span> <span>function untrack(repo) {
</span></span></span><span><span> <span>// TODO
</span></span></span><span><span> <span>}
</span></span></span><span><span></span><span><span></script</span>></span>
</span>
<span><span><span><form</span>
</span></span><span> <span><span>on:submit|preventDefault</span><span>={track}</span>
</span></span><span> <span>class<span>="mx-auto min-w-[350px] max-w-[1100px] w-[50%] border border-gray-500 rounded my-4 px-6 py-4"</span>
</span></span><span><span>></span>
</span> <span><span><span><h1</span> class<span>="text-center text-3xl m-4"</span>></span>GitHub tracker<span><span></h1</span>></span>
</span>
<span><span><span><input</span>
</span></span><span> <span>type<span>="text"</span>
</span></span><span> <span>class<span>="rounded px-4 py-2 border border-gray-300 w-full outline-none"</span>
</span></span><span> <span>placeholder<span>="Enter the repository's URL"</span>
</span></span><span> <span>aria-label<span>="Repository URL"</span>
</span></span><span> <span><span>bind:value</span><span>={repo}</span>
</span></span><span> <span>/></span>
</span> <span><span><span><button</span>
</span></span><span> <span>class<span>="mt-2 border border-transparent bg-blue-500 text-white rounded px-4 py-2 w-full"</span>
</span></span><span> <span>></span>Track repository<span><span></button</span>
</span></span><span> <span>></span>
</span>
<span><span><span><h2</span> class<span>="mt-4 text-2xl"</span>></span>Tracked repositories<span><span></h2</span>></span>
</span> <span><span><span><ul</span> class<span>="m-2 list-decimal"</span>></span>
</span> <span><!-- We'll use a loop to automatically add repositories here later on. -->
</span> <span><span><span><li</span> class<span>="py-1 flex items-center justify-between"</span>></span>
</span> <span><span><span><a</span> class<span>="text-gray-500 hover:underline"</span> href<span>="https://github.com/test/test"</span>
</span></span><span> <span>></span>https://github.com/test/test<span><span></a</span>
</span></span><span> <span>></span>
</span> <button on:click={() => untrack("")}
>Untrack<span><span><span></button</span>
</span></span><span> <span>></span>
</span> <span><span><span></li</span>></span>
</span> <span><span><span></ul</span>></span>
</span><span><span><span></form</span>></span>
</span>
<span><span><span><script</span>></span><span>
</span></span><span><span> <span>// import UsernamePrompt from "./lib/UsernamePrompt.svelte";
</span></span></span><span><span> <span>import <span>Tracker</span> from "./lib/Tracker.svelte";
</span></span></span><span><span></span><span><span></script</span>></span>
</span>
<span><!-- <UsernamePrompt /> -->
</span><span><span><span><Tracker</span> /></span>
</span>
<span>const { MongoClient } = require("mongodb");
</span>
<span>const mongo = new MongoClient(process.env.MONGODB_URL);
</span>
<span>// Export the connection promise
</span><span>export default mongo.connect();
</span>
<span>{
</span> <span>"type": "commonjs"
</span><span>}
</span>
それらに1つずつ作業しましょう。
<span># Don't forget to CD!
</span><span>cd api
</span><span>npm i mongodb # or use yarn
</span>
<span>const mongoPromise = require("../src/lib/mongo");
</span><span>// All cloud functions must export a function that takes a req and res object.
</span><span>// These objects are similar to their express counterparts.
</span>module<span>.exports = async (req<span>, res</span>) => {
</span> <span>// TODO
</span><span>};
</span>
crackingリポジトリ
<span>npm init vite
</span>
npx svelte-add tailwindcss
<span># Install packages
</span><span>yarn install # or npm install
</span>
<span><span><span><script</span>></span><span>
</span></span><span><span> <span>let username = "";
</span></span></span><span><span> <span>async function submit() {
</span></span></span><span><span> <span>// TODO
</span></span></span><span><span> <span>}
</span></span></span><span><span></span><span><span></script</span>></span>
</span>
<span><span><span><form</span>
</span></span><span> <span><span>on:submit|preventDefault</span><span>="{submit}"</span>
</span></span><span> <span>class<span>="mx-auto min-w-[350px] max-w-[1100px] w-[50%] border border-gray-500 rounded my-4 px-6 py-4"</span>
</span></span><span><span>></span>
</span> <span><span><span><h1</span> class<span>="text-center text-3xl m-4"</span>></span>Enter a username<span><span></h1</span>></span>
</span> <span><span><span><p</span> class<span>="text-center text-xl m-4"</span>></span>Enter a username to use this tracker<span><span></p</span>></span>
</span>
<span><span><span><input</span>
</span></span><span> <span>type<span>="text"</span>
</span></span><span> <span>class<span>="rounded px-4 py-2 border border-gray-300 w-full outline-none"</span>
</span></span><span> <span>placeholder<span>="Username"</span>
</span></span><span> <span>aria-label<span>="Username"</span>
</span></span><span> <span><span>bind:value</span><span>="{username}"</span>
</span></span><span> <span>/></span>
</span>
<span><span><span><button</span>
</span></span><span> <span>class<span>="mt-4 border border-transparent bg-blue-500 text-white rounded px-4 py-2 w-full"</span>
</span></span><span> <span>></span>
</span> Submit
<span><span><span></button</span>></span>
</span><span><span><span></form</span>></span>
</span>
<span><span><span><script</span>></span><span>
</span></span><span><span> <span>import <span>UsernamePrompt</span> from "./lib/UsernamePrompt.svelte";
</span></span></span><span><span></span><span><span></script</span>></span>
</span>
<span><span><span><UsernamePrompt</span> /></span>
</span>
<span><span><span><script</span>></span><span>
</span></span><span><span> <span>let repo = "";
</span></span></span><span><span> <span>function track() {
</span></span></span><span><span> <span>// TODO
</span></span></span><span><span> <span>}
</span></span></span><span><span>
</span></span><span><span> <span>function untrack(repo) {
</span></span></span><span><span> <span>// TODO
</span></span></span><span><span> <span>}
</span></span></span><span><span></span><span><span></script</span>></span>
</span>
<span><span><span><form</span>
</span></span><span> <span><span>on:submit|preventDefault</span><span>={track}</span>
</span></span><span> <span>class<span>="mx-auto min-w-[350px] max-w-[1100px] w-[50%] border border-gray-500 rounded my-4 px-6 py-4"</span>
</span></span><span><span>></span>
</span> <span><span><span><h1</span> class<span>="text-center text-3xl m-4"</span>></span>GitHub tracker<span><span></h1</span>></span>
</span>
<span><span><span><input</span>
</span></span><span> <span>type<span>="text"</span>
</span></span><span> <span>class<span>="rounded px-4 py-2 border border-gray-300 w-full outline-none"</span>
</span></span><span> <span>placeholder<span>="Enter the repository's URL"</span>
</span></span><span> <span>aria-label<span>="Repository URL"</span>
</span></span><span> <span><span>bind:value</span><span>={repo}</span>
</span></span><span> <span>/></span>
</span> <span><span><span><button</span>
</span></span><span> <span>class<span>="mt-2 border border-transparent bg-blue-500 text-white rounded px-4 py-2 w-full"</span>
</span></span><span> <span>></span>Track repository<span><span></button</span>
</span></span><span> <span>></span>
</span>
<span><span><span><h2</span> class<span>="mt-4 text-2xl"</span>></span>Tracked repositories<span><span></h2</span>></span>
</span> <span><span><span><ul</span> class<span>="m-2 list-decimal"</span>></span>
</span> <span><!-- We'll use a loop to automatically add repositories here later on. -->
</span> <span><span><span><li</span> class<span>="py-1 flex items-center justify-between"</span>></span>
</span> <span><span><span><a</span> class<span>="text-gray-500 hover:underline"</span> href<span>="https://github.com/test/test"</span>
</span></span><span> <span>></span>https://github.com/test/test<span><span></a</span>
</span></span><span> <span>></span>
</span> <button on:click={() => untrack("")}
>Untrack<span><span><span></button</span>
</span></span><span> <span>></span>
</span> <span><span><span></li</span>></span>
</span> <span><span><span></ul</span>></span>
</span><span><span><span></form</span>></span>
</span>
クラウド関数はHTTP get requestを使用して呼び出されるため、ボディを入れることはできないため、クエリ文字列を使用してユーザー名を渡します。また、user.trackedReposはnullである可能性があるため、配列を返すようにしています。次に、このクラウド機能をフロントエンドで使用する時が来ました! src/lib/tracker.svelteファイルにfetchreposと呼ばれる非同期関数を作成します。この関数は、作成したばかりのクラウド関数を使用して、データベースからユーザーの追跡リポジトリを取得する責任があります。
<span><span><span><script</span>></span><span>
</span></span><span><span> <span>// import UsernamePrompt from "./lib/UsernamePrompt.svelte";
</span></span></span><span><span> <span>import <span>Tracker</span> from "./lib/Tracker.svelte";
</span></span></span><span><span></span><span><span></script</span>></span>
</span>
<span><!-- <UsernamePrompt /> -->
</span><span><span><span><Tracker</span> /></span>
</span>
<span>const { MongoClient } = require("mongodb");
</span>
<span>const mongo = new MongoClient(process.env.MONGODB_URL);
</span>
<span>// Export the connection promise
</span><span>export default mongo.connect();
</span>
<span>{
</span> <span>"type": "commonjs"
</span><span>}
</span>
<span># Don't forget to CD!
</span><span>cd api
</span><span>npm i mongodb # or use yarn
</span>
<span>const mongoPromise = require("../src/lib/mongo");
</span><span>// All cloud functions must export a function that takes a req and res object.
</span><span>// These objects are similar to their express counterparts.
</span>module<span>.exports = async (req<span>, res</span>) => {
</span> <span>// TODO
</span><span>};
</span>
module<span>.exports = async (req<span>, res</span>) =>
</span> <span>// Wait for the client to connect
</span> <span>const mongo = await mongoPromise;
</span><span>}
</span>
サービスワーカーは、ブラウザのメインスレッドからバックグラウンドで実行できるJavaScriptファイルです。これにより、オフラインで実行したり、バックグラウンドで実行したり、大きなファイルをダウンロードしたりするなどのことを行うことができます。それらは主にキャッシュリクエストやイベントを聴くために使用されます。
<span>npm init vite
</span>
npx svelte-add tailwindcss
<span># Install packages
</span><span>yarn install # or npm install
</span>
古いキャッシュが削除されるため、最新のキャッシュのみがユーザーのコンピューターに保存されます。これは、より少ないストレージを利用します。これは、アクティブ化中に発生します
であるかどうかを確認します。つまり、ルートを変更します。リクエストが成功した場合、それはすべてうまくいきますが、リクエストが失敗した場合、ユーザーに表示されるOffline.htmlページを配信します。これは、フェッチ中に発生します 最初のステップを実装しましょう。サービスワーカーファイルを開き、インストールイベントのハンドラーを次のように変更します。
そしてそれに伴い、offline.htmlページをキャッシュする必要があります。ダブルチェックするには、
<span>npm init vite </span>
を押して開発者ツールを開き、[アプリケーション]タブを選択します。サイドバーには、キャッシュストレージタブが必要です。それをクリックすると、 /offline.html。
に注意する必要があります
npx svelte-add tailwindcss <span># Install packages </span><span>yarn install # or npm install </span>
今やるべきことは、ネットワークがないときにこのファイルを提供することだけです:
event.respondwith()関数は、渡される応答オブジェクトを使用してネットワークフェッチ要求に応答します。この場合、最初にリクエストを取得します。リクエストが失敗した場合、これがインターネットの問題のためである可能性が高い場合、サービスワーカーによってキャッシュされたOffline.htmlページを送信しています。ページを更新して、Wi-Fiまたはイーサネットをオフにします。更新するときに、デフォルトのChrome「ネットワークなし」ページの代わりに、オフラインページを表示する必要があります。残念ながらこのオフラインページには恐竜のゲームがありませんが、アプリケーションをPWAとしてインストールすることができます。
サービスワーカーがどのように見えるかは次のとおりです
manifest.jsonファイルを追加
<span><span><span><script</span>></span><span> </span></span><span><span> <span>let username = ""; </span></span></span><span><span> <span>async function submit() { </span></span></span><span><span> <span>// TODO </span></span></span><span><span> <span>} </span></span></span><span><span></span><span><span></script</span>></span> </span> <span><span><span><form</span> </span></span><span> <span><span>on:submit|preventDefault</span><span>="{submit}"</span> </span></span><span> <span>class<span>="mx-auto min-w-[350px] max-w-[1100px] w-[50%] border border-gray-500 rounded my-4 px-6 py-4"</span> </span></span><span><span>></span> </span> <span><span><span><h1</span> class<span>="text-center text-3xl m-4"</span>></span>Enter a username<span><span></h1</span>></span> </span> <span><span><span><p</span> class<span>="text-center text-xl m-4"</span>></span>Enter a username to use this tracker<span><span></p</span>></span> </span> <span><span><span><input</span> </span></span><span> <span>type<span>="text"</span> </span></span><span> <span>class<span>="rounded px-4 py-2 border border-gray-300 w-full outline-none"</span> </span></span><span> <span>placeholder<span>="Username"</span> </span></span><span> <span>aria-label<span>="Username"</span> </span></span><span> <span><span>bind:value</span><span>="{username}"</span> </span></span><span> <span>/></span> </span> <span><span><span><button</span> </span></span><span> <span>class<span>="mt-4 border border-transparent bg-blue-500 text-white rounded px-4 py-2 w-full"</span> </span></span><span> <span>></span> </span> Submit <span><span><span></button</span>></span> </span><span><span><span></form</span>></span> </span>
をWebサイトにリンクしている必要があります。アプリケーションにマニフェストを追加しましょう。これには発電機をお気軽に使用してください:
アプリケーション用のアイコンの束をダウンロードする必要があります。これらのアイコンは異なるサイズで、異なるオペレーティングシステムで使用されています。ソースコードリポジトリから、またはこのリンクを使用してダウンロードできます。 zipファイルをpublic/iconsに抽出してください。
<span><span><span><script</span>></span><span> </span></span><span><span> <span>import <span>UsernamePrompt</span> from "./lib/UsernamePrompt.svelte"; </span></span></span><span><span></span><span><span></script</span>></span> </span> <span><span><span><UsernamePrompt</span> /></span> </span>
次に、manifestとアイコンをindex.htmlファイルに追加する必要があります。次のコードを入れることでそうすることができます:
<span>npm init vite </span>
f12を押して、灯台に移動して[灯台]タブに移動して新しい監査を作成して、開発者ツールを開きます。これで、PWAセクションで「インストール可能な」スコアを取得する必要があります。これは、WebサイトをWebAppに正常に変換したことを意味し、アドレスバーのボタンをクリックしてインストールできるようになりました。
非同期であり、デフォルトに等しく、拒否され、付与される文字列を返します。これらは、ユーザーがXを押したり、拒否を押したり、通知プロンプトを押したりすると、それぞれ拒否を押すと返されます。この関数を呼び出すには、app.svelteのオンマウントフックを使用します。
アプリでの通知を許可するように依頼するポップアップを取得する必要があります。通知を送信する許可があるので、サービスワーカーを使用してサブスクライブしてイベントをプッシュしましょう。これは、サービスワーカーのpushmanager.subscribe()関数を使用して実行できます。これをサービスワーカー自体で行うか、app.svelteにサービスワーカーを登録した後に行うことができます。後者を使用するので、同じことをしたい場合は、navigator.serviceworker.registerの機能を下に置き換えます。npx svelte-add tailwindcss <span># Install packages </span><span>yarn install # or npm install </span>
コンソールを開くと、ApplicationServerkeyが欠落しているというエラーが発生します。プッシュ通知には、プッシュメッセージを送信するためにサーバーが必要であり、これらのサーバーはVapidキーで認証されています。これらのキーはサーバーを識別し、プッシュメッセージが有効であることをブラウザに知らせます。 Vercel Cloud関数を使用してプッシュメッセージを送信するため、セットアップする必要があります。
プッシュメッセージサーバーの作成<span><span><span><script</span>></span><span> </span></span><span><span> <span>let username = ""; </span></span></span><span><span> <span>async function submit() { </span></span></span><span><span> <span>// TODO </span></span></span><span><span> <span>} </span></span></span><span><span></span><span><span></script</span>></span> </span> <span><span><span><form</span> </span></span><span> <span><span>on:submit|preventDefault</span><span>="{submit}"</span> </span></span><span> <span>class<span>="mx-auto min-w-[350px] max-w-[1100px] w-[50%] border border-gray-500 rounded my-4 px-6 py-4"</span> </span></span><span><span>></span> </span> <span><span><span><h1</span> class<span>="text-center text-3xl m-4"</span>></span>Enter a username<span><span></h1</span>></span> </span> <span><span><span><p</span> class<span>="text-center text-xl m-4"</span>></span>Enter a username to use this tracker<span><span></p</span>></span> </span> <span><span><span><input</span> </span></span><span> <span>type<span>="text"</span> </span></span><span> <span>class<span>="rounded px-4 py-2 border border-gray-300 w-full outline-none"</span> </span></span><span> <span>placeholder<span>="Username"</span> </span></span><span> <span>aria-label<span>="Username"</span> </span></span><span> <span><span>bind:value</span><span>="{username}"</span> </span></span><span> <span>/></span> </span> <span><span><span><button</span> </span></span><span> <span>class<span>="mt-4 border border-transparent bg-blue-500 text-white rounded px-4 py-2 w-full"</span> </span></span><span> <span>></span> </span> Submit <span><span><span></button</span>></span> </span><span><span><span></form</span>></span> </span>
Web-Push NPMパッケージを使用して、キーを生成し、プッシュイベントを送信します。それをインストールするには、APIフォルダーにCDを使用して次のことを実行します。
これら2つのキーをコピーして、vercelの環境変数として保存します。 vapid_private_keyやvapid_public_keyのような記憶に残るものを必ず呼んでください。
<span><span><span><script</span>></span><span> </span></span><span><span> <span>import <span>UsernamePrompt</span> from "./lib/UsernamePrompt.svelte"; </span></span></span><span><span></span><span><span></script</span>></span> </span> <span><span><span><UsernamePrompt</span> /></span> </span>
ここで、クラウド関数に関する作業を開始できます。ファイルAPI/vapidkeys.jsを作成します。このファイルは、クライアントにpublicvapidキーを送信する責任があります。プライベートVapidキーを共有しないでくださいを初期化する必要があります
<span>npm init vite </span>
npx svelte-add tailwindcss <span># Install packages </span><span>yarn install # or npm install </span>
vapidキーのみを取得する方法
<span><span><span><script</span>></span><span> </span></span><span><span> <span>let username = ""; </span></span></span><span><span> <span>async function submit() { </span></span></span><span><span> <span>// TODO </span></span></span><span><span> <span>} </span></span></span><span><span></span><span><span></script</span>></span> </span> <span><span><span><form</span> </span></span><span> <span><span>on:submit|preventDefault</span><span>="{submit}"</span> </span></span><span> <span>class<span>="mx-auto min-w-[350px] max-w-[1100px] w-[50%] border border-gray-500 rounded my-4 px-6 py-4"</span> </span></span><span><span>></span> </span> <span><span><span><h1</span> class<span>="text-center text-3xl m-4"</span>></span>Enter a username<span><span></h1</span>></span> </span> <span><span><span><p</span> class<span>="text-center text-xl m-4"</span>></span>Enter a username to use this tracker<span><span></p</span>></span> </span> <span><span><span><input</span> </span></span><span> <span>type<span>="text"</span> </span></span><span> <span>class<span>="rounded px-4 py-2 border border-gray-300 w-full outline-none"</span> </span></span><span> <span>placeholder<span>="Username"</span> </span></span><span> <span>aria-label<span>="Username"</span> </span></span><span> <span><span>bind:value</span><span>="{username}"</span> </span></span><span> <span>/></span> </span> <span><span><span><button</span> </span></span><span> <span>class<span>="mt-4 border border-transparent bg-blue-500 text-white rounded px-4 py-2 w-full"</span> </span></span><span> <span>></span> </span> Submit <span><span><span></button</span>></span> </span><span><span><span></form</span>></span> </span>
プッシュ通知をサブスクライブしていない場合。コンソールを開くと、コンソールに記録されたサブスクリプションが表示されます。
提供されるエンドポイントは、私たちにとって非常に重要です。このエンドポイントを使用すると、Webプッシュを使用してこのユーザーに通知できます。クラウド関数を作成して、このエンドポイントをデータベースに保存しましょう。ファイルAPI/storeEndpoint.jsを作成します:
ボディからサブスクリプションとユーザー名をつかみましょう:
<span><span><span><script</span>></span><span> </span></span><span><span> <span>import <span>UsernamePrompt</span> from "./lib/UsernamePrompt.svelte"; </span></span></span><span><span></span><span><span></script</span>></span> </span> <span><span><span><UsernamePrompt</span> /></span> </span>
データベースに追加しましょう:
<span><span><span><script</span>></span><span> </span></span><span><span> <span>let repo = ""; </span></span></span><span><span> <span>function track() { </span></span></span><span><span> <span>// TODO </span></span></span><span><span> <span>} </span></span></span><span><span> </span></span><span><span> <span>function untrack(repo) { </span></span></span><span><span> <span>// TODO </span></span></span><span><span> <span>} </span></span></span><span><span></span><span><span></script</span>></span> </span> <span><span><span><form</span> </span></span><span> <span><span>on:submit|preventDefault</span><span>={track}</span> </span></span><span> <span>class<span>="mx-auto min-w-[350px] max-w-[1100px] w-[50%] border border-gray-500 rounded my-4 px-6 py-4"</span> </span></span><span><span>></span> </span> <span><span><span><h1</span> class<span>="text-center text-3xl m-4"</span>></span>GitHub tracker<span><span></h1</span>></span> </span> <span><span><span><input</span> </span></span><span> <span>type<span>="text"</span> </span></span><span> <span>class<span>="rounded px-4 py-2 border border-gray-300 w-full outline-none"</span> </span></span><span> <span>placeholder<span>="Enter the repository's URL"</span> </span></span><span> <span>aria-label<span>="Repository URL"</span> </span></span><span> <span><span>bind:value</span><span>={repo}</span> </span></span><span> <span>/></span> </span> <span><span><span><button</span> </span></span><span> <span>class<span>="mt-2 border border-transparent bg-blue-500 text-white rounded px-4 py-2 w-full"</span> </span></span><span> <span>></span>Track repository<span><span></button</span> </span></span><span> <span>></span> </span> <span><span><span><h2</span> class<span>="mt-4 text-2xl"</span>></span>Tracked repositories<span><span></h2</span>></span> </span> <span><span><span><ul</span> class<span>="m-2 list-decimal"</span>></span> </span> <span><!-- We'll use a loop to automatically add repositories here later on. --> </span> <span><span><span><li</span> class<span>="py-1 flex items-center justify-between"</span>></span> </span> <span><span><span><a</span> class<span>="text-gray-500 hover:underline"</span> href<span>="https://github.com/test/test"</span> </span></span><span> <span>></span>https://github.com/test/test<span><span></a</span> </span></span><span> <span>></span> </span> <button on:click={() => untrack("")} >Untrack<span><span><span></button</span> </span></span><span> <span>></span> </span> <span><span><span></li</span>></span> </span> <span><span><span></ul</span>></span> </span><span><span><span></form</span>></span> </span>
そして、最終的なクラウド関数の見た目は次のとおりです
<span><span><span><script</span>></span><span> </span></span><span><span> <span>// import UsernamePrompt from "./lib/UsernamePrompt.svelte"; </span></span></span><span><span> <span>import <span>Tracker</span> from "./lib/Tracker.svelte"; </span></span></span><span><span></span><span><span></script</span>></span> </span> <span><!-- <UsernamePrompt /> --> </span><span><span><span><Tracker</span> /></span> </span>
この関数は、通知をプッシュするために購読するたびに呼び出される必要があります。サブ変数に値
および<span>const { MongoClient } = require("mongodb"); </span> <span>const mongo = new MongoClient(process.env.MONGODB_URL); </span> <span>// Export the connection promise </span><span>export default mongo.connect(); </span>
<script><span >
<span ><span > <span >import <span >UsernamePrompt from "./lib/UsernamePrompt.svelte";
<span ><span ><span ><span ></script>
最初に、ユーザーの追跡されたリポジトリのいずれかが新しい問題を抱えているかどうかを確認する必要があります。これは、array.someメソッドで実行できます。 array.some()指定されたコールバック関数が配列の任意の要素に対してtrueを返すかどうかを判断するため、これを簡単に使用して次を確認できます。
そして最後に、通知を送信します:
<script><span >
<span ><span > <span >let repo = "";
<span ><span > <span >function track() {
<span ><span > <span >// TODO
<span ><span > <span >}
<span ><span >
<span ><span > <span >function untrack(repo) {
<span ><span > <span >// TODO
<span ><span > <span >}
<span ><span ><span ><span ></script>
そして、クラウド関数がどのように見えるかは次のとおりです
<script><span >
<span ><span > <span >// import UsernamePrompt from "./lib/UsernamePrompt.svelte";
<span ><span > <span >import <span >Tracker from "./lib/Tracker.svelte";
<span ><span ><span ><span ></script>
プッシュイベントを聴く
const { MongoClient } = require("mongodb");
const mongo = new MongoClient(process.env.MONGODB_URL);
// Export the connection promise
export default mongo.connect();
やるべきことは、サービスワーカーのプッシュイベントを聞くことだけです。サービスワーカーを開き、以下にコードを追加します:
クラウド関数を呼び出すと、おそらくCurlを使用して、ブラウザコンソールに新しい問題が記録されているのが表示されます。それはあまり役に立たないので、通知を送ってみましょう:
{
"type": "commonjs"
}
MongodbからFetched Collectionを削除し、クラウド関数を再度呼び出します。これで、Webブラウザから通知を受け取る必要があります。
# Don't forget to CD!
cd api
npm i mongodb # or use yarn
Vercelを使用してアプリケーションを展開します。または、githubにプッシュして、アプリをPWAとしてインストールし、https:// your_vercel_app/api/fetchghに移動してクラウド関数を実行すると、アプリケーションを開いていなくても通知を受け取る必要があります!
通知を受け取らない場合、またはWebプッシュから410エラーが発生した場合は、尋ねられたら、プロンプトで通知を永久に許可してください。
ステップ6:CRONジョブの作成
クラウド関数を手動で呼び出す必要がある場合、トラッカーは実際にはトラッカーではありませんよね? EasyCronを使用して、クラウド機能を1時間ごとに自動的に呼び出します。
easycronダッシュボードに向かい、新しいCronジョブを作成します。 URLの場合、https:// your_vercel_domain/api/fetchghを入力し、間隔を選択します。私は1時間ごとに行きますが、あなたが好きなようにそれをカスタマイズしてください。
結論
そしてそれで、追跡されたリポジトリのいずれかに新しい問題/PRがあるたびに通知を取得する必要があります。どこにでも立ち往生している場合は、ソースコードまたはライブバージョンを自由にチェックしてください。
Svelteのプッシュ通知を備えたGitHubトラッカーの作成に関するよくある質問(FAQ)<
svelteでのエラー処理は、JavaScriptコードのTry/Catchブロックを使用して実行できます。たとえば、GitHub APIからデータを取得しているときにエラーが発生した場合、エラーをキャッチしてユーザーに役立つメッセージを表示できます。 >はい、Svelteを使用して、プライベートリポジトリ用のGitHubトラッカーを作成できます。 GitHubアカウント設定から生成できる個人的なアクセストークンを使用してGitHub APIで認証する必要があります。 JestやMochaなどのさまざまなJavaScriptテストライブラリを使用して実行できます。これらのライブラリを使用すると、コンポーネントのテストとリアクティブステートメントのテストを作成して、正しく機能していることを確認できます。サーバーへのgithubトラッカー。 Svelteは、任意の静的ファイルサーバーで提供できるPlain JavaScript、CSS、およびHTMLにコードをコンパイルします。 SvelteまたはGithub APIが変更されたら、それに応じてGitHubトラッカーを更新する必要があります。これには、Svelteコードを更新して新しい機能または構文を使用するか、API呼び出しを更新してGitHub APIの変更に合わせます。 GitHubトラッカーが正しく機能し続けることを確認するために、定期的に更新をチェックすることが重要です。
以上がSvelteにプッシュ通知を備えたGitHubトラッカーを作成しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。