一部のプロジェクト要件では、静的ページの生成は 十分 、それはまた最も 効率的 速度とスケーラビリティの観点から。
に このシリーズの前半 、組み合わせました Node.js 、Express、MongoDB、cron、および Heroku 毎日のスケジュールに従ってGitHubのAPIを使用するCI対応のバックエンドを提供します。これで、Gatsbyをミックスに追加して、静的ページ生成プロジェクトを完了する準備ができました。
ギャツビーのウェブサイトはに基づいているので React 、Reactを使用してWebサイトを構築する方法に既に精通している場合に役立ちます。
スタイリングには、Bootstrap、reactstrap、react-markdownが好きでした。あなたはそれを知っているかもしれません GitHubのリリースノートはMarkdown形式で保存されます したがって、コンバーターが必要です。
ファイル/フォルダーの構造は次のようになります。
これらのファイルは何のためのものですか?どれどれ:
env.development
およびenv.production
環境変数構成ファイルです。all-repositories.js
テンプレートは、リポジトリのリストを含む当社のホームページに使用されます。repository.js
テンプレートは、特定のリポジトリの詳細を表示するために使用されます。gatsby-node.js
ここでバックエンドエンドポイントを使用し、createPage
を実行しますメソッド。package.json
は、いつものように、依存関係とプロジェクトプロパティを含みます。global.css
私たちのメインスタイルシートファイルです。バックエンドと同様に、npm install
を実行します(または、Yarnがインストールされている場合はyarn
)必要な依存関係をフロントエンドのpackage.json
に追加した後:
{ // ... 'dependencies': { 'axios': '^0.18.0', 'bootstrap': '^4.3.1', 'gatsby': '^2.0.0', 'react': '^16.5.1', 'react-dom': '^16.5.1', 'react-markdown': '^4.0.6', 'reactstrap': '^7.1.0' } // ... }
env.development
およびenv.production
ファイルには、対応する環境のバックエンドURLのみが含まれます。前者は:
API_URL=http://localhost:3000
…本番環境には次のものがあります。
API_URL=https://[YOUR_UNIQUE_APP_NAME].herokuapp.com
gatsby-node.js
コードのビルド中に1回だけ実行されます。したがって、ここでバックエンドから必要なすべての情報を収集する必要があります。次に、応答をテンプレートで使用して、適切な静的ページを生成します。
私たちの場合、all-repositories.js
すべてのリポジトリが必要であり、repository.js
反復ごとに対応するリポジトリが必要です。最後に、リポジトリを渡して、ページパスを動的に生成できますowner
およびname
path
の一部としてのパラメーターフィールド:
const axios = require('axios'); require('dotenv').config({ path: `.env.${process.env.NODE_ENV}` }); const getRepositoryData = async () => { console.log(process.env.API_URL); return axios.get(`${process.env.API_URL}/repositories`); }; exports.createPages = async ({ actions: { createPage } }) => { let repositories = await getRepositoryData(); repositories = repositories.data; // Create a page that lists all repositories. createPage({ path: `/`, component: require.resolve('./src/templates/all-repositories.js'), context: { repositories } }); // Create a page for each repository. repositories.forEach(repository => { createPage({ path: `/repository/${repository.owner}/${repository.name}`, component: require.resolve('./src/templates/repository.js'), context: { repository } }); }); };
all-repositories.js
の場合およびrepository.js
、スタイリングを省略した場合、pageContext
からデータを収集するだけです。 Reactでパラメーターを使用するときに使用します。
all-repositories.js
では、repositories
を使用しますpageContext
のフィールドこのような:
export default ({pageContext: {repositories}}) => ( // ... {/* Because the repositories parameter is a list, we are iterating over all items and using their fields */} {repositories.map(repository => (repository.tagName && // ... {`${repository.repositoryDescription}`} // ... ))} // ... );
repository.js
については、代わりにrepository
を使用しますpageContext
のフィールド:
export default ({pageContext: {repository}}) => ( {repository.tagName && // ...
{/* This the place where we will use Markdown-formatted release notes */} } // ... );
ここで、バックエンドが稼働していることを確認します。このプロジェクトでは、次のように設定したことを思い出してください。 http:// localhost:3000 。
次に、gatsby develop
を実行しますフロントエンドプロジェクトのルートから開いて http:// localhost:8000 。
バックエンドにいくつかのリポジトリ(所有者/名前)を追加し、update-via-GitHub-API機能を少なくとも1回実行した場合は、次のように表示されます。
リポジトリの1つをクリックすると、次のように表示されます。
上記の変更後、 フロントエンドの実装が完了しました 。
すごい!これで、デプロイする必要があります。
この部分では、フロントエンドアプリケーションに変更を加える必要はありません。単純に展開します Netlify —そこにアカウントが必要です。
ただし、最初に、コードをGitHub、GitLab、またはBitbucketにデプロイする必要があります。バックエンドと同様に、 コードをGitHubにデプロイしました 。
次に、Netlifyにログインし、ダッシュボードの[Gitから新しいサイト]ボタンをクリックします。画面の手順に従って、Gitプロバイダーを選択し、リポジトリを見つけます。
最後のステップとして、コードを正しく構造化した場合、Netlifyは自動的にビルドコマンドを設定し、次のようにディレクトリを正しく公開します。
次に、「サイトの展開」をクリックします。ランダムに生成されたNetlifyサブドメインにサイトをデプロイしますが、いつでも変更できます。デプロイメントを次のように変更しました。 https://sample-create-page-api-gatsby.netlify.com 、完成したアプリのライブデモを見つけることができます。
ここまでは順調ですね。ただし、これは静的ページアプリケーションであるため、最新の状態に保つために毎日再構築する必要があります。
Netlifyのビルドフックはビルドトリガーとして機能するため、cronジョブの終了後にバックエンドからフックをトリガーできます。これを行うには、最初にNetlifyでビルドフックを作成します。
「ビルドとデプロイ→継続的デプロイ」セクションの下に、「ビルドフック」があります。 「ビルドフックの追加」をクリックします。
名前を付けて保存します。 (私はbuild-from-backend
と呼びました。)次に、生成されたリンクをコピーします。
それでは、バックエンドプロジェクトを開いて、これらの数行をcron.controller.js
に追加しましょう。ファイル。単にPOST
を送信していますNetlifyのビルドフックURLへのリクエスト。
const Axios = require('axios'); const Config = require('../config/env.config'); const NETLIFY_BUILD_HOOK_URI = Config.netlifyEndpoint; function updateGatsby() { if (NETLIFY_BUILD_HOOK_URI) { console.log('Gatsby build request will be send'); Axios.post(NETLIFY_BUILD_HOOK_URI).then(() => { console.log('Gatsby build request was successful'); }); } }
次に、updateDaily
を更新します関数:
function updateDaily() { RepositoryController.updateRepositories().then(() => { updateGatsby(); }); }
最後に、env.config.js
を更新しますnetlifyEndpoint
を設定するファイル環境変数から収集されるプロパティ:
'netlifyEndpoint': process.env.NETLIFY_BUILD_HOOK || ''
次に、NETLIFY_BUILD_HOOK
を設定する必要があります少し前にNetlifyからコピーした環境変数。 Herokuでは、 アプリケーションの「設定」セクションから環境変数を設定できます 。
コミットをプッシュした後、バックエンドアプリケーションはビルドリクエストをNetlifyに送信し、cronジョブの最後にページが毎日更新されます。 リポジトリは次のようになります ビルドフック機能を追加した後、の最終バージョンとともに バックエンドリポジトリ そして フロントエンドリポジトリ 。
プロジェクトの最後の仕上げとして、使用方法を示します。 AWS AWS CloudWatchによってトリガーされるLambda関数は、毎日の更新ごとに時間内にバックエンドをウェイクアップします。
AWS Lambda サーバーレスコンピューティングプラットフォームです。必要なのは 非常に基本 ここで私たちの目的のためにこのプラットフォームの。 AWSアカウントが必要です。
まず、アカウントでAWSにログインし、Lambda ManagementConsoleを見つけます。たとえば、us-east-2
の場合、次の場所にあります。 https://us-east-2.console.aws.amazon.com/lambda/home 。
まだ選択されていない場合は、「機能」セクションに移動します。
ここでは、「関数の作成」をクリックして、関数を最初から作成します。説明的な名前を付けましょう。 Node.jsをランタイム言語として使用します。次に、次の「関数の作成」をクリックして完成させます。
index.js
でコードを記述できる新しい関数のページにリダイレクトされます。
最初のラムダ関数を実装しましょう。サードパーティの依存関係がないため、Node.jsのコアモジュールを使用する必要があります。 (代わりにサードパーティの依存関係を有効にする場合は、 AWSのこのガイドに従ってください 。)
エクスポートされたメソッド名(この場合はhandler
)がページの「Handler」パラメーターと一致することを確認してください。
残りは単純ですGET
バックエンドへのリクエスト:
const https = require('https'); exports.handler = async (event) => { return new Promise((resolve, reject) => { https.get(process.env.HEROKU_APP_URL, (resp) => { let data = ''; resp.on('data', (chunk) => { data += chunk; }); resp.on('end', () => { resolve(JSON.parse(data)); }); }).on('error', (err) => { reject('Error: ' + err.message); }); }); };
必ずHEROKU_APP_URL
を設定してくださいページ内の環境変数、および構成を保存します。
最後のステップは、CloudWatchトリガールールを追加して、毎日の更新の10分前にこの関数を実行することです。このシリーズの記事では、23:50まで機能します。
CloudWatchトリガールールタイプは「スケジュール式」になり、受け入れられたフォーマットに従って、cron式はcron(50 23 * * ? *)
になります。
プライベートエクイティファンドの設立
これで、CloudWatchルールによってトリガーされるようにAWSLambda関数を設定しました。
Node.js / MongoDB / HerokuバックエンドにAWSLambda / CloudWatchを追加し、GatsbyとNetlifyがフロントエンドを生成してホストすることで、アプリが完成しました。
以前にライブデモリンクを共有しましたが、お気軽にチェックしてください 私のプロトタイプの拡張バージョン —追加の変更がいくつかあります。
これを同様のプロジェクトの青写真として使用できます。これらの記事が、アプリのプロトタイプをより速く、より費用効果の高い方法で作成するのに役立つことを願っています。読んでくれてありがとう!
Gatsby.js(または単に「Gatsby」)は、オープンソースのReactベースの静的サイト生成フレームワークです。
Netlifyは静的サイトホストであり、GitHub Pagesに似ていますが、いくつかの追加機能があります。
静的サイトジェネレーターは、現在のデータを使用してテンプレートから静的Webサイトを作成します。結果として得られるサイトは非常に高速ですが、定期的に生成できるということは、自動的に最新の状態に保つことができることを意味します。