bitbucket Webhooksでvueプロジェクトのデプロイとビルドを自動化

Webhooksを設定

Bitbucketリポジトリの

Settings > Webhooks 

に遷移

Add webook をクリック

titleとリクエスト先URLを入力

Triggers  > Repository push にチェックが入っているのを確認。リポジトリプッシュがトリガーになって入力したURLにリクエストを送られる。

Webhooksのリクエスト先を作成

webhooksのリクエスト先のdeploy.jsを作成
 
webhooksがリクエストすると、任意のディレクトリ(vue-project)でmasterをプルしてきて、yarn buildを実行


const http = require("http");
const url = require("url");
const util = require("util");
const childProcess = require("child_process");
const exec = util.promisify(childProcess.exec); //child_processをprmoise化

const pullMaster = async () => {
  const cmd_pull = `cd ${__dirname}/vue-project && git checkout master && git pull origin master`;
  return await exec(cmd_pull, { timeout: 90000 }, (error, stdout, stderr) => {
    if (error !== null) {
      console.log("exec error: " + error);
    }
  });
};

const build = async () => {
  await exec(`cd ${__dirname}/vue-project && yarn build`);
};

const pullAndBuild = async () => {
  await pullMaster();
  await build();
};

http
  .createServer((req, res) => {
    if (
      req.method == "POST"
    ) {
      pullAndBuild();
    }
  })
  .listen(3000);

次のイベントループで関数を実行するいくつかの方法

vue.jsだと、vue.nextTickでできる


this.$nextTick(()=>{
  ...
});

Javascriptでよく使われるのはsetTimeout


setTimeout(()=>{
  ...
},0)

Promiseでもできる


Promise.resolve().then(() => {
  ...
});

ちょっと違うけど、ReactだとsetStateで関数を実行することで、上記の代替になるかも


setState(()=>{
 ...
})

vueでモバイル判定をする

ユーザーエージェントで判定

isMobile.js

ライブラリを追加

yarn add ismobilejs

テンプレートで出し分けしたい場合


  <template>
    <div v-if="isMobile.phone">
      <div>モバイルで表示</div>
    </div>
  </template>
  import isMobile from "ismobilejs";
  export default {
    data:()=>{
      isMobile
    }
  }

レスポンシブで判定

vue-mq

ライブラリを追加

yarn add vue-mq

テンプレートで出し分けしたい場合


  <template>
    <div v-if="$mq==='sp'">
      <div>モバイルで表示</div>
    </div>
  </template>
  <script>
  import Vue from "vue";
  import VueMq from "vue-mq";

  const breakpoints = {
    sp: 400,
    pc: 1024
  };
  Vue.use(VueMq, { breakpoints });
  </script>