開発

vuetifyをCDNで使う

拙作ツールのアップデートを検討しているのですがUI部分の調整に時間を費やすことが多かったりします。

CSSのライブラリやフレームワークを使うのも良いですがメジャーなjsライブラリ・フレームワークと一緒に使えるエコシステムとして組み込まれているものが良いかな、と調べてみるとvuetifyがなかなか良さげだったので使ってみることにしました。

といっても、取り敢えずお試し程度に使いたいのでまずはローカルのHTMLファイルでサンプルを動かす程度をやってみようということで vuetify をCDNから読み込んで動かしてみようということです。ローカルファイルで構築済することでどこでもスキマ時間にいじることができます。

UIの方から入ったのでVue.js自体やBabelを分かってないですがなんとか動いております。

Babel7とvuetifyをCDNから読み込んで動かしてみる

vuetifyのQuick Startのページを見るとCDN Installという項目があるのでコレを参考にDefault application markupのコードをサンプルの起点としました。IEサポートも考えてIE11 & Safari 9 support を読むとBabelを組み込めば良いらしいのでBabelのCDN経由で使用するやりかたをしらべてみました。

2019/03現在だと Babel はバージョン7.xが最新とのこと。バージョン7を使ってCDN経由で動かす方法を調べてみましたが出てくるのはバージョン6を使った例ばかり。おそらく使い回せるだろう、とバージョン6のサンプルを真似て実行してみるがエラーが出てしまいます。

原因は大きく2つでした。@babel/standaloneを読み込むとCDN経由でもBabelを動かせるのですが@babel/standaloneがモダンブラウザでの動作を想定しているのかIEだとサポートしていない機能を使っていて動きません。Babel でPolifillしたコードが動いてほしかったのですがそのBabelを動かすためにPolifillした環境が必要になってしまいました。もう一つはpresetのstage指定。バージョン6では使えたのですがバージョン7では廃止になったのでコレが含まれていると動きませんでした。

この2つをクリアしたらほぼ思い通りに動いたのでプロトタイプで作ったコードを貼っておきます。

<!DOCTYPE html>
<html>
<head>
  <link href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900|Material+Icons" rel="stylesheet">
  <link href="https://cdn.jsdelivr.net/npm/vuetify@1.5.2/dist/vuetify.min.css" rel="stylesheet">
  <!-- <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/vuetify/2.0.15/vuetify.min.css" integrity="sha256-pDcK9eD3CHRmrOhlHdlr87HvMWbmpvtjNsVyhCjlU38=" crossorigin="anonymous" /> -->
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no, minimal-ui">
  <meta charset="utf-8"/>
</head>
<body>
  <div id="app">
    <v-app>
      <v-navigation-drawer app>aaaa</v-navigation-drawer>
      <v-toolbar app>bbb</v-toolbar>
      <v-content>
        <v-container fluid>

          <v-layout column >
            <v-flex xs2 pa-2 ma-2 >
                <router-view>{{ message }}</router-view>
            </v-flex >

            <v-form
             v-on:submit.prevent="changeMsg"
            >
              <v-layout row wrap >
                <v-flex
                 pa-2 ma-2
                 grow
                >
                  <v-text-field
                   label="Input keyword"
                   prepend-inner-icon="place"
                   placeholder="something related images"
                   box
                   v-model="message"
                   clearable
                  ></v-text-field>
                </v-flex >
                <v-flex
                 pa-2 ma-2
                 shrink
                >
                  <v-btn
                   round
                   dark
                   v-on:click="changeMsg"
                  >Search!</v-btn>
                </v-flex >
              </v-layout>
            </v-form>

            <v-layout align-start justify-start row wrap >
              <v-flex
               xs6 sm4 md3 lg2
               pa-1 ma-1
               v-for="item in images"
              >
                <v-card
                 width="220"
                >
                  <v-img
                   v-bind:src="item.url"
                   max-width="200"
                   max-height="200"
                   contain
                  ></v-img>
                  <v-card-title primary-title>
                    {{ item.title }}
                  </v-card-title>
                  <v-card-text>
                    {{ item.tags }}
                  </v-card-text>
                </v-card>
              </v-flex >
            </v-layout>

            <v-form
             v-on:submit.prevent="changeMsg"
            >
              <v-layout row wrap >
                <v-flex
                 pa-2 ma-2
                 grow
                >
                  <v-text-field
                   label="Input keyword"
                   prepend-inner-icon="place"
                   placeholder="something related images"
                   box
                   v-model="message"
                   clearable
                  ></v-text-field>
                </v-flex >
                <v-flex
                 pa-2 ma-2
                 shrink
                >
                  <v-btn
                   round
                   dark
                   v-on:click="changeMsg"
                  >Search!</v-btn>
                </v-flex >
              </v-layout>
            </v-form>

            <v-form>
              <v-flex xs12 pa-2 ma-2>
                <v-textarea
                  box
                  name="results"
                  label="Tags"
                  placeholder="Generated Tags will be here"
                  value=""
               ></v-textarea>
              </v-flex >
            </v-form>

          </v-layout>
        </v-container>
      </v-content>
      <v-footer app>ddd</v-footer>
    </v-app>
  </div>


  <script type="text/babel" data-presets="es2015,es2016,es2017">
    const app = new Vue({
      el: '#app',
      // vuetify: new Vuetify(), // v2.0以降はこの設定が必要
      data: {
        message: '',
        images: []
      },
      methods: {
        changeMsg: function () {
          const min = 50 ;
          const max = 1500 ;
          const n = Math.floor( Math.random() * 10 ) + 1 ;

          [...Array(n)].map(() => {
            const title = 'cat'

            const imgw = Math.floor( Math.random() * (max + 1 - min) ) + min
            const imgh = Math.floor( Math.random() * (max + 1 - min) ) + min

            const url = 'http://placekitten.com/' + imgw + '/' + imgh
            const tags = 'kitten, 猫'

            this.images.push({ url: url, tags: tags, title: title})
          })
          // console.log(this.images)
          this.message = 'submit'
      }}
    })
  </script>
</body>

<!-- @babel/standaloneを動かすためにpolyfill -->
<script crossorigin="anonymous" src="https://cdn.polyfill.io/v3/polyfill.min.js?flags=gated&features=es5,es6,es7"></script>

<!-- <script src="https://unpkg.com/@babel/standalone/babel.min.js"></script> -->
<script src="https://cdn.jsdelivr.net/npm/@babel/standalone@7.3.3/babel.min.js" integrity="sha256-Pa4ukKE/8OYeUTJ26hTs2kSoUJk2YPPjoDZUXcpqYbk=" crossorigin="anonymous"></script>

<script src="https://cdn.jsdelivr.net/npm/@babel/polyfill@7.2.5/dist/polyfill.min.js" integrity="sha256-5MaPCzSnmBMXH0Z0wdF0ETeJh9zN+psdZ641gqe4AQo=" crossorigin="anonymous"></script>

<!-- polyfill.min.jsでなくこちらでも動いた -->
<!-- <script src="https://cdn.jsdelivr.net/npm/@babel/polyfill@7.2.5/browser.js" integrity="sha256-5MaPCzSnmBMXH0Z0wdF0ETeJh9zN+psdZ641gqe4AQo=" crossorigin="anonymous"></script> -->

<script src="https://cdn.jsdelivr.net/npm/vue@2.6.7/dist/vue.min.js" integrity="sha256-wjeNXh/Gd38adX82/m9I1JR9pAOIBo7rK0Rxogq4FQg=" crossorigin="anonymous"></script>

<script src="https://cdn.jsdelivr.net/npm/vuetify@1.5.2/dist/vuetify.min.js" integrity="sha256-JKMIbIbZD5/wrlXXmlTLXX9pMUFuhwraY8m+FFj0N/o=" crossorigin="anonymous"></script>
<!-- <script src="https://cdnjs.cloudflare.com/ajax/libs/vuetify/2.0.15/vuetify.min.js" integrity="sha256-zGlKlXaHi/4rUyceAzYi4ZdTL7WYF03FIybeWk/UUbk=" crossorigin="anonymous"></script> -->

</html>

polyfill.ioを使っているのですが@babel/polyfillも使わないとIEで動きませんでした。

Babelバージョン6だと polyfill.io を使わずに済むので少し軽くなってこちらのほうが便利でした。関連部分だけ貼っておきます。

<!-- <script crossorigin="anonymous" src="https://cdn.polyfill.io/v3/polyfill.min.js?flags=gated&features=es5,es6,es7"></script> -->

<script src="https://cdn.jsdelivr.net/npm/babel-standalone@6.26.0/babel.min.js" integrity="sha256-FiZMk1zgTeujzf/+vomWZGZ9r00+xnGvOgXoj0Jo1jA=" crossorigin="anonymous"></script>

<script src="https://cdn.jsdelivr.net/npm/babel-polyfill@6.26.0/dist/polyfill.min.js" integrity="sha256-WRc/eG3R84AverJv0zmqxAmdwQxstUpqkiE+avJ3WSo=" crossorigin="anonymous"></script>

<script src="https://cdn.jsdelivr.net/npm/vue@2.6.7/dist/vue.min.js" integrity="sha256-wjeNXh/Gd38adX82/m9I1JR9pAOIBo7rK0Rxogq4FQg=" crossorigin="anonymous"></script>

<script src="https://cdn.jsdelivr.net/npm/vuetify@1.5.2/dist/vuetify.min.js" integrity="sha256-JKMIbIbZD5/wrlXXmlTLXX9pMUFuhwraY8m+FFj0N/o=" crossorigin="anonymous"></script>
<!-- <script src="https://cdnjs.cloudflare.com/ajax/libs/vuetify/2.0.15/vuetify.min.js" integrity="sha256-zGlKlXaHi/4rUyceAzYi4ZdTL7WYF03FIybeWk/UUbk=" crossorigin="anonymous"></script> -->

</html>

IE上での挙動

一応サポートしているということで、Vuetify のサンプルを見ながらv-text-fieldで画面を作ったのですがIE11上だとどうしても崩れてしまいます。悩んだ挙げ句にv-formで囲って上げる(単に form でも良いかも)とFirefoxと同じルックスになりました。若干動きがおかしなところはありますが概ね他ブラウザと同じように動いています。IE11との互換性を維持していく場合、他にも嵌まるポイントが有るのかもしれません。

ちょっと面倒臭くなってきたのと開発元も推奨していないのでIEサポートはなしの方向でやっていこうと思います。

管理人

Recent Posts

CanvaがSerif (Affinity) を買収

私は使ったことがないのですが名前はよく聞…

3週間 ago

Serifのスプリングセール – アドオンが50%オフ

Affinity Photoなどレタッチ…

1か月 ago

音声がロボットのようになるときの対処

リモート会議などでたまに相手の音声がおか…

3か月 ago

Serifのブラックフライデー – 全品40%オフ V1ユーザは更にお得!

恒例のブラックフライデーセールが始まりま…

5か月 ago

[rust] rayonで書き直してみました

前回のコードを元にrayonを使った処理…

5か月 ago

[rust] async-stdで書き直してみました

前回のコードをasync-stdで書き直…

6か月 ago