tag:crieit.net,2005:https://crieit.net/tags/Now/feed 「Now」の記事 - Crieit Crieitでタグ「Now」に投稿された最近の記事 2020-04-27T23:20:13+09:00 https://crieit.net/tags/Now/feed tag:crieit.net,2005:PublicArticle/15876 2020-04-27T23:20:13+09:00 2020-04-27T23:20:13+09:00 https://crieit.net/posts/Vercel-Zeit-Now-Nuxt-js-2020 Vercel(元ZeitのNow)でNuxt.jsアプリをデプロイ 2020年最新版 <p><code>now</code> というコマンドを使わないVercel(元ZeitのNow)へのデプロイ方法を解説します。今回の手順ではNuxt.jsを使います。</p> <h2 id="背景"><a href="#%E8%83%8C%E6%99%AF">背景</a></h2> <p><code>now</code> というコマンドで簡単にデプロイできるということで一世を風靡したZeitのNowですが、先日Vercelというサービス名に変更されました。その前からちょこちょこ新たな機能をリリースしており、nowというコマンドを使わなくてもGitHub連携によってpushするだけでデプロイできるようになったり、環境変数も独自のsecretsという設定を使わず、管理画面で設定できるようになったりと、かなり手軽になってきているので実際にそれらを使ったデプロイ方法を説明します。</p> <h2 id="Nuxt.jsアプリを作成"><a href="#Nuxt.js%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92%E4%BD%9C%E6%88%90">Nuxt.jsアプリを作成</a></h2> <p>まずはNuxt.jsのアプリケーションを作成します。</p> <pre><code>npx create-nuxt-app nuxt-vercel-sample # or yarn create nuxt-app nuxt-vercel-sample </code></pre> <p>いくつか設定項目が現れるため下記のように設定しました。適当です。</p> <pre><code class="text">✨ Generating Nuxt.js project in nuxt-vercel-sample ? Project name nuxt-vercel-sample ? Project description My astonishing Nuxt.js project ? Author name dala00 ? Choose programming language TypeScript ? Choose the package manager Yarn ? Choose UI framework Buefy ? Choose custom server framework None (Recommended) ? Choose the runtime for TypeScript Default ? Choose Nuxt.js modules Axios, Progressive Web App (PWA) Support, DotEnv ? Choose linting tools (Press <space> to select, <a> to toggle all, <i> to invert selection) ? Choose test framework Jest ? Choose rendering mode Universal (SSR) ? Choose development tools (Press <space> to select, <a> to toggle all, <i> to invert selection) </code></pre> <p>あとは出力されるメッセージの通り、下記のようにして実行できます。</p> <pre><code>cd nuxt-vercel-sample yarn dev </code></pre> <p>見た目は利用しているUIフレームワークによって変わります。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ea6e12b13314.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ea6e12b13314.png?mw=700" alt="" /></a></p> <h2 id="GitHubへ登録"><a href="#GitHub%E3%81%B8%E7%99%BB%E9%8C%B2">GitHubへ登録</a></h2> <p>今回はnowコマンドは一切使わずGitHub連携でデプロイを行います。ですのでまずはいま作成したアプリケーションをGitHubに登録します。その前にとりあえずcommitしておきます。<code>git init</code>だけは勝手にやってくれています。</p> <pre><code>git add . git commit -m "Initial commit" </code></pre> <p>VSCode等でやってもよいでしょう。</p> <p>まずは適当にGitHubでリポジトリを作成します。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ea6e189f259c.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ea6e189f259c.png?mw=700" alt="" /></a></p> <p>表示されているとおりに設定してpushします(SSHキーの登録などは事前に行っておいてください)。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ea6e1ac15622.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ea6e1ac15622.png?mw=700" alt="" /></a></p> <h2 id="Vercelにデプロイする"><a href="#Vercel%E3%81%AB%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%81%99%E3%82%8B">Vercelにデプロイする</a></h2> <p>続いてVercel側に今pushしたものをデプロイします。……がその前に、Nuxt.jsをVercelで使うための <code>@nuxtjs/now-builder</code> というものがNuxt.js公式から用意されていますので、それをnow.jsonに設定します。</p> <pre><code class="json">{ "version": 2, "builds": [ { "src": "nuxt.config.js", "use": "@nuxtjs/now-builder", "config": {} } ] } </code></pre> <p>これをcommit & pushしておきましょう。</p> <p>続いてVercelのダッシュボードにImport Projectボタンがあるためそちらをクリックします。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ea459d4063ee.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ea459d4063ee.png?mw=700" alt="" /></a></p> <p>From Git Repositoryを選択します。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ea459fd1c53f.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ea459fd1c53f.png?mw=700" alt="" /></a></p> <p>Importボタンをクリックします。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ea45a3fb370b.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ea45a3fb370b.png?mw=700" alt="" /></a></p> <p>プロジェクトの選択画面が開きますので適宜選択します。僕の場合は個別に権限を与えたものだけ選択できるようにしているため、同様の場合は下記のようにEdit your repository access settings on GitHub.を実行してGitHub側で権限を与えてから選択します。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ea45abb2e10f.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ea45abb2e10f.png?mw=700" alt="" /></a></p> <p>選択できたらSelectしてImportを実行です。プロジェクト名の入力画面が開くので入力してContinueします。</p> <p>引き続きROOT DIRECTORYやBUILD COMMANDの設定画面なども開きますが、Nuxt.jsアプリケーションの場合は一切何も設定しなくてもデプロイが可能のためひたすらContinueして最後のDeployボタンを押せば完了です(さきほどのnow.jsonの設定が抜けているとビルドに失敗します)。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ea6e54ca8f75.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ea6e54ca8f75.png?mw=700" alt="" /></a></p> <p>Buildingステータスになっているのでしばし待ちます。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ea45bdf2d264.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ea45bdf2d264.png?mw=700" alt="" /></a></p> <p>Readyとなったらデプロイ完了です。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ea6e59b5216c.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ea6e59b5216c.png?mw=700" alt="" /></a></p> <p>URLがいくつかありますが、どれでも閲覧できます。DEPLOYMENTというURLは一意なデプロイURLです。DOMAINSはそのプロジェクトのURLで、いつも使えるURLです。どれでも良いので開くとローカルで実行したアプリケーションと同じ画面が表示されます。これでデプロイは完了です!</p> <p>ちなみに下記は今回作ったサンプルです。</p> <p><a target="_blank" rel="nofollow noopener" href="https://nuxt-vercel-sample.now.sh/">https://nuxt-vercel-sample.now.sh/</a><br /> <a target="_blank" rel="nofollow noopener" href="https://github.com/dala00/nuxt-vercel-sample">https://github.com/dala00/nuxt-vercel-sample</a></p> <h2 id="更新したい時"><a href="#%E6%9B%B4%E6%96%B0%E3%81%97%E3%81%9F%E3%81%84%E6%99%82">更新したい時</a></h2> <p>プログラムを調整して更新したいときは、GitHubにpushするだけで勝手にデプロイされます。</p> <p>ちなみに先ほどの画面はProduction Deploymentで、masterブランチのものがProductionとしてデプロイされます。別のブランチを作ってそちらでpushしておくと、その製品版のURLは利用されず、別ブランチ用のURLが作成されるため安全にステージング環境として利用することが可能です。下記のようにDeploymentsメニューで全てのブランチのデプロイを確認できます。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ea6e68aa6335.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ea6e68aa6335.png?mw=700" alt="" /></a></p> <p>それをクリックすると下記のようにテスト用のURLを利用することが出来ます。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ea6e6e256a15.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ea6e6e256a15.png?mw=700" alt="" /></a></p> <p>プルリクエストを作るとブランチのマージもGitHub上だけで行えます。</p> <p>ちなみにGitHub連携しているとこんな感じでnowちゃんが甲斐甲斐しくコメントをしてくれます(そういやこちらはまだ名前が変わってないですね)。これで一人ぼっちで友達がいなくても寂しくありません。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ea6e70fa5c7a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ea6e70fa5c7a.png?mw=700" alt="" /></a></p> <h2 id="環境変数を設定する"><a href="#%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B">環境変数を設定する</a></h2> <p>Nowではずっとsecretsという機能を利用してプライベートな値を利用できるようにしていましたが、最近Vercelになったのと同じくらいの時期に管理画面で直接環境変数を設定できるようになりました。下記のように設定ができます。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ea594c111ec1.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ea594c111ec1.png?mw=700" alt="" /></a></p> <p>ちなみにProductionは本番、つまり独自ドメインを設定していればそちらのURLや、<code>プロジェクト名.now.sh</code> というシンプルなエイリアスのものなどです。Previewは別のブランチでpushした時に作成されるURLです。DevelopmentはローカルPCにて、<code>now dev</code>を実行した時のものです。</p> <p>設定後は見えなくなります。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ea594dc71d71.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ea594dc71d71.png?mw=700" alt="" /></a></p> <p>Nuxt.js上では、nuxt.config.jsにて例えば下記のように設定します。ローカルでの環境変数は直接指定するか、dotenv等を利用しましょう。</p> <pre><code class="javascript">// require('dotenv').config() export default { mode: "universal", env: { TEST_TEXT: process.env.TEST_TEXT }, </code></pre> <p>index.vueにてscript側に値を取得処理を作成し、</p> <pre><code class="javascript"> methods: { getText() { return process.env.TEST_TEXT } } </code></pre> <p>表示側でそれを使います。</p> <pre><code class="html"> <span>{</span><span>{</span> getText() <span>}</span><span>}</span> </code></pre> <p>問題なければ下記のように表示されます。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ea6e9d8ecc0e.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ea6e9d8ecc0e.png?mw=700" alt="" /></a></p> <h2 id="nowコマンドは?"><a href="#now%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%AF%EF%BC%9F">nowコマンドは?</a></h2> <p>こちらも使えます。今回のパターンだと不要でしたが、 複数のbuildersを使う場合などはローカルで <code>now dev</code> コマンドで開発ができます。この場合は事前に <code>now</code> コマンドを実行してVercel側のプロジェクトと紐付けておく必要があります。</p> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <p>ということで2020年に入り、Vercelは進化を遂げ続けており非常に使いやすくなりました。GitHubや自動デプロイに慣れている方はGitHub連携で、GitHubを使ったことがなくてちょっと怖い、という方は今まで通りnowコマンドを使って、柔軟に利用できます。非常に便利ですので使い倒していきましょう。</p> だら@Crieit開発者 tag:crieit.net,2005:PublicArticle/15871 2020-04-27T08:55:36+09:00 2020-04-27T08:55:36+09:00 https://crieit.net/posts/Vercel-Zeit-Now-Next-js-2020 Vercel(元ZeitのNow)でNext.jsアプリをデプロイ 2020年最新版 <p><code>now</code> というコマンドを使わないVercel(元ZeitのNow)へのデプロイ方法を解説します。今回の手順ではNext.jsを使います。</p> <h2 id="背景"><a href="#%E8%83%8C%E6%99%AF">背景</a></h2> <p><code>now</code> というコマンドで簡単にデプロイできるということで一世を風靡したZeitのNowですが、先日Vercelというサービス名に変更されました。その前からちょこちょこ新たな機能をリリースしており、nowというコマンドを使わなくてもGitHub連携によってpushするだけでデプロイできるようになったり、環境変数も独自のsecretsという設定を使わず、管理画面で設定できるようになったりと、かなり手軽になってきているので実際にそれらを使ったデプロイ方法を説明します。</p> <h2 id="Next.jsアプリを作成"><a href="#Next.js%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92%E4%BD%9C%E6%88%90">Next.jsアプリを作成</a></h2> <p>まずはNext.jsのアプリケーションを作成します。</p> <pre><code>npm init next-app # or yarn create next-app </code></pre> <p>いくつか設定項目が現れるため下記のように設定しました。</p> <pre><code class="text">√ What is your project named? ... next-vercel-sample √ Pick a template » Default starter app </code></pre> <p>あとは出力されるメッセージの通り、下記のようにして実行できます。</p> <pre><code>cd next-vercel-sample yarn dev </code></pre> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ea457cd94de6.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ea457cd94de6.png?mw=700" alt="" /></a></p> <h2 id="GitHubへ登録"><a href="#GitHub%E3%81%B8%E7%99%BB%E9%8C%B2">GitHubへ登録</a></h2> <p>今回はnowコマンドは一切使わずGitHub連携でデプロイを行います。ですのでまずはいま作成したアプリケーションをGitHubに登録します。その前にとりあえずcommitしておきます。</p> <pre><code>git init git add . git commit -m "Initial commit" </code></pre> <p>addとcommitはVSCode等でやってもよいでしょう。</p> <p>まずは適当にGitHubでリポジトリを作成します。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ea458e4a52d5.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ea458e4a52d5.png?mw=700" alt="" /></a></p> <p>表示されているとおりに設定してpushします(SSHキーの登録などは事前に行っておいてください)。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ea4591709f04.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ea4591709f04.png?mw=700" alt="image.png" /></a></p> <h2 id="Vercelにデプロイする"><a href="#Vercel%E3%81%AB%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%81%99%E3%82%8B">Vercelにデプロイする</a></h2> <p>続いてVercel側に今pushしたものをデプロイします。VercelのダッシュボードにImport Projectボタンがあるためそちらをクリックします。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ea459d4063ee.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ea459d4063ee.png?mw=700" alt="" /></a></p> <p>From Git Repositoryを選択します。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ea459fd1c53f.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ea459fd1c53f.png?mw=700" alt="" /></a></p> <p>Importボタンをクリックします。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ea45a3fb370b.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ea45a3fb370b.png?mw=700" alt="" /></a></p> <p>プロジェクトの選択画面が開きますので適宜選択します。僕の場合は個別に権限を与えたものだけ選択できるようにしているため、同様の場合は下記のようにEdit your repository access settings on GitHub.を実行してGitHub側で権限を与えてから選択します。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ea45abb2e10f.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ea45abb2e10f.png?mw=700" alt="" /></a></p> <p>選択できたらSelectしてImportを実行です。プロジェクト名の入力画面が開くので入力してContinueします。</p> <p>引き続きROOT DIRECTORYやBUILD COMMANDの設定画面なども開きますが、Next.jsアプリケーションの場合は一切何も設定しなくてもデプロイが可能のためひたすらContinueして最後のDeployボタンを押せば完了です。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ea45ba06d7ee.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ea45ba06d7ee.png?mw=700" alt="" /></a></p> <p>Buildingステータスになっているのでしばし待ちます。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ea45bdf2d264.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ea45bdf2d264.png?mw=700" alt="" /></a></p> <p>Readyとなったらデプロイ完了です。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ea45bfc2da35.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ea45bfc2da35.png?mw=700" alt="" /></a></p> <p>URLがいくつかありますが、どれでも閲覧できます。DEPLOYMENTというURLは一意なデプロイURLです。DOMAINSはそのプロジェクトのURLで、いつも使えるURLです。どれでも良いので開くとローカルで実行したアプリケーションと同じ画面が表示されます。これでデプロイは完了です!</p> <p>ちなみに下記は今回作ったサンプルです。</p> <p><a target="_blank" rel="nofollow noopener" href="https://next-vercel-sample.now.sh/">https://next-vercel-sample.now.sh/</a><br /> <a target="_blank" rel="nofollow noopener" href="https://github.com/dala00/next-vercel-sample">https://github.com/dala00/next-vercel-sample</a></p> <h2 id="更新したい時"><a href="#%E6%9B%B4%E6%96%B0%E3%81%97%E3%81%9F%E3%81%84%E6%99%82">更新したい時</a></h2> <p>プログラムを調整して更新したいときは、GitHubにpushするだけで勝手にデプロイされます。</p> <p>ちなみに先ほどの画面はProduction Deploymentで、masterブランチのものがProductionとしてデプロイされます。別のブランチを作ってそちらでpushしておくと、その製品版のURLは利用されず、別ブランチ用のURLが作成されるため安全にステージング環境として利用することが可能です。下記のようにDeploymentsメニューで全てのブランチのデプロイを確認できます。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ea45dd338c3e.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ea45dd338c3e.png?mw=700" alt="" /></a></p> <p>それをクリックすると下記のようにテスト用のURLを利用することが出来ます。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ea45e23b9385.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ea45e23b9385.png?mw=700" alt="" /></a></p> <p>プルリクエストを作るとブランチのマージもGitHub上だけで行えます。</p> <p>ちなみにGitHub連携しているとこんな感じでnowちゃんが甲斐甲斐しくコメントをしてくれます(そういやこちらはまだ名前が変わってないですね)。これで一人ぼっちで友達がいなくても寂しくありません。</p> <h2 id="環境変数を設定する"><a href="#%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B">環境変数を設定する</a></h2> <p>Nowではずっとsecretsという機能を利用してプライベートな値を利用できるようにしていましたが、最近Vercelになったのと同じくらいの時期に管理画面で直接環境変数を設定できるようになりました。下記のように設定ができます。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ea594c111ec1.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ea594c111ec1.png?mw=700" alt="" /></a></p> <p>ちなみにProductionは本番、つまり独自ドメインを設定していればそちらのURLや、<code>プロジェクト名.now.sh</code> というシンプルなエイリアスのものなどです。Previewは別のブランチでpushした時に作成されるURLです。DevelopmentはローカルPCにて、<code>now dev</code>を実行した時のものです。</p> <p>設定後は見えなくなります。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ea594dc71d71.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ea594dc71d71.png?mw=700" alt="" /></a></p> <p>Next.js上では、next.config.jsにて例えば下記のように設定します。ローカルでの環境変数は直接指定するか、dotenv等を利用しましょう。envはサーバー側(というかビルド時)、publicRuntimeConfigでクライアント側に環境変数を渡せます(漏洩してはいけない値を渡さないようにしましょう)。</p> <pre><code class="javascript">// require('dotenv').config() module.exports = { env: { TEST_TEXT: process.env.TEST_TEXT, }, publicRuntimeConfig: { TEST_TEXT: process.env.TEST_TEXT, }, } </code></pre> <p>index.jsを下記のように調整することで利用できます。</p> <pre><code class="jsx">import getConfig from 'next/config' const { publicRuntimeConfig } = getConfig() export default function Home() { return ( <div className="container"> <Head> <title>Create Next App</title> <link rel="icon" href="/favicon.ico" /> </Head> <main> <h1 className="title"> Welcome to{' '} <a href="https://nextjs.org"> Next.js! {publicRuntimeConfig.TEST_TEXT} </a> </h1> </code></pre> <p>問題なければ下記のように表示されます。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ea596b34af76.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5ea596b34af76.png?mw=700" alt="" /></a></p> <h2 id="nowコマンドは?"><a href="#now%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%AF%EF%BC%9F">nowコマンドは?</a></h2> <p>こちらも使えます。今回のパターンだと不要でしたが、 <code>@now/next</code> というbuilders以外を使う場合はローカルで <code>now dev</code> コマンドで開発ができます。この場合は事前に <code>now</code> コマンドを実行してVercel側のプロジェクトと紐付けておく必要があります。</p> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <p>ということで2020年に入り、Vercelは進化を遂げ続けており非常に使いやすくなりました。GitHubや自動デプロイに慣れている方はGitHub連携で、GitHubを使ったことがなくてちょっと怖い、という方は今まで通りnowコマンドを使って、柔軟に利用できます。非常に便利ですので使い倒していきましょう。</p> だら@Crieit開発者 tag:crieit.net,2005:PublicArticle/15865 2020-04-24T12:00:32+09:00 2020-10-11T00:03:51+09:00 https://crieit.net/posts/Vercel-Zeit-Now-Next-js-node-canvas-OGP Vercel(元ZeitのNow)にてNext.jsでnode-canvasを使ってOGP <p>追記 2020/10)<br /> 2020年7月頃から?、Vercelが改善されて簡単にOGPが作れるようになりました。<br /> <a href="https://crieit.net/posts/Vercel-API-Routes-OGP-2020">VercelのAPI RoutesでOGPを作成する 2020年版</a><br /> 追記終わり</p> <p>Next.jsアプリケーションをVercel(元ZeitのNow)で利用してOGPを生成しようと思ったが無理で、それでもなんとか成功させたある男の記録(2020/4、Next.js9.3現在)。</p> <h2 id="VercelでNext.js"><a href="#Vercel%E3%81%A7Next.js">VercelでNext.js</a></h2> <p>そもそもNext.jsはVercelの人が作っている。そのため多分かなり親和性が高い。GitHub連携して適当にpushすればすぐなんの設定もなくすぐデプロイできる。ということでまずは何も考えずガリガリアプリケーションを作成していた。</p> <h2 id="何がうまくいかなかったのか"><a href="#%E4%BD%95%E3%81%8C%E3%81%86%E3%81%BE%E3%81%8F%E3%81%84%E3%81%8B%E3%81%AA%E3%81%8B%E3%81%A3%E3%81%9F%E3%81%AE%E3%81%8B">何がうまくいかなかったのか</a></h2> <p>まず作っていたもの。それは普通のNext.jsアプリケーション。それにOGPもつけようと思っていた。調べてみるとNext.jsには <a target="_blank" rel="nofollow noopener" href="https://nextjs.org/docs/api-routes/introduction">API Routes</a> という機能があり、別途サーバー用の機能を準備しなくてもちょっとしたAPIならpages/apiの下に通常のページと同じ配置でメソッドを追加すればサーバーサイドの処理も書けてしまう。</p> <p>これでOPGも可能そうだと思い、事前にnode-canvasを使って試していたところうまくいっていた。前も別のところで同じことをやっていたのだが、基本的にこういうデプロイ先はフォントが無いことがあるため、node-canvasにあるregisterFontという機能を使って直接ttfのようなフォントファイルを読み込むことで文字も描画できるようにしている。</p> <p>しかし、これがうまくいかなかった。なんかregisterFontあたりエラーが出る。調べてみたところこんなissueをみつけた。</p> <p><a target="_blank" rel="nofollow noopener" href="https://github.com/zeit/next.js/issues/8251">Next.js API routes (and pages) should support reading files · Issue #8251 · zeit/next.js</a></p> <p>そう、なんか <code>__dirname</code> もちゃんと機能していないし、<code>fs.readFileSync</code> もまともに動かない……。</p> <p>ということで、フォントの読み込みができなかった。</p> <h2 id="なぜファイルを読み込めないのか"><a href="#%E3%81%AA%E3%81%9C%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%82%81%E3%81%AA%E3%81%84%E3%81%AE%E3%81%8B">なぜファイルを読み込めないのか</a></h2> <p>なぜかはよくわからないが、とにかくVercelは内部的にはAWSのLambdaを使っており、その関係でデプロイする時に関係ないファイルを無視していたり、フォルダ構成も全く違う感じになってたり、色んな要因でうまくいかないのではないかと思われる。詳しくはわからない。が、上記issueやこのPR <a target="_blank" rel="nofollow noopener" href="https://github.com/zeit/next.js/pull/8334">Fix for __dirname by huv1k · Pull Request #8334 · zeit/next.js</a> を見る限り、なかなか改善できていないようなので多分構成的にそんな簡単ではないのではないかと思われる。</p> <p>ということで、そのうち改善されるのかもしれないが、とにかく今や今後すぐに改善されるとは思わないほうが良いっぽく、無理なら無理でどうするかを考える必要がありそうだった。</p> <h2 id="解決の手がかり"><a href="#%E8%A7%A3%E6%B1%BA%E3%81%AE%E6%89%8B%E3%81%8C%E3%81%8B%E3%82%8A">解決の手がかり</a></h2> <p>実はこのissueの中に、下記のようなコメントがあった。結果としてはこれが解決方法。</p> <p><a target="_blank" rel="nofollow noopener" href="https://github.com/zeit/next.js/issues/8251#issuecomment-614220305">https://github.com/zeit/next.js/issues/8251#issuecomment-614220305</a></p> <p>具体的には <code>@now/next</code> と <code>@now/node</code> のbuildersを併用するというもの。</p> <h3 id="buildersとは"><a href="#builders%E3%81%A8%E3%81%AF">buildersとは</a></h3> <p>Vercelにはbuildersという概念があり、これによりどの様にアプリケーションをデプロイするかを決めることができる。 @now/next はNext.jsをデプロイする時に自動的に選択される、Next.js用のbuilders。 @now/nodeはそれ以外のNode.jsアプリケーション。</p> <h3 id="なぜ併用するのか"><a href="#%E3%81%AA%E3%81%9C%E4%BD%B5%E7%94%A8%E3%81%99%E3%82%8B%E3%81%AE%E3%81%8B">なぜ併用するのか</a></h3> <p>ではなぜ併用する必要があるのかと言うと、先程のissueにも書かれているのだが、実はincludeFilesという設定があり、これを利用すると指定したファイルをデプロイ時に無視しないようにし、正常にデプロイ先で読み込むことができるようになる。</p> <p>ところが、これが現在 @now/next では利用できない。そのため、 @now/node を併用して利用することでOPGの生成のようにファイルを読み込む日強グアある処理だけはそちらで稼働させようという考え。</p> <h2 id="実際に解決した方法"><a href="#%E5%AE%9F%E9%9A%9B%E3%81%AB%E8%A7%A3%E6%B1%BA%E3%81%97%E3%81%9F%E6%96%B9%E6%B3%95">実際に解決した方法</a></h2> <p>まず、<code>pages/api</code>にあった処理を <code>functions/index.ts</code> に移した。Next.js側では使えないため、API Routesも使えない。そのため Next.jsの外に出して別で稼働させる。apiというフォルダに入れれば @now/node で <code>/api/~~</code> というURLで実行できるのだが、これはNext.jsのAPI Routesと被ってしまうので今回はとりあえず <code>/functions/~~</code> というURLでアクセスできるようにした。具体的なnow.jsonの設定は下記の通り(最近はGitHub経由でデプロイできるし、独自ドメインや環境変数も管理画面で設定できるのでそもそもnow.json自体なく、今回追加したこれで全部)。</p> <pre><code>{ "builds": [ { "src": "next.config.js", "use": "@now/next" }, { "src": "functions/index.ts", "use": "@now/node", "config": { "includeFiles": ["fonts/*"] } } ], "routes": [ { "src": "/functions/(.+)", "dest": "/functions/index.ts" } ] } </code></pre> <p>これでfontsというフォントを入れたフォルダを維持したまま、functionsで始まるURLで @now/node ビルドのサーバーサイド処理にアクセスすることができる。</p> <p>で、色々端折るけどfunctions/index.tsはこんな感じ。</p> <pre><code class="typescript">import * as path from 'path' const { createCanvas, registerFont } = require('canvas') import { NowRequest, NowResponse } from '@now/node' export default function (req: NowRequest, res: NowResponse) { registerFont(path.join('fonts', 'myfont.ttf'), { family: 'myfont', }) const canvas = createCanvas(600, 315) const context = canvas.getContext('2d') context.font = '15px myfont' context.fillStyle = '#424242' context.fillText('hello', 100, 100) const image = canvas.toBuffer() res.writeHead(200, { 'Content-Type': 'image/png', 'Content-Length': image.length, }) res.end(image, 'binary') } </code></pre> <p>ちなみに、あくまでも @now/next と @now/node は別環境のため、フォントをアップできたからといってNext.js側でそれを利用することは出来ない。今回はOGPだったためURLだけで連携できるのでOKだった。</p> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <p>このように、一時期は別サーバーで対応が必要かとも考えたが、なんとかVercelだけで全てを完結させることができたので本当に良かった。Vercel最高。だけどはやくファイルの読み込み関連はいい感じに使えるように改善して欲しいものだ。</p> <p>ちなみに実際に作ったのはこれ(石を進めたときだけOGPが出る)</p> <p><a target="_blank" rel="nofollow noopener" href="https://reversi-game-record.appllis.net/">リバーシ棋譜ツール</a></p> だら@Crieit開発者 tag:crieit.net,2005:PublicArticle/15861 2020-04-22T09:09:44+09:00 2020-10-13T11:10:01+09:00 https://crieit.net/posts/Vercel-Zeit-Now-Next-js-API-Routes-node-canvas Vercel(元ZeitのNow)にてNext.jsのAPI Routesでnode-canvasを使う <p>Next.jsにはAPI Routesという機能があり、<code>pages/api</code> 配下に通常のページと同じように配置してサーバーサイドの処理を書くことができる。アクセスは <code>/api/パス</code> のような感じ。</p> <pre><code class="javascript">export default (req, res) => { res.statusCode = 200 res.setHeader('Content-Type', 'application/json') res.end(JSON.stringify({ name: 'John Doe' })) } </code></pre> <p><a target="_blank" rel="nofollow noopener" href="https://nextjs.org/docs/api-routes/introduction">https://nextjs.org/docs/api-routes/introduction</a></p> <p>この機能を使ってOGPを実装し、いざVercelにデプロイしてみるとなぜか動かない。ローカルではうまくいったのに。下記のようなエラーが出る。</p> <pre><code class="text">Error: libuuid.so.1: cannot open shared object file: No such file or directory </code></pre> <p>GitHubにも同じ現象についてのissueがあり、解決法を書いている人もいた。</p> <p><a target="_blank" rel="nofollow noopener" href="https://github.com/zeit/now/issues/3460#issuecomment-574712112">https://github.com/zeit/now/issues/3460#issuecomment-574712112</a></p> <p>ちょっと分かりづらいのでもうちょっと詳しく解説。</p> <pre><code class="sh">wget https://github.com/jwerre/node-canvas-lambda/raw/master/node12_canvas_lib64_layer.zip unzip -j -d canvas_lib64 node12_canvas_lib64_layer.zip </code></pre> <p>上記はローカルで実行する。そして出来上がったcanvas_lib64フォルダをコミットしてしまう(now-buildコマンドに混ぜてみたがwgetが無いとどやされた)。</p> <p>ちなみに上記のzipファイルの配置が時々変わるようなので、その場合は該当のリポジトリを確認。</p> <pre><code class="json">{ "scripts": { "now-build": "cp canvas_lib64/*so.1 node_modules/canvas/build/Release/" } } </code></pre> <p>上記は自分のpackage.jsonのscriptsの中にこのnow-buildコマンドを追加するという意味。ただ、これだとうまくいかなかったため下記にした。多分コピーだけになってしまってビルドされなくなってしまったのではないかと思う。</p> <pre><code class="sh">cp canvas_lib64/*so.1 node_modules/canvas/build/Release/ && yarn build </code></pre> <p>これで動いた。</p> <p>ただし、VercelにてNext.jsのAPI Routesでは、なんと他のファイルを読み込むことが出来ない。フォントも画像も。そのためこのままだとひたすら描画して作るしかない。</p> <p>対処法は <code>@now/next</code> と <code>@now/node</code> のbuildersを併用するのだが詳しくは後日別の記事にて。</p> <p>↓後日の別の記事<br /> <a href="https://crieit.net/posts/Vercel-Zeit-Now-Next-js-node-canvas-OGP">Vercel(元ZeitのNow)にてNext.jsでnode-canvasを使ってOGP</a></p> だら@Crieit開発者 tag:crieit.net,2005:PublicArticle/15824 2020-04-13T08:27:03+09:00 2020-04-13T08:27:03+09:00 https://crieit.net/posts/Now Nowで運用している画像配信サーバーにリサイズ機能を追加した <p>Cloud Runに引っ越したことで重いページとそうでないページがはっきりしてきた(以前は全てのページが重くて逆に気にならなかった)のだが、その際にLighthouseで調べているとPerformanceのスコアが非常に悪く、画像の読み込みにめちゃくちゃ時間がかかっていることに気づいた。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5e93131e63cf8.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5e93131e63cf8.png?mw=700" alt="" /></a></p> <p>トップページの記事ランキングなどにはサムネイルを表示していたりするのだが、アップロードされた画像をそのまま表示していた。中には横幅2000とか3000以上の画像もあったりする。そのためそういう画像がいくつも同じページ内にあると当然読み込みに時間がかかるし、Wifiじゃない状況でスマホで見たりすると通信容量の消費も激しくなるだろうし全然ユーザーフレンドリーじゃない。</p> <p>ということで丁度モチベーション切れだったこともあり、せっかく気になってきたので対応してみることにした。</p> <h2 id="画像配信サーバーの改造"><a href="#%E7%94%BB%E5%83%8F%E9%85%8D%E4%BF%A1%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%AE%E6%94%B9%E9%80%A0">画像配信サーバーの改造</a></h2> <p>アップロードされた画像は全てZeitのNowで運用している画像配信サーバーで配信している。</p> <p><a href="https://crieit.net/posts/Now-Cloud-Storage">NowのエッジキャッシュでCloud Storage節約サーバー作成</a></p> <p>ということで、これを改造してリサイズに対応できればよいのではないかと思った。具体的には通常の画像のURLの後ろに <code>?mw=700&mh=300</code> のように、パラメータを指定した場合だけリサイズするようにする形。</p> <h3 id="リサイズに使用したパッケージ"><a href="#%E3%83%AA%E3%82%B5%E3%82%A4%E3%82%BA%E3%81%AB%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%9F%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8">リサイズに使用したパッケージ</a></h3> <p>リサイズと言えばImageMagick(現在はgm?)かなと思ったが、一応調べてみたところsharpというパッケージも非常に人気があるらしかったのでそちらを使ってみることにした。</p> <p><a target="_blank" rel="nofollow noopener" href="https://github.com/lovell/sharp">lovell/sharp: High performance Node.js image processing, the fastest module to resize JPEG, PNG, WebP and TIFF images. Uses the libvips library.</a></p> <p>一番シンプルな形だとこんな感じでいける。BufferをリサイズしてBufferにするパターン。</p> <pre><code class="javascript">const resized = await sharp(image).resize(width).toBuffer() </code></pre> <p>めちゃくちゃ簡単。ImageMagickだとサーバーに何かインストールしておかなきゃいけないんじゃないかとか色々気になったりするが、特にそういう必要もない。</p> <h3 id="実際の実装方法"><a href="#%E5%AE%9F%E9%9A%9B%E3%81%AE%E5%AE%9F%E8%A3%85%E6%96%B9%E6%B3%95">実際の実装方法</a></h3> <h4 id="縦横を指定する場合"><a href="#%E7%B8%A6%E6%A8%AA%E3%82%92%E6%8C%87%E5%AE%9A%E3%81%99%E3%82%8B%E5%A0%B4%E5%90%88">縦横を指定する場合</a></h4> <p>CSSの <code>object-fit: cover</code> を使っているところが結構あったので、その部分の表示を変えることなくリサイズする仕組みを作った。具体的には <code>?mw=700&mh=300</code> のパラメータを付けると、どちらかがはみ出してもいいのでその範囲でなるべく大きな画像にする方法(余白ができないようにする)</p> <p>色々処理を作っていたが、これはパラメータを指定するだけでできた。</p> <pre><code class="javascript"> if (query.mw && query.mh) { image = await sharp(image) .resize(Number(query.mw), Number(query.mh), { fit: 'outside' }) .toBuffer() } </code></pre> <p>こんな感じでfitを指定すると色々な形でのリサイズ方法があるため便利。</p> <h4 id="横幅だけを指定する場合"><a href="#%E6%A8%AA%E5%B9%85%E3%81%A0%E3%81%91%E3%82%92%E6%8C%87%E5%AE%9A%E3%81%99%E3%82%8B%E5%A0%B4%E5%90%88">横幅だけを指定する場合</a></h4> <p>記事ページなどは許可する最大の横幅を指定し、それ以上だったらリサイズする形にした。</p> <p>さすがにfitでこの条件指定までは出来なかったため、チェックは自分で行った。さすがに画像を変換する時にサイズの取得は必要になるため、多分サイズを取得する機能があるだろうと思ったがやはりあった。ということで下記のような処理を作った。metadataというメソッドでサイズや画像の形式など、色々な情報が取れる。</p> <pre><code class="javascript">async function resizeByMaxWidth(image, maxWidth) { const sharpImage = sharp(image) const metadata = await sharpImage.metadata() if (metadata.width < maxWidth) { return image } return await sharpImage.resize(maxWidth).toBuffer() } </code></pre> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <p>ということで色々対応したが、スコアは全然改善しなかった。他にもAPIで取ってきたデータのユーザー画像のサイズが大きかったりして、対応しきれていない部分がある。</p> <p>とはいえ、やろうと思えばあらゆるURLの画像を同様の配信サーバーを作ってプロキシすることで縮小できるため、他にも色々使い所はありそう(今回は自分用のリポジトリに実装しているので前述URL内で公開しているリポジトリには反映していない。機能的にもブレるため)。Nowなのでサーバーの管理も不要だしCDNキャッシュしてくれて高速だし本当に楽。</p> だら@Crieit開発者 tag:crieit.net,2005:PublicArticle/15819 2020-04-11T22:30:34+09:00 2020-04-12T00:28:29+09:00 https://crieit.net/posts/Now-CLI-GitHub Now CLIを使わずGitHub連携だけでデプロイ <p>いつからかは知らないが、ZeitのNowにGitHub連携がついていた。元々 <code>now</code> というコマンドで簡単にデプロイできてすごい、ということで有名になった記憶があるが、もうそれすらも要らなくなった。</p> <p>ログイン後、ダッシュボードの右上に Import Project というボタンがあるので、それを押せばGitHub連携ができる画面がある。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5e91c509ed2ef.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5e91c509ed2ef.png?mw=700" alt="" /></a></p> <p>あとはもうpushするだけでデプロイできる。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5e91c540e9239.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5e91c540e9239.png?mw=700" alt="" /></a></p> <p>しかもプロジェクトのトップページにも書かれているが、 <code>To deploy to production, push to the default branch.</code> ということでmasterにpushすれば production ビルドになる。これは試していないので恐らくだが、エイリアスを設定していたり独自ドメインを設定していたりすると自動的にそこにデプロイされるんじゃないかと思われる(ちらっとためしたがプルリクエストをマージしたらそのブランチのデプロイに指定したエイリアスや独自ドメインのエイリアスが移動するっぽい)。</p> <p>そして上記の画像にもあるように、別ブランチにpushすればそれもテスト環境として利用することができるようになっているのですごく便利になっているっぽい。</p> <p>本番<br /> <a target="_blank" rel="nofollow noopener" href="https://sharp-test-zeta.now.sh">https://sharp-test-zeta.now.sh</a></p> <p>別ブランチ<br /> <a target="_blank" rel="nofollow noopener" href="https://sharp-test-6hin77k34.now.sh">https://sharp-test-6hin77k34.now.sh</a></p> <p>ちなみに試したリポジトリ。勝手にURLも設定されている。<br /> <a target="_blank" rel="nofollow noopener" href="https://github.com/dala00/sharp-test">https://github.com/dala00/sharp-test</a></p> <p>しばらく見ないうちに進化していてとても良い。</p> <p>ということで、Now CLIを使わずにデプロイまでできるようになった。もちろん secrets を設定したりする場合は必要になってくると思うが、何にしろだいぶ簡単に利用できる様になってきたのではないかと思う。正直コマンドでデプロイしたりエイリアスを設定したりするのは時間が経つとやり方を忘れてしまったり、今もこの方法で大丈夫なのかと不安になってしまうのでpushだけでできるようになったのは非常にありがたい。</p> だら@Crieit開発者 tag:crieit.net,2005:PublicArticle/15394 2019-09-13T18:30:51+09:00 2019-09-13T18:30:51+09:00 https://crieit.net/posts/NOW-Google-API-GitHub NOWでデプロイできるGoogleフォームみたいに追記できるAPIを作ったので、GitHubに公開してみた <p><a target="_blank" rel="nofollow noopener" href="https://developers.google.com/sheets/api/">Spread Sheet API</a>を見てたら、Googleフォームみたいに空いている行に追記できるらしい...<br /> 便利そうなので、汎用的に使えるようにNOW APIとしてデプロイできるようにしてみた&GitHubにも公開してみた。</p> <h3 id="作ったもの"><a href="#%E4%BD%9C%E3%81%A3%E3%81%9F%E3%82%82%E3%81%AE">作ったもの</a></h3> <p>GitHub: <a target="_blank" rel="nofollow noopener" href="https://github.com/memory-lovers/append-row-api_zeit-now">Append Row API using ZEINT NOW and Spread Sheet API</a></p> <p>こんな感じで、API叩くとスプレッドシートに追記できる。<br /> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/b3e01a00-c186-30fa-92ca-a2450240c40f.gif" width="600" /></p> <h3 id="使い方: デプロイする"><a href="#%E4%BD%BF%E3%81%84%E6%96%B9%3A+%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%81%99%E3%82%8B">使い方: デプロイする</a></h3> <h4 id="1. git clone"><a href="#1.+git+clone">1. git clone</a></h4> <p>まずはgit clone</p> <pre><code class="console">$ git clone https://github.com/memory-lovers/append-row-api_zeit-now.git </code></pre> <h4 id="2. サービスアカウントのキーファイルの配置"><a href="#2.+%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%81%AE%E3%82%AD%E3%83%BC%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E9%85%8D%E7%BD%AE">2. サービスアカウントのキーファイルの配置</a></h4> <p><code>credential.json</code>というファイル名で、認証情報のキーファイルを配置</p> <h4 id="3. 追記したいスプレッドシートの権限設定"><a href="#3.+%E8%BF%BD%E8%A8%98%E3%81%97%E3%81%9F%E3%81%84%E3%82%B9%E3%83%97%E3%83%AC%E3%83%83%E3%83%89%E3%82%B7%E3%83%BC%E3%83%88%E3%81%AE%E6%A8%A9%E9%99%90%E8%A8%AD%E5%AE%9A">3. 追記したいスプレッドシートの権限設定</a></h4> <p>そのままだとサービスアカウントに書き込み権限がないためエラーに...<br /> そのため、追記したいスプレッドシートの共有権限にサービスアカウントを追加が必要。</p> <p>サービスアカウントの作成やスプレッドシートの共有設定は、<br /> 以下の記事がわかりやすかった...(<em>´ω`</em>)<br /> 「<a target="_blank" rel="nofollow noopener" href="https://techblog.lclco.com/entry/2018/11/30/120000">Node.jsでGoogleスプレッドシートを操作する - LCL Engineers' Blog</a>」</p> <h4 id="3. ローカルで試す"><a href="#3.+%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%81%A7%E8%A9%A6%E3%81%99">3. ローカルで試す</a></h4> <p><code>now dev</code>コマンドでローカルで動かすことができます。<br /> 実行すると<code>http://localhost:5001</code>で起動します。</p> <pre><code class="console">$ now dev -p 5001 // or $ npm run dev </code></pre> <h5 id="nowコマンドやアカウントがない場合..."><a href="#now%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%84%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%81%8C%E3%81%AA%E3%81%84%E5%A0%B4%E5%90%88...">nowコマンドやアカウントがない場合...</a></h5> <p><a target="_blank" rel="nofollow noopener" href="https://zeit.co">こちらのZEITのページ</a>からログイン&アカウント作成!</p> <p><a target="_blank" rel="nofollow noopener" href="https://zeit.co/docs/">公式ドキュメント</a>にあるように、インストールとログイン!</p> <pre><code class="console"># nowコマンドのインストール $ npm i -g now # CLIでのログイン $ now login </code></pre> <h4 id="3. ZEIT now にデプロイ"><a href="#3.+ZEIT+now+%E3%81%AB%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4">3. ZEIT now にデプロイ</a></h4> <p><code>now</code>コマンドでデプロイできます。<br /> プロジェクト名は、<code>now.json</code>の<code>name</code>に書いてある<strong>append-api</strong>になります。</p> <pre><code class="console">$ now // or $ npm run deploy </code></pre> <h3 id="使い方: API の呼び出し"><a href="#%E4%BD%BF%E3%81%84%E6%96%B9%3A+API+%E3%81%AE%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%97">使い方: API の呼び出し</a></h3> <p>デプロイした API は、以下のパラメタを受け取ります</p> <ol> <li>追記するシートの ID: <code>spreadsheetId</code></li> <li>追記する内容の配列: <code>values</code></li> </ol> <p>curl で呼び出すサンプルは以下のとおりです。<br /> URL には、<code>https://append-api.memory-lovers.now.sh</code><br /> のようなデプロイした URL を設定。</p> <p>ローカルで起動した場合は、<code>https://localhost:5001</code>を設定。</p> <pre><code class="bash">#!/bin/bash SHEET_ID='YOUR_SHEET_ID' URL='API_URL' curl -i \ -H "Accept: application/json" \ -H "Content-Type:application/json" \ -X POST --data '{ "spreadsheetId": "'$SHEET_ID'", "values": [ ["A", "B", "C"], ["D", "E", "F"] ] }' \ "$URL/append" </code></pre> <hr /> <h3 id="コードはこんな感じ。"><a href="#%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AF%E3%81%93%E3%82%93%E3%81%AA%E6%84%9F%E3%81%98%E3%80%82">コードはこんな感じ。</a></h3> <p>主にExpressに関する処理が多いですが、Google APIsを使うのは、<br /> <code>const doAppend = async (spreadsheetId, values) => {</code>のあたりに集約。</p> <pre><code class="javascript">import bodyParser from "body-parser"; import Express from "express"; import { google } from "googleapis"; require("./credential.json"); // サービスアカウントの認証情報 const app = Express(); // POSTのBODYにJSONを使うため、body-parserを有効化 app.use(bodyParser.urlencoded({ extended: true })); app.use(bodyParser.json()); /** * Spread Sheetに行を追加する処理 * @param {String} spreadsheetId シートID * @param {String[][]} values 追記するデータ。2次元配列で指定 */ const doAppend = async (spreadsheetId, values) => { // パラメタのチェック if (!spreadsheetId || !values) throw new Error("Error: Invalid Params"); // Spread Sheet APIを使うための認証処理 const auth = await google.auth.getClient({ scopes: ["https://www.googleapis.com/auth/spreadsheets"] }); const sheets = google.sheets({ version: "v4", auth }); // APIを呼び出して、行の追加処理 const req = { // シートのID spreadsheetId: spreadsheetId, // A1に追記することを指定 range: "A1", // 追記する形式を指定。 valueInputOption: "USER_ENTERED", // A1に値があったら下方向に空欄を探しにいく insertDataOption: "INSERT_ROWS", // 追加する行のデータ。2次元配列で指定 resource: { values: values } }; await sheets.spreadsheets.values.append(req); }; // '/append'にアクセスしたら、doAppend関数を呼ぶようにマッピング app.post("/append", async (req, res) => { try { // パラメタのチェック if (!req.body) throw new Error("Error: Empty Body"); // パラメタの取得 const spreadsheetId = req.body.spreadsheetId || ""; const values = req.body.values || ""; // 追記処理の呼び出し await doAppend(spreadsheetId, values); res.end(); } catch (error) { console.error(`Error in append: ${error}`, error); res.status(500).send({ error: `${error}` }); } }); export default app; </code></pre> <h5>はまったところ...<code>credential.json</code>を認識しない...</h5> <p>now.jsonに環境変数<code>GOOGLE_APPLICATION_CREDENTIALS</code>を設定して、<br /> 読み込むファイルを指定していたけど、エラーが...</p> <pre><code class="json">"env": { "GOOGLE_APPLICATION_CREDENTIALS": "./credential.json" } </code></pre> <blockquote> <p>Error in append: Error: The file at ./credential.json does not exist, or it is not a file.</p> </blockquote> <p>デプロイされたフォルダを見てみると、<code>credential.json</code>が配置されていない...</p> <p>いろいろ調べてみたところ、ビルドをするので関連のないファイルは配置されないっぽい...<br /> なので、<code>index.js</code>の冒頭に以下を追加して、読み込むように変更してみたところ、<br /> うまく認識されるようになったヽ(=´▽`=)ノ</p> <pre><code class="javascript">require("./credential.json"); // サービスアカウントの認証情報 </code></pre> <h3 id="活用事例1: 問い合わせ管理"><a href="#%E6%B4%BB%E7%94%A8%E4%BA%8B%E4%BE%8B1%3A+%E5%95%8F%E3%81%84%E5%90%88%E3%82%8F%E3%81%9B%E7%AE%A1%E7%90%86">活用事例1: 問い合わせ管理</a></h3> <p>開発しているWebサービスの問い合わせ効率化のために利用(<em>´ω`</em>)</p> <p>Nuxtに用意したフォームで受けた内容をスプレッドシートに転記して管理できるように♪</p> <blockquote class="twitter-tweet"><p lang="ja" dir="ltr">書籍のリクエスト、できてきた(*´ω`*)ピタゴラスイッチ的にFirestoreトリガーで、Slackに通知とSpread Sheetに追記ヽ(=´▽`=)ノ<br><br>これで、だいぶ楽になるはず(*´ω`*)♪ <a target="_blank" rel="nofollow noopener" href="https://t.co/9SIY2T23u3">pic.twitter.com/9SIY2T23u3</a></p>— 積読ハウマッチ📚きらぷか (@kira_puka) <a target="_blank" rel="nofollow noopener" href="https://twitter.com/kira_puka/status/1172029880680079360?ref_src=twsrc%5Etfw">September 12, 2019</a></blockquote> <p>以前、<a target="_blank" rel="nofollow noopener" href="https://qiita.com/kira_puka/items/d372cf8ce1c5c98360bd">書いた記事</a>のSlackAPIも使い、<br /> 通知と管理を一度にできるようになりましたヽ(=´▽`=)ノ</p> <h3 id="活用事例2: 統計情報の収集"><a href="#%E6%B4%BB%E7%94%A8%E4%BA%8B%E4%BE%8B2%3A+%E7%B5%B1%E8%A8%88%E6%83%85%E5%A0%B1%E3%81%AE%E5%8F%8E%E9%9B%86">活用事例2: 統計情報の収集</a></h3> <p>定期的にユーザ数やデータ数などを集計してスプレッドシートに追記できるように!<br /> スプレッドシートに追記するとグラフを出せるようになるのですてき(<em>´ω`</em>)</p> <blockquote class="twitter-tweet"><p lang="ja" dir="ltr">SpreadSheetAPIとなかよくなれたのでとりあえず、取ってる統計データを入れてみた(*´ω`*)ここ1週間で、1,300万円分が積まれ、総額2,000万円近く、登録されてた( ゚д゚)!強者達が...集まってきている...((((;゚Д゚))))ガクガクブルブル<a target="_blank" rel="nofollow noopener" href="https://twitter.com/hashtag/%E7%A9%8D%E8%AA%AD%E3%83%8F%E3%82%A6%E3%83%9E%E3%83%83%E3%83%81?src=hash&ref_src=twsrc%5Etfw">#積読ハウマッチ</a> <a target="_blank" rel="nofollow noopener" href="https://t.co/esCqTrQmLK">pic.twitter.com/esCqTrQmLK</a></p>— 積読ハウマッチ📚きらぷか (@kira_puka) <a target="_blank" rel="nofollow noopener" href="https://twitter.com/kira_puka/status/1171674794653188096?ref_src=twsrc%5Etfw">September 11, 2019</a></blockquote> <p>個人開発なので常に稼働が足りないですが、<br /> こういった裏方作業的なのも、もっと効率化していけるようになりたい...!!</p> <p>以上!!</p> <h2 id="こんなのつくってます!!"><a href="#%E3%81%93%E3%82%93%E3%81%AA%E3%81%AE%E3%81%A4%E3%81%8F%E3%81%A3%E3%81%A6%E3%81%BE%E3%81%99%EF%BC%81%EF%BC%81">こんなのつくってます!!</a></h2> <p>最近、積読用の読書管理アプリ「積読ハウマッチ」をリリースしました!<br /> <a target="_blank" rel="nofollow noopener" href="https://tsundoku.site">積読ハウマッチ</a>は、Nuxt.js+Firebaseで開発してます!</p> <p><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/572d4947-f40b-e4dc-1c9c-bc584cd2a66c.png" width="200"/></p> <p>もしよかったら、遊んでみてくださいヽ(=´▽`=)ノ</p> <p>要望・感想・アドバイスなどあれば、<br /> 公式アカウント(<a target="_blank" rel="nofollow noopener" href="https://twitter.com/MemoryLoverz">@MemoryLoverz</a>)や開発者(<a target="_blank" rel="nofollow noopener" href="https://twitter.com/kira_puka">@kira_puka</a>)まで</p> <h1 id="参考にしたサイト様"><a href="#%E5%8F%82%E8%80%83%E3%81%AB%E3%81%97%E3%81%9F%E3%82%B5%E3%82%A4%E3%83%88%E6%A7%98">参考にしたサイト様</a></h1> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/castaneai/items/a53d0b89bca5b84654be">スプレッドシート API で行を追加する - Qiita</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/howdy39/items/ca719537bba676dce1cf">Googleスプレッドシートをプログラムから操作 - Qiita</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/suisuina/items/a41932088acacea4835e">Google spreadsheetの値を取得する - Qiita</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://cloud.google.com/docs/authentication/api-keys?rd=1&visit_id=637037608757242156-1685701782">API キーの使用  |  認証  |  Google Cloud</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://github.com/googleapis/google-api-nodejs-client#using-api-keys">googleapis/google-api-nodejs-client: Google's officially supported Node.js client library for accessing Google APIs. Support for authorization and authentication with OAuth 2.0, API Keys and JWT (Service Tokens) is included.</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://dev.classmethod.jp/server-side/node-js-server-side/using-google-apis-node-js-client/">Google APIs Node.js Client を使って Google Analytics のページビューを取得する | DevelopersIO</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://github.com/zeit/now/issues/749">Storing complex secrets · Issue #749 · zeit/now</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://spectrum.chat/zeit/now/storing-authentication-credentials-file~aee6b468-9ea0-4f2d-9b7a-f07831df2fd9">Storing authentication credentials file · ZEIT</a></li> <li><a href="https://crieit.net/posts/Zeit-Now">ZeitのNowにデプロイするファイルを指定する時の注意 - Crieit</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://blog.hokuma.net/serverless/deploy_to_now/">Nowを使って静的サイトとAPIを単一レポジトリで運用する</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/miminashi/items/f48cd4c25b06fcab5ea3">curlチートシート - Qiita</a></li> </ul> きらぷか@積読ハウマッチ/SSSAPIなど tag:crieit.net,2005:PublicArticle/14871 2019-03-18T08:40:36+09:00 2020-04-12T00:20:42+09:00 https://crieit.net/posts/Now-Cloud-Storage NowのエッジキャッシュでCloud Storage節約サーバー作成 <p>ZeitのNowは標準でCDNがついています。それを利用してCloud Storageで公開している画像をキャッシュさせて料金を抑えるためのサーバーアプリケーションを作成しました。改造すればS3用としても使えると思います。GitHubでソースや使い方も公開しています。</p> <p><del>ちなみに、実運用ではまだちょっとしか試していないため現時点では実際に料金がどうなるかは未検証です。</del> ずっと試していますが恐らく節約にはなっていると思います。</p> <p>一応テストした限りでは下記のようにキャッシュはされているようです。(HITになっている)</p> <p><a href="https://crieit.now.sh/upload_images/bd7e316e8d8673d87a278823386ae3245c8cfe20b742c.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/bd7e316e8d8673d87a278823386ae3245c8cfe20b742c.png?mw=700" alt="" /></a></p> <h2 id="具体的にどういうことか"><a href="#%E5%85%B7%E4%BD%93%E7%9A%84%E3%81%AB%E3%81%A9%E3%81%86%E3%81%84%E3%81%86%E3%81%93%E3%81%A8%E3%81%8B">具体的にどういうことか</a></h2> <p>Cloud StorageはGCPのサービスのうちの一つで、ファイルを保存することができます。また、設定により画像などをそのまま公開してWebページ用に利用することもできます。</p> <p>ただ、表示するための通信量などにより課金されるため、無料枠はあるのですがちょっとアクセスが多くなる時などはオーバーすることもあります。そういった時に、他のサーバーなどで画像をキャッシュしておいてそこから配信を行えばCloud Storage側の通信がなくなるため、料金を節約することができます。</p> <h2 id="なぜNowを使うのか"><a href="#%E3%81%AA%E3%81%9CNow%E3%82%92%E4%BD%BF%E3%81%86%E3%81%AE%E3%81%8B">なぜNowを使うのか</a></h2> <p>適当なクラウドを使うと結局そこの通信量がかかったりするため、CDNのエッジキャッシュで配信するのが一番効率的なのではないかと思います。ZeitのNowだと無料ですしデプロイも非常に簡単ですのでそこで可動できるようなCloud Storage Proxyサーバーを作ってみました。</p> <p>しかもどうもデフォルトでCDN配信を行ってくれるようで、画像の拡張子で適切なヘッダを送信しておけば勝手にエッジキャッシュを行ってくれるようです。元々は独自ドメインを設定してCloudflareでCDN配信しようと思っていたため、手間が省けて助かりました。</p> <p>また、メインのアプリケーションと分離しての作成になるため、どのサービスにも使い回すことができます。</p> <p>元々メインアプリケーションに組み込んで作ろうと思っていたのですが、下記の記事を見て非常に作成が簡単にできそうだったので一気に作りました。</p> <p><a target="_blank" rel="nofollow noopener" href="https://qiita.com/aggre/items/f0cb9f8b8e8c54768e50">Now でクラウドの複雑さから解放されよう、今すぐに - Qiita</a></p> <h2 id="使い方"><a href="#%E4%BD%BF%E3%81%84%E6%96%B9">使い方</a></h2> <p>Nowにデプロイしたら、下記のようなURLにアクセスします。</p> <pre><code> https://<span>{</span><span>{</span> nowのデプロイホスト名 <span>}</span><span>}</span>/<span>{</span><span>{</span> Cloud Storage上のファイルパス <span>}</span><span>}</span> </code></pre> <p>プロジェクトIDやバケット等は事前に環境変数で指定しておきます。ここにアクセスすると同じパスのCloud Storage上のファイルを取得し、そのままブラウザに表示します。CDNキャッシュ可能な拡張子やレスポンスヘッダのため、キャッシュ状態がHITになり、以後はCDN上から配信されるため、Cloud Storageへのアクセスが減ります。(多分エリアやタイミングによってキャッシュ状態が変わる可能性があるので完全ではなさそうな気がします)</p> <h2 id="ソース"><a href="#%E3%82%BD%E3%83%BC%E3%82%B9">ソース</a></h2> <p>メイン処理だけ見ると下記のようになります。</p> <pre><code class="javascript">module.exports = async (req, res) => { const contentType = getContentType(req.url) const path = req.url.substr(1) const file = bucket.file(path) const image = await getRawData(file) res.writeHead(200, { 'Cache-Control': 'public, max-age=315360000', Expires: new Date(Date.now() + 315360000000).toUTCString(), 'Content-Type': getContentType(path), 'Content-Length': image.length }) res.end(image) } </code></pre> <p>GitHubで公開していますのでご興味があれば遊んでみてください。改造すれば色々な使い方ができると思います。</p> <p><a target="_blank" rel="nofollow noopener" href="https://github.com/dala00/cloud-storage-proxy">dala00/cloud-storage-proxy</a></p> <p>追記)<br /> ちなみに元々上記でやっていたようにGCPのjsonファイルを直接アップする方法ではなく、Nowの方で連携できるやり方があるのでそちらに対応しておきました。詳しくは下記参照です。</p> <p><a target="_blank" rel="nofollow noopener" href="https://zeit.co/integrations/gcloud">Google Cloud - Integrations - ZEIT</a></p> <p><a target="_blank" rel="nofollow noopener" href="https://qiita.com/mt0m/items/3e58d6185a5335729ccc#google-cloud-storageと連携する">Zeit Nowの具体的なTips集 - Qiita</a></p> <h2 id="試験運用中"><a href="#%E8%A9%A6%E9%A8%93%E9%81%8B%E7%94%A8%E4%B8%AD">試験運用中</a></h2> <p>この記事の最初の画像もNowからの配信のものです。URLも下記のようになっています。</p> <pre><code>[https://crieit.now.sh/upload_images/bd7e316e8d8673d87a278823386ae3245c8cfe20b742c.png](https://crieit.now.sh/upload_images/bd7e316e8d8673d87a278823386ae3245c8cfe20b742c.png) </code></pre> <h2 id="懸念点"><a href="#%E6%87%B8%E5%BF%B5%E7%82%B9">懸念点</a></h2> <p>最初にも書きましたが、料金については運用して検証していますが、実際どれほど節約になっているかは細かく計算はしていません。通信量は減ると思いますが、オブジェクトの取得オペレーションが無料枠を超えてしまう場合もあると思いますのでその場合は別途料金が発生してくる可能性があります。</p> <p>ですので、もし柔軟なカスタマイズが可能であればバズっている記事や人気の記事だけその画像を使うように置き換えると良いかもしれません。とはいえ、多分ちょっとした個人開発レベルであれば大丈夫ではないかと思いますが…。</p> <p>あまりに通信量が多くなると今度はNow側も無料ではいけなくなる可能性もあります。(…が、サーバーはともかく、CDNの通信量も関係あるんでしょうか?)このあたり詳しい事が完全に理解できているわけではないので色々試してみる必要はあるかもしれません。とにかく、むちゃくちゃ大規模なサービスで無料にしちゃおう、みたいなことは難しい可能性があります。</p> <p>なんにしろ引き続き検証していきます。</p> <p>追記)<br /> 一応バズったりした時に200円くらい行ったりしたのが大体常時50円以下になったような気がするような気もします。</p> <p>あとCDN関連でいうと他にもこんな遊びもしています。</p> <p><a href="https://crieit.net/posts/Crieit-5c7c535c6fca2">Crieitの記事詳細ページが日本の技術系投稿サービスで最速になった</a></p> だら@Crieit開発者 tag:crieit.net,2005:PublicArticle/14554 2018-09-28T08:14:25+09:00 2018-10-31T17:19:20+09:00 https://crieit.net/posts/Zeit-Now ZeitのNowにデプロイするファイルを指定する時の注意 <p>Zeitの<a target="_blank" rel="nofollow noopener" href="https://zeit.co/now">Now</a>にNuxt.jsのアプリケーションをデプロイする場合、公式のマニュアルにもあるようにnowコマンドで簡単にデプロイすることができる。ただ、うまくいかないパターンがあった。</p> <p><a target="_blank" rel="nofollow noopener" href="https://nuxtjs.org/faq/now-deployment/">Now Deployment - Nuxt.js</a></p> <h2 id="症状"><a href="#%E7%97%87%E7%8A%B6">症状</a></h2> <p>デプロイ後確認してみると、作成したアプリケーションではなく、Nuxtをインストールした時の状態の画面が表示されてしまっていた。</p> <h2 id="原因"><a href="#%E5%8E%9F%E5%9B%A0">原因</a></h2> <p>.gitignoreで指定したファイルは通常Nowにデプロイされる際には無視されるのだが、設定することで強制的にアップすることができる。具体的には now.json というファイルに files という設定を行うことで可能。</p> <pre><code class="json">{ "files": { "secret.js" } } </code></pre> <p>恐らく、これによりこのファイルしかアップロードされなくなってしまったのではないかという気がした。package.jsonは恐らく重要なので勝手にアップされ、Nuxtがデフォルトの状態でインストールされて表示されていたのではないだろうか。</p> <h2 id="対処方法"><a href="#%E5%AF%BE%E5%87%A6%E6%96%B9%E6%B3%95">対処方法</a></h2> <p>filesにすべてのフォルダとファイルを指定することで解決した。(不要なものもあるかもしれない)</p> <pre><code class="json">{ "files": { "assets", "components", "layouts", "middleware", "pages", "plugins", "static", "store", "secret.js", "nuxt.config.js", "yarn.lock" } } </code></pre> だら@Crieit開発者 tag:crieit.net,2005:PublicArticle/14546 2018-09-19T19:42:20+09:00 2018-10-23T19:16:06+09:00 https://crieit.net/posts/golang-echo-Now golangのechoで静的なサイトを建てるならNowがお手軽という話 <p><a target="_blank" rel="nofollow noopener" href="https://zeit.co/now">Now</a>というPaasが、golangをデプロイするのにお手軽だということがわかった。</p> <blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">golang echo でサーバ書いて Dockerfile 書いて now でアップロードしてみた。ドメインは適当に取って now ln で alias 張った。めちゃ簡単だし LE も作ってくれる。便利やん。<a target="_blank" rel="nofollow noopener" href="https://t.co/fXT7yR2BZC">https://t.co/fXT7yR2BZC</a></p>— mattn (@mattn_jp) <a target="_blank" rel="nofollow noopener" href="https://twitter.com/mattn_jp/status/1042078292944093184?ref_src=twsrc%5Etfw">2018年9月18日</a></blockquote> <h2 id="公開するまでの手順"><a href="#%E5%85%AC%E9%96%8B%E3%81%99%E3%82%8B%E3%81%BE%E3%81%A7%E3%81%AE%E6%89%8B%E9%A0%86">公開するまでの手順</a></h2> <ul> <li>Nowのアカウントを作成する</li> <li>DotTkで無料ドメインを取得する。 <ul> <li>Nameserverにzeit.worldを4つくらい指定しておく。</li> </ul></li> <li>Dockerfile, main.go, now.jsonを作成する。 <ul> <li>取得したドメインをnow.jsonのaliasに記述しておく。</li> </ul></li> <li>nowで一旦デプロイできるか確認する。</li> <li>問題なければnow aliasでproductionとしてデプロイする。</li> </ul> <h2 id="source code"><a href="#source+code">source code</a></h2> <p><a target="_blank" rel="nofollow noopener" href="https://github.com/fk2000/docker-go-now">こちら</a></p> fk2000