LoginSignup
13
10

More than 5 years have passed since last update.

画像ジェネレータ?っぽいサイトをNuxt.js(SSR) +Firebaseで作ってみる

Last updated at Posted at 2019-02-06

画像ジェネレータ?みたいなサイトをよく見かけてて
どういう風にしたら作れるのか気になっていた
こちらの記事読んだら素人でもできんじゃね?と思ってこういうものをつくった

概要

  • 動的な画像生成の簡単な方法を試した
  • 生成された画像をFirebaseに保存した
  • OGP用のメタタグを設定して生成した画像をTwitter Cardsに登録できるようにした

実際にやったこと

かいつまんで…

画像を動的に生成する

クライアント側で画像を生成する方法、なんか楽できないか考えたところ
とりあえずdom-to-imageというライブラリがあったので使ってみた
これを使うと指定したDOMを画像として吐き出してくれる

雰囲気こんな感じ

<template>
  <div>
    <target-component ref="target"/>
  </div>
</template>
<script>
import domtoimage from "dom-to-image";
export default {
  //中略
  methods: {
    async submit() {
      const el = this.$refs.target.$el;
      const options = {
        type: "dataURL"
      };
      const output = await domtoimage.toPng(el, { height: 370, width: 370 });
      await this.upload(output);
    },
    async upload(data) {//////}
}
</script>

こういう感じで吐き出される

image.png

dom-to-imageだとWebフォントがうまくとってこれないなど
見たままのDOMを生成することはできない
また、クライアントの環境に仕上がりがめちゃくちゃ左右される
ここで生成するのはTwitter Cardsに貼り付けるためだけの画像なので
割り切ることにした

動的に生成された画像をどこかに保管する

Firebaseに保存することにした

~/plugins/firebase.js
import firebase from "firebase";
const config = {
  //呪文
};
if (!firebase.apps.length) {
  firebase.initializeApp(config);
}
export default firebase

本体

<script>
import firebase from "~/plugins/firebase";

export default {

  methods: {
    async upload(data) {
      const db = firebase.firestore();
      const sRef = firebase.storage().ref();
      const name = "test"
      const fileRef = sRef.child(`${name}.png`);
      fileRef
        .putString(data, "data_url")
        .then(ss => {
          const card = db.collection("example").doc(name);
          return card.set(
            {
              message: this.forms
            },
            { merge: false }
          );
        })
        .then(docRef => {
        })
        .catch(err => {
        });
  }
}
</script>

めちゃめちゃ簡単だった
え、ほんとにこれでいいのか?

OGP用にタグを設定する

コードでやることはmetaタグをheadに書くだけ

<script>

export default {
  head() {
    return {
      meta: [//中略]
    }
  }
</script>

Herokuを使うことにしたので、Heroku用にSSRの設定を書く

~/Procfile
web: npm run start

nuxtにも、SSRの設定をしとく

nuxt.config.js
module.exports = {
  mode: 'universal'
}

できたもの

わーいTwitter Cardsが表示された

image.png

つくったやつ

わけわからんと思うので、文脈を補足
応援しているVtuberのパンチラインを個人的に集めたサイトを作っていた
たまたまその時期が正月だったから、カルタという形でパンチラインを取りまとめていた
作って公開して、ほかの人も好きなパンチラインを共有できるようにできればちょっと面白いかもなと思った
そんなときにこちらの記事読んだら、これっておれでもできんじゃね?と思ってこういうものを試した

感想

JavaScript触り始めて一年満たないくらいでも
ひとのもの参考にしながらやったらなんかしら作れるんだな という実感
とりあえずこの手のサイトを作るうえでの、一通りの流れはつかめた
これ作るの多分1人日くらいだった
firebaseすごい
バックエンド用意すんのかったるそうだと思ってたけど
こんな簡単にできちまうのか、とビビっている
画像生成のところもいけそうな気がするし、簡単な修整もfirebaseでできそうだ

最後に

至らない点が多々あるかと思いますが、
「こうすべきだ」というポイントなどあれば
教えていただけたら嬉しいです。

13
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
10