megutech

自身の備忘録として主にWEBサーバー周りの技術について投稿しています。

Vue.jsのバンドルファイルサイズを1/3に削減した話

Laravel-mixを使ってVue.jsを開発していた時、特に大したこともしていないはずなのにバンドルサイズが6.09MBにもなった。
このバンドルファイルを6.09MBから1.96MBに削減した話。

結論

コンポーネント内でimportしているscssファイルが大きいと、その分コンポーネントが巨大になる。

webpack-bundle-analyzerで分析

webpack-bundle-analyzerを使えば各コンポーネントサイズが視覚的に分かります。
今回はLaravel-mixを使っているので webpack-bundle-analyzerを使いました。

すると何の変哲もないコンポーネントの多くが200kb以上のサイズになっていました。

原因

200kb以上あるコンポーネントの共通点を考えたところ、全てのコンポーネント内でscssを使っていました。
またそれらは特定のファイルをimportしていたのです。

HogeComponent.vue

<template>
    <div class="alert" @click="alert">
        alert表示
    </div>
</template>

<script>
export default {
    methods: {
        alert () {
            alert('アラートです')
        }
    }
}
</script>

<style lang="scss" scoped>
@import 'resources/sass/app.scss';

.alert {
    padding: 0 .7rem;
}
</style>

resources/sass/app.scss

// Fonts
@import url('https://fonts.googleapis.com/css?family=Nunito');

// Bootstrap
@import '~bootstrap/scss/bootstrap';

$primary-color: #2F353A;
$secondary-color: #3A4248;
~~

はい。毎回fontやらbootstrapが展開されます^q^

対策

別途必要な文だけのscssファイルを作って、そのファイルをvueでimportさせる。

HogeComponent.vue

<template>
    <div class="alert" @click="alert">
        alert表示
    </div>
</template>

<script>
export default {
    methods: {
        alert () {
            alert('アラートです')
        }
    }
}
</script>

<style lang="scss" scoped>
@import 'resources/sass/color.scss';

.alert {
    padding: 0 .7rem;
}
</style>

resources/sass/color.scss

$primary-color: #2F353A;
$secondary-color: #3A4248;
~~

resources/sass/app.scss

// Fonts
@import url('https://fonts.googleapis.com/css?family=Nunito');

// Bootstrap
@import '~bootstrap/scss/bootstrap';

@import 'resources/scss/color.scss';

所感

フロントに詳しい人なら当然の事なんでしょうね。。。

サーバーサイドがメインとはいえ、フロントの勉強も怠ってはいけないですね。