Netlify Functionsプロジェクトをデプロイしよう【Nuxt.js×TypeScript】
  • 2022.02.13に公開
  • ブログ構築TS
  • 8. NetlifyFunctionsを使った検索機能
  • No.2 / 9

今回達成すること

Netlifyの本番用サーバーに、前回作成したFunctionsプロジェクトをデプロイします。

Functionsプロジェクトをビルドする

デプロイ前にはfunctions:buildコマンドを実行し、プロジェクトをzipファイルにします。

% yarn netlify functions:build --src netlify/functions

◈ Building functions
◈ Functions built to  /Users/andou/dev/nuxtjs/demo_blog_v2/netlify/functions
  • --src ... このフラグの引数にFunctionsプロジェクトが入ったディレクトリを指定する。指定しないとエラーになる。

「functions」ディレクトリ直下にzipファイルが作成されました。

functions
├── hello-world
│   └── hello-world.ts
└── hello-world.zip

デプロイする

Functionsプロジェクトは、通常のデプロイコマンドで自動デプロイしてくれます。

% yarn netlify:deploy

今まで表示されなかったFunctionsのデプロイログが表示されました。

────────────────────────────────────────────────────────────────
  2. Functions bundling
────────────────────────────────────────────────────────────────
Packaging Functions from netlify/functions directory:
 - hello-world.zip
 - hello-world/hello-world.ts

Functions path:   /Users/andou/dev/nuxtjs/demo_blog_v2/netlify/functions

Netlifyの管理画面からデプロイを確認する

Netlifyの管理画面を開きます。

% yarn netlify open:admin

ヘッダーメニューの「Functions」へ移動すると、hello-worldプロジェクトが表示されます。

2022-02-11 23-57-47

表示されるhello-worldプロジェクトをクリックすると、本番用のアクセスURLが表示されます。

2022-02-13 12-34-59

ここにアクセスすると、Netlifyサーバー上のFunctions関数が実行されます。

2022-02-11 21-03-22

実行後、先ほどの画面にログが表示されます。

2022-02-13 12-38-42

このURLにaxiosモジュールを使ってNuxtからAPIリクエストを行うことで、サーバーを操作することができます。

本番環境のFunctionsプロジェクトを削除する

本番環境のFunctionsプロジェクトを削除するコマンドは用意されていません。

削除する場合は、プロジェクトディレクトリとzipファイルを削除して再デプロイを行います。

% rm -rf netlify/functions/hello-world
% rm -rf netlify/functions/hello-world.zip
% yarn netlify:deploy --skip-functions-cache

--skip-functions-cacheオプション

functions:deploy のコマンドオプション。

以前作成された関数を無視し、再デプロイを強制します。

このオプションを使用しないと、以前作成されたFunctionsプロジェクトが本番環境に残ってしまいます。

対して、Functionsを追加したいだけの場合は、--skip-functions-cacheオプションを付けないでデプロイします。

削除を確認しよう

先ほどの同じページ「Functions」メニュー内には、hello-worldプロジェクトが表示されなくなりました。

2022-02-13 12-53-48

ScriptコマンドでFunctionsを管理する

netlify functionsコマンドを扱いやすくするために、package.jsonscriptコマンドを追加します。

functions:createコマンド

プロジェクトを作成するcreateコマンドを作成します。

package.json
{
  ...
  "scripts": {
    ...
    "netlify": "netlify",
    // 追加
    "functions:create": "netlify functions:create",
  },
}

functions:serveコマンド

Functionsサーバーを起動するserveコマンドは、「functions」ディレクトリ内にzipファイルがあると、サーバーアクセス時にエラーが発生します。

% yarn netlify functions:serve

Request from ::1: GET /.netlify/functions/hello-world
{"level":"error","message":"End - Error:"}
{"errorMessage":"Invalid or unexpected token",
 "errorType":"SyntaxError",
 "level":"error",
 "stackTrace":["\u0004\u0014","","","taxError: Invalid or unexpected token",...

これはserveコマンドがBeta版であるために発生すると考えられます。

functions:serve (Beta) Serve functions locally

引用: Netlify CLI functions command

そこで、serveコマンド実行前には「functions」ディレクトリ以下の全てのzipファイルを削除するコマンドを追加します。

package.json
{
  ...
  "config": {
    "publish_dir": "dist",
    // 追加
    "functions_dir": "netlify/functions"
  },
  "scripts": {
    "rm:publish_dir": "rm -rf $npm_package_config_publish_dir",
    // 追加
    "rm:functions_zip": "rm -rf $npm_package_config_functions_dir/*.zip",
    ...
    "functions:create": "netlify functions:create",
    // 追加
    "functions:dev": "yarn rm:functions_zip && netlify functions:serve",
  },
}

functions:buildコマンド

本番デプロイ用のzipファイルを作成するコマンドは、常に「netlify/functions」ディレクトリを参照するように設定します。

package.json
{
  ...
  "scripts": {
    ...
    "functions:dev": "yarn rm:functions_zip && netlify functions:serve",
    // 追加
    "functions:build": "netlify functions:build --src $npm_package_config_functions_dir",
  },
}

deployコマンド

Functionsプロジェクトのデプロイ専用コマンドを追加します。

ローカルプロジェクトの最新の状態を本番環境にデプロイするために、--skip-functions-cacheオプションを付与します。

package.json
{
  ...
  "scripts": {
    ...
    "netlify:deploy": "netlify deploy --build --prod --open",
    // 追加
    "functions:open": "netlify open:admin /functions",
    "functions:deploy": "yarn functions:build && yarn netlify:deploy --skip-functions-cache && yarn functions:open"
  },
}

デプロイ用のzipファイルは、functions:buildコマンドが実行されると、常に最新のファイルに書き変わります。

最終的なpackage.json

最終的なpackage.jsonscriptコマンドは以下のようになります。

package.json
{
  ...
  "config": {
    "publish_dir": "dist",
    "functions_dir": "netlify/functions"
  },
  "scripts": {
    "rm:publish_dir": "rm -rf $npm_package_config_publish_dir",
    "rm:functions_zip": "rm -rf $npm_package_config_functions_dir/*.zip",
    "dev": "yarn rm:publish_dir && nuxt",
    "build": "nuxt build",
    "start": "nuxt start",
    "generate": "yarn rm:publish_dir && nuxt generate",
    "lint:js": "eslint --ext \".js,.ts,.vue\" --ignore-path .gitignore .",
    "lint": "yarn lint:js",
    "lintfix": "yarn lint:js --fix",
    "test": "jest",
    "netlify": "netlify",
    "functions:create": "netlify functions:create",
    "functions:dev": "yarn rm:functions_zip && netlify functions:serve",
    "functions:build": "netlify functions:build --src $npm_package_config_functions_dir",
    "netlify:deploy": "netlify deploy --build --prod --open",
    "functions:open": "netlify open:admin /functions",
    "functions:deploy": "yarn functions:build && yarn netlify:deploy --skip-functions-cache && yarn functions:open"
  },
}

OK、これで準備は整いました。

今回の作業は以上です。

% git add -A
% git commit -m "Deploy functions project"

次回は?

次回から本格的にFunctionsプロジェクトを作成します。

axiosを使ってNuxtからFunctionsへリクエストを投げ、レスポンスを受け取る実装を行います。

あなたの力になれること
私自身が独学でプログラミングを勉強してきたので、一人で学び続ける苦しみは痛いほど分かります。そこで、当時の私がこんなのあったら良いのにな、と思っていたサービスを立ち上げました。周りに質問できる人がいない、答えの調べ方が分からない、ここを聞きたいだけなのにスクールは高額すぎる。そんな方に向けた単発・短期間メンターサービスを行っています。
独学プログラマのサービス
ブログ構築TSの投稿
1
  • Nuxt.js×TypeScript開発環境構築
  • /
  • #01
Nuxt.jsをローカルPCに立ち上げよう
2
  • Nuxt.js×TypeScript開発環境構築
  • /
  • #02
Nuxt.jsプロジェクトをGitHubにPushしよう
3
  • Nuxt.js×TypeScript開発環境構築
  • /
  • #03
nuxt-property-decoratorのインストールとTypeScriptのセットアップ
1
  • Vuetifyセットアップ
  • /
  • #01
TypeScript環境のNuxt.jsにVuetifyを導入しよう
2
  • Vuetifyセットアップ
  • /
  • #02
VuetifyにカスタムCSSを追加してSASS変数を理解しよう
3
  • Vuetifyセットアップ
  • /
  • #03
VuetifyにカスタムSVGアイコンを追加しよう
1
  • NetlifyCLIを使ったNuxtデプロイ
  • /
  • #01
Netlify CLIをインストールして本番環境のサイトを作成しよう
2
  • NetlifyCLIを使ったNuxtデプロイ
  • /
  • #02
netlify.tomlを使ってNuxt.jsをNetlifyに手動デプロイしよう
1
  • Contentfulモデル構築
  • /
  • #01
Contentfulの料金とCommunityプランの無料枠を理解する
2
  • Contentfulモデル構築
  • /
  • #02
Contentfulへ新規会員登録、ロケールの変更、API Keyの発行を行う
3
  • Contentfulモデル構築
  • /
  • #03
Contentful ブログカテゴリーモデルを作成しよう
4
  • Contentfulモデル構築
  • /
  • #04
Contentful カテゴリーモデルに1対1で関連づくblogPostモデルを作成しよう
5
  • Contentfulモデル構築
  • /
  • #05
Contentful ブログ記事に1対多で関連づくplogTagモデルを作成しよう
6
  • Contentfulモデル構築
  • /
  • #06
Contentful カテゴリー・ブログ記事・タグコンテンツを作成しよう
1
  • Nuxt.js×Contentfulセットアップ
  • /
  • #01
Nuxt.js×Contentfulセットアップ。モジュールのインストールからAPI Keyの登録まで
2
  • Nuxt.js×Contentfulセットアップ
  • /
  • #02
Contentful APIリクエストの実行 Nuxt.jsにブログコンテンツを表示しよう
3
  • Nuxt.js×Contentfulセットアップ
  • /
  • #03
ContentfulAPIをNetlifyにデプロイしよう【Nuxt FullStaticのasyncDataとfetch】
1
  • Vuex×TypeScriptセットアップ
  • /
  • #01
Vuexの型付け vuex-module-decoratorsとnuxt-typed-vuexどちらを使用するか
2
  • Vuex×TypeScriptセットアップ
  • /
  • #02
nuxt-typed-vuexのインストールとセットアップ。Vuexの型定義と呼び出し方
3
  • Vuex×TypeScriptセットアップ
  • /
  • #03
VuexにContentfulの型定義ファイルとnuxtServerInitを追加しよう
4
  • Vuex×TypeScriptセットアップ
  • /
  • #04
VuexにContentfulAPIレスポンスを保存してVueファイルに表示しよう
1
  • コンテンツページ構築
  • /
  • #01
ブログアプリのページ設計とNuxt.jsの動的ルーティングについて理解しよう
2
  • コンテンツページ構築
  • /
  • #02
カテゴリーのコンテンツページを作成しよう【Nuxt.js×Contentful】
3
  • コンテンツページ構築
  • /
  • #03
カテゴリーに関連付くブログ記事一覧を表示しよう【Nuxt.js×Contentful】
4
  • コンテンツページ構築
  • /
  • #04
injectを使用して共通エラー処理メソッドを作成しよう【Nuxt×TypeScript】
5
  • コンテンツページ構築
  • /
  • #05
NuxtChildを使用してブログ記事ページを作成しよう【Nuxt.js×TypeScript】
6
  • コンテンツページ構築
  • /
  • #06
タグ一覧ページとタグ関連づく記事一覧を表示しよう【Nuxt.js×TypeScript】
7
  • コンテンツページ構築
  • /
  • #07
プライバシーポリシーページを作成しよう【Nuxt.js×TypeScript】
8
  • コンテンツページ構築
  • /
  • #08
@nuxtjs/i18nのインストールとセットアップ。ページタイトルの翻訳化【TypeScript】
1
  • NetlifyFunctionsを使った検索機能
  • /
  • #01
Netlify Functionsを使ってクエリを返す関数を作成しよう【Nuxt.js×TypeScript】
2
  • NetlifyFunctionsを使った検索機能
  • /
  • #02
Netlify Functionsプロジェクトをデプロイしよう【Nuxt.js×TypeScript】
3
  • NetlifyFunctionsを使った検索機能
  • /
  • #03
Nuxt.js × axiosセットアップ Netlify Functionsにリクエストを行う準備をしよう
4
  • NetlifyFunctionsを使った検索機能
  • /
  • #04
オリジン•CORS•プリフライトリクエストを理解する【Nuxt.js×Netlify Functions】
5
  • NetlifyFunctionsを使った検索機能
  • /
  • #05
Netlify Functionsを使ってフォームバリデーション機能を構築しよう【Nuxt.js】
6
  • NetlifyFunctionsを使った検索機能
  • /
  • #06
ツールバーに表示する検索フォームを作成しよう【Nuxt.js×TypeScript】
7
  • NetlifyFunctionsを使った検索機能
  • /
  • #07
検索ページを作成しよう【Vue propsとTypeScriptの書き方 解説】
8
  • NetlifyFunctionsを使った検索機能
  • /
  • #08
Netlify FunctionsからContentfulAPIリクエストを送ろう【Nuxt.js】
9
  • NetlifyFunctionsを使った検索機能
  • /
  • #09
検索ページに「もっと見る」ボタンを実装しよう【Nuxt.js×TypeScript】
1
  • ブログMarkdown対応
  • /
  • #01
@nuxtjs/markdownitのインストールとセットアップ【Nuxt.js×TypeScript】
2
  • ブログMarkdown対応
  • /
  • #02
Nuxt.js×markdown-it 外部リンクを別タブで開くプラグインを追加しよう
3
  • ブログMarkdown対応
  • /
  • #03
Nuxt.js×markdown-it 内部リンクをVueRouterで高速にページ遷移しよう
4
  • ブログMarkdown対応
  • /
  • #04
Nuxt.js×markdown-it アンカーリンクとブログ目次を自動生成しよう
独学プログラマ
独学でも、ここまでできるってよ。
CONTACT
Nuxt.js制作のご依頼は下記メールアドレスまでお送りください。