vue-pwa-boilerplateにvue-materialとscssを追加する

[vue-pwa-boilerplate](https://github.com/vuejs-templates/pwa)にvue-materialとscssを追加します。


## vue-materialの追加
http://vuematerial.io/#/getting-started

### パッケージのインストール
`npm install vue-material --save`

### Googleフォント・アイコンの読み込み
```html:index.html

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
	
	<!-- 省略 -->
	
    <!-- Google icons and fonts for vue-material -->
    <link rel="stylesheet" href="//fonts.googleapis.com/css?family=Roboto:300,400,500,700,400italic">
    <link rel="stylesheet" href="//fonts.googleapis.com/icon?family=Material+Icons">
  </head>
  
  <body>
    <noscript>
      This is your fallback content in case JavaScript fails to load.
    </noscript>
    <div id="app"></div>
    <!-- Todo: only include in production -->
    <%= htmlWebpackPlugin.options.serviceWorkerLoader %>
    <!-- built files will be auto injected -->
  </body>
</html>

```

下記を追加してあります。

```
    <link rel="stylesheet" href="//fonts.googleapis.com/css?family=Roboto:300,400,500,700,400italic">
    <link rel="stylesheet" href="//fonts.googleapis.com/icon?family=Material+Icons">
```

### Cardコンポーネントの追加
http://vuematerial.io/#/components/card
こちらにある`Complete Example`をそのままコピーして追加してみます。

```vue:Card.vue
<template>
  <md-card class="card-example">
    <md-card-area md-inset>
      <md-card-media md-ratio="16:9">
        <img src="../../assets/images/card-example.jpg" alt="Coffee House">
      </md-card-media>

      <md-card-header>
        <h2 class="md-title">Coffee House</h2>
        <div class="md-subhead">
          <md-icon>location_on</md-icon>
          <span>2 miles</span>
        </div>
      </md-card-header>

      <md-card-content>
        Illy Coffee served with a complimentary Leonidas Belgian Chocolate with all beverages.
      </md-card-content>
    </md-card-area>

    <md-card-content>
      <h3 class="md-subheading">Today's availability</h3>
      <div class="card-reservation">
        <md-icon>access_time</md-icon>
        <md-button-toggle md-single class="md-button-group">
          <md-button>5:30PM</md-button>
          <md-button>7:30PM</md-button>
          <md-button>9:00PM</md-button>
        </md-button-toggle>
      </div>
    </md-card-content>

    <md-card-actions>
      <md-button class="md-primary">Reserve</md-button>
    </md-card-actions>
  </md-card>
</template>

<script>
export default {
  name: 'card-example',
};
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style lang="scss" scoped>
.card-example {
  width: 95%;
  margin: auto;

  .md-subhead {
    .md-icon {
      $size: 16px;

      width: $size;
      min-width: $size;
      height: $size;
      min-height: $size;
      font-size: $size;
      line-height: $size;
    }

    span {
      vertical-align: middle;
    }
  }

  .card-reservation {
    margin-top: 8px;
    display: flex;
    align-items: center;
    justify-content: space-around;

    .md-icon {
      margin: 8px;
      color: rgba(#000, .54) !important;
    }

    .md-button {
      border-radius: 2px !important;
    }
  }
}
</style>
```

が、このままではきちんとビルドされません。


## scssをコンパイル出来るようにする
### sass-loaderとnode-sassのインストール
`npm install sass-loader node-sass --save-dev`

### sassなの? scssなの?
Sass, SASS, SCSSの違いについては下記のリンクを参考に。
要するに、sass-loaderはcssを拡張したメタ言語のloaderという意味で、
`Card.vue`に書いた`<style lang="scss" scoped>`はSassのうち、SCSSという記法で記述しますという意味です。

### webpack.config.js
vue-pwa-boilerplateに含まれているものをそのまま使えば上記の手順で済みます。
vue-loaderの設定で良い感じでやってくれている。
webpackの設定から下記を呼び出している。

```js:vue-loader.conf.js
var utils = require('./utils')
var config = require('../config')
var isProduction = process.env.NODE_ENV === 'production'

module.exports = {
  loaders: utils.cssLoaders({
    sourceMap: isProduction
      ? config.build.productionSourceMap
      : config.dev.cssSourceMap,
    extract: isProduction
  }),
  transformToRequire: {
    video: 'src',
    source: 'src',
    img: 'src',
    image: 'xlink:href'
  }
}
```

utils.cssLoader側で適切なloaderが設定されます。