Skip to content

Instantly share code, notes, and snippets.

@wataruoguchi
Last active December 9, 2018 22:17
Show Gist options
  • Save wataruoguchi/d4e95ff30bba8d86b2b8401d33fc9c6c to your computer and use it in GitHub Desktop.
Save wataruoguchi/d4e95ff30bba8d86b2b8401d33fc9c6c to your computer and use it in GitHub Desktop.
Firebase公式動画を参考にFirebaseとNuxt.jsを使ってSSRをServerlessで実現する ref: https://qiita.com/wataruoguchi/items/fa9b59e21c4212293c04
$ # プロジェクト用のフォルダ(<proj>、任意に決めてください)を作って、そのフォルダの中へ移動。
$ mkdir <proj> && cd $_
$ sudo firebase serve --only functons,hosting
$ # <proj>フォルダにいることを確認してください。
$ # src/nuxt.config.jsを編集します。
$ vi src/nuxt.config.js
$ # <proj>フォルダにいることを確認してください。
$ vi functions/index.js
$ # <proj>フォルダにいることを確認してください。
$ # srcフォルダへ移動してビルドをします。
$ cd src && yarn build
$ # <proj>フォルダに移動して静的アセットをコピー
$ cd .. && cp -R functions/nuxt/dist/ public && cp -R src/static/* public
$ # localhostで実行
$ sudo firebase serve --only hosting,functions
$ # <proj>フォルダにいることを確認してください。
$ firebase deploy
"rewrites": [
{
"source": "**",
"function": "nuxtApp"
}
]
$ # <proj>フォルダにいることを確認してください。
$ # firebase.json を編集します。
$ vi firebase.json
$ # vue-cliとyarnをインストールします。
$ sudo npm i -g vue-cli yarn
$ # nuxt-community/starter-templateを元にsrcフォルダへNuxtアプリが自動設定されます。
$ vue init nuxt-community/starter-template src
$ # 質問への回答は全部デフォルトでいいかと思います。Enterを押し続けてください。
- ? Generate project in current directory?
- ? Project name
- ? Project description
- ? ? Author
$ # srcフォルダへ移動し、npmパッケージをインストールします。
$ cd src/ && yarn
$ # nuxt.config.jsという設定ファイルを編集します。
$ vi nuxt.config.js
publicPath: '/public/',
vendor: ['axios'],
extractCSS: true,
$ # srcフォルダにいることを確認してください。
$ # 動画ではHTTPリクエストにisomorphic-fetchを使っています。
$ # しかしNuxt.js公式がaxiosの使用を超勧めていますので長い物には巻かれます。
$ yarn add axios
$ # デフォルトのindex.vueの中身を消して、一から作ります。
$ echo '' > pages/index.vue && vi pages/index.vue
$ # srcフォルダにいることを確認してください。
$ # yarn devでdev webサーバを起動して、Nuxt.jsも起動させます。
$ yarn dev
vendor: ['axios', 'babel-polyfill'],
$ # srcフォルダにいることを確認してください。
$ # yarn devでdev webサーバを起動して、Nuxt.jsも起動させます。
$ yarn dev
babel: {
presets: [
'es2015',
'stage-0'
],
plugins: [
['transform-runtime', {
'polyfill': true,
'regenerator': true,
}]
],
},
$ # srcフォルダにいることを確認してください。
$ # babelプラグインをインストールします。
$ yarn add -D babel-plugin-module-resolver babel-plugin-transform-runtime babel-preset-es2015 babel-preset-stage-0
$ # nuxt.config.jsという設定ファイルを編集します。
$ vi nuxt.config.js
$ # プロジェクトを選択できるよう追加します。
$ firebase use --add
$ # <proj>フォルダに移動します。
$ cd <proj>
$ # firebase-toolsをインストールします。
$ sudo npm i -g firebase-tools
$ # ここでユーザログインをします。firebase公式のチュートリアルに沿って操作しました。
$ firebase login
$ # Cloud Functionsを含め、初期設定を行います。
$ firebase init functions
$ # プロジェクトが無いと思うので[create a new project]を選択します。
- ? Select a default Firebase project for this directory:
$ # どの言語(JSかTS)を使いたいか聞かれます。以降の質問に対してはデフォルトで良いです。
- ? What language would you like to use to write Cloud Functions?
- ? Do you want to use ESLint to catch probable bugs and enforce style?
- ? Do you want to install dependencies with npm now?
$ # functonsフォルダに移動します。
$ cd functions
$ # package.jsonを編集します。
$ vi package.json
$ # 追加したパッケージをインストールします。
$ yarn
$ # express をインストールします。
$ yarn add express
$ # srcフォルダに移動し、アプリをビルドし、functionsフォルダに戻ってきましょう。
$ cd ../src/ && yarn build && cd ../functions/
buildDir: '../functions/nuxt',
$ # nuxtの設定ファイルを編集します。
$ vi src/nuxt.config.js
const functions = require('firebase-functions')
const express = require('express')
const { Nuxt } = require('nuxt')
const app = express()
const config = {
dev: false,
buildDir: 'nuxt',
build: {
publicPath: '/public/'
}
}
const nuxt = new Nuxt(config)
function handleRequest(req, res) {
res.set('Cache-Control', 'public, max-age=600, s-maxage=1200')
nuxt.renderRoute('/').then(result => {
res.send(result.html)
}).catch(e => {
res.send(e)
})
}
app.get('*', handleRequest)
exports.nuxtApp = functions.https.onRequest(app)
$ # functionsフォルダにいることを確認してください。
$ echo '' > index.js && vi index.js
$ # ページは全てNuxt.jsがレンダリングするので、標準でできたファイルは消しましょう。
$ rm public/404.html public/index.html
$ # functions/nuxtからdistをpublic/assetsにコピーしましょう。
$ cp -R functions/nuxt/dist public/assets
$ # src/static/からもpublicにコピーしましょう。
$ cp -R src/static/* public
$ # functionsフォルダにいることを確認してください。
$ # <proj>フォルダに移動します。
$ cd ../
$ firebase init hosting
$ # 質問に対する回答は全部デフォルトで良いです。
- ? What do you want to use as your public directory?
- ? Configure as a single-page app (rewrite all urls to /index.html)?
$ # プロジェクト用のフォルダ(<proj>、任意に決めてください)を作って、そのフォルダの中へ移動。
$ mkdir <proj> && cd $_
$ # vue-cliとyarnをインストールします。
$ sudo npm i -g vue-cli yarn
$ # nuxt-community/starter-templateを元にsrcフォルダへNuxtアプリが自動設定されます。
$ vue init nuxt-community/starter-template src
$ # 質問への回答は全部デフォルトでいいかと思います。Enterを押し続けてください。
- ? Generate project in current directory?
- ? Project name
- ? Project description
- ? ? Author
$ # srcフォルダへ移動し、npmパッケージをインストールします。
$ cd src/ && yarn
$ # srcフォルダにいることを確認してください。
$ # yarn devでdev webサーバを起動して、Nuxt.jsも起動させます。
$ yarn dev
$ # <proj>フォルダに移動します。
$ cd <proj>
$ # firebase-toolsをインストールします。
$ sudo npm i -g firebase-tools
$ # ここでユーザログインをします。firebase公式のチュートリアルに沿って操作しました。
$ firebase login
$ # Cloud Functionsを含め、初期設定を行います。
$ firebase init functions
$ # プロジェクトが無いと思うので[create a new project]を選択します。
- ? Select a default Firebase project for this directory:
$ # どの言語(JSかTS)を使いたいか聞かれます。以降の質問に対してはデフォルトで良いです。
- ? What language would you like to use to write Cloud Functions?
- ? Do you want to use ESLint to catch probable bugs and enforce style?
- ? Do you want to install dependencies with npm now?
$ # プロジェクトを選択できるよう追加します。
$ firebase use --add
$ # nuxtの設定ファイルを編集します。
$ vi src/nuxt.config.js
$ # functonsフォルダに移動します。
$ cd functions
$ # package.jsonを編集します。
$ vi package.json
$ # package.jsonを編集します。
$ # 追加したパッケージをインストールします。
$ yarn
$ # express をインストールします。
$ yarn add express
$ # srcフォルダに移動し、アプリをビルドし、functionsフォルダに戻ってきましょう。
$ cd ../src/ && yarn build && cd ../functions/
$ # functionsフォルダにいることを確認してください。
$ echo '' > index.js && vi index.js
$ # functionsフォルダにいることを確認してください。
$ # <proj>フォルダに移動します。
$ cd ../
$ firebase init hosting
$ # 質問に対する回答は全部デフォルトで良いです。
- ? What do you want to use as your public directory?
- ? Configure as a single-page app (rewrite all urls to /index.html)?
$ # srcフォルダにいることを確認してください。
$ # 動画ではHTTPリクエストにisomorphic-fetchを使っています。
$ # しかしNuxt.js公式がaxiosの使用を超勧めていますので長い物には巻かれます。
$ yarn add axios
$ # デフォルトのindex.vueの中身を消して、一から作ります。
$ echo '' > pages/index.vue && vi pages/index.vue
$ # ページは全てNuxt.jsがレンダリングするので、標準でできたファイルは消しましょう。
$ rm public/404.html public/index.html
$ # functions/nuxtからdistをpublic/assetsにコピーしましょう。
$ cp -R functions/nuxt/dist public/assets
$ # src/static/からもpublicにコピーしましょう。
$ cp -R src/static/* public
$ # <proj>フォルダにいることを確認してください。
$ # firebase.json を編集します。
$ vi firebase.json
$ sudo firebase serve --only functons,hosting
$ # <proj>フォルダにいることを確認してください。
$ # src/nuxt.config.jsを編集します。
$ vi src/nuxt.config.js
$ # <proj>フォルダにいることを確認してください。
$ vi functions/index.js
$ # <proj>フォルダにいることを確認してください。
$ # srcフォルダへ移動してビルドをします。
$ cd src && yarn build
$ # <proj>フォルダに移動して静的アセットをコピー
$ cd .. && cp -R functions/nuxt/dist/ public && cp -R src/static/* public
$ # localhostで実行
$ sudo firebase serve --only hosting,functions
$ # <proj>フォルダにいることを確認してください。
$ firebase deploy
$ # nuxt.config.jsという設定ファイルを編集します。
$ vi nuxt.config.js
$ # srcフォルダにいることを確認してください。
$ # yarn devでdev webサーバを起動して、Nuxt.jsも起動させます。
$ yarn dev
$ # srcフォルダにいることを確認してください。
$ # babelプラグインをインストールします。
$ yarn add -D babel-plugin-module-resolver babel-plugin-transform-runtime babel-preset-es2015 babel-preset-stage-0
$ # nuxt.config.jsという設定ファイルを編集します。
$ vi nuxt.config.js
"rewrites": [
{
"source": "**",
"function": "nuxtApp"
}
]
const functions = require('firebase-functions')
const express = require('express')
const { Nuxt } = require('nuxt')
const app = express()
const config = {
dev: false,
buildDir: 'nuxt',
build: {
publicPath: '/public/'
}
}
const nuxt = new Nuxt(config)
function handleRequest(req, res) {
res.set('Cache-Control', 'public, max-age=600, s-maxage=1200')
nuxt.renderRoute('/').then(result => {
res.send(result.html)
}).catch(e => {
res.send(e)
})
}
app.get('*', handleRequest)
exports.nuxtApp = functions.https.onRequest(app)
<template>
<ul>
<li v-for="(fact, factIdx) in facts" :key="factIdx">
{{ fact.text }}
</li>
</ul>
</template>
<script>
import axios from 'axios'
export default {
async asyncData() {
const res = await axios.get('https://nuxt-ssr.firebaseio.com/facts.json')
const facts = res.data
return { facts }
}
}
</script>
<style>
</style>
buildDir: '../functions/nuxt',
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment