TechVue.jsJapanese

[ Vue3 ] 新規作成した Vue 3 CLI プロジェクトで Bootstrap 5 を利用する方法

Tech

Web 開発において、 Bootstrap を用いることで見栄えが良く使い勝手の良い UI を、効率よく実装することができるようになります。Vue 2 においては bootstrap-vue を用いることができましたが、 Vue 3 では2021年8月時点で bootstrap-vue を用いると、 Uncaught TypeError: Cannot read property ‘prototype’ of undefined” というエラーが発生し、 UI を表示することができません。色々と情報を探したところ、 Bootstrap 5 を用いることで Vue 3 で Bootstrap を利用することができました。今回は Vue CLI で 新規作成した Vue 3 プロジェクトで Bootstrap 5 を利用する方法をご紹介します。

Vue CLI プロジェクト は、 vue create [ プロジェクト名 ] コマンドを用いて作成したものを想定しています。プロジェクト 作成時にプリセットを選択する場面に遭遇しますが、以下の様に、Vue 3 Preview を選択したものを使っていきます

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
? Please pick a preset:
<span class="hljs-built_in"> Default </span>([Vue 2] babel, eslint)
❯<span class="hljs-built_in"> Default </span>(Vue 3 Preview) ([Vue 3] babel, eslint)
Manually select features
? Please pick a preset: <span class="hljs-built_in"> Default </span>([Vue 2] babel, eslint) ❯<span class="hljs-built_in"> Default </span>(Vue 3 Preview) ([Vue 3] babel, eslint) Manually select features
? Please pick a preset: 
  Default ([Vue 2] babel, eslint) 
❯ Default (Vue 3 Preview) ([Vue 3] babel, eslint) 
  Manually select features

Bootstrap 5 の利用

こちらの記事を参考にしたところ Vue 3 で Bootstrap を利用するには Bootstrap 5 を用いることが簡潔であることがわかりました。 Bootstrap 5 では jQuery を必要としていないため、 以前は jQuery もあわせて導入する必要がありましたがこの手間がなくなることになりますので、よりシンプルに Bootstrap を使うことができます。

Bootstrap 5 のインストール

Bootstrap 5 は以下のコマンドを用いて インストール します。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
% npm install --<span class="hljs-keyword">save</span> <span class="hljs-keyword">bootstrap</span>
% npm install --<span class="hljs-keyword">save</span> <span class="hljs-keyword">bootstrap</span>
% npm install --save bootstrap

インストール 後、package.json に以下のように dependencies に bootstrap が追加されます。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<span class="hljs-comment">"dependencies"</span>: {
<span class="hljs-comment">"bootstrap"</span>: <span class="hljs-comment">"^5.1.0"</span>,
<span class="hljs-comment">"core-js"</span>: <span class="hljs-comment">"^3.6.5"</span>,
<span class="hljs-comment">"vue"</span>: <span class="hljs-comment">"^3.0.0"</span>
},
<span class="hljs-comment">"dependencies"</span>: { <span class="hljs-comment">"bootstrap"</span>: <span class="hljs-comment">"^5.1.0"</span>, <span class="hljs-comment">"core-js"</span>: <span class="hljs-comment">"^3.6.5"</span>, <span class="hljs-comment">"vue"</span>: <span class="hljs-comment">"^3.0.0"</span> },
 "dependencies": {
   "bootstrap": "^5.1.0",
   "core-js": "^3.6.5",
   "vue": "^3.0.0"
 },

Bootstrap Button の実装

Bootstrap 適用前の コード

main.js

こちらは、 Vue CLI プロジェクト を作成した状態のままです。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<span class="hljs-keyword">import</span> { createApp } <span class="hljs-keyword">from</span> <span class="hljs-string">'vue'</span>
<span class="hljs-keyword">import</span> App <span class="hljs-keyword">from</span> <span class="hljs-string">'./App.vue'</span>
createApp(App).mount(<span class="hljs-string">'#app'</span>)
<span class="hljs-keyword">import</span> { createApp } <span class="hljs-keyword">from</span> <span class="hljs-string">'vue'</span> <span class="hljs-keyword">import</span> App <span class="hljs-keyword">from</span> <span class="hljs-string">'./App.vue'</span> createApp(App).mount(<span class="hljs-string">'#app'</span>)
import { createApp } from 'vue'
import App from './App.vue'
 
createApp(App).mount('#app')

App.vue

Vue CLI プロジェクト 作成時からは、今回表示テスト用に作成する、 BootstrapTest.vue を インポート するように変更しています。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<span class="hljs-variable"><template></span>
<span class="hljs-variable"><div></span>
<span class="hljs-variable"><BootstrapTest /></span>
<span class="hljs-variable"></div></span>
<span class="hljs-variable"></template></span>
<span class="hljs-variable"><template></span> <span class="hljs-variable"><div></span> <span class="hljs-variable"><BootstrapTest /></span> <span class="hljs-variable"></div></span> <span class="hljs-variable"></template></span>
<template>
 <div>
   <BootstrapTest />
 </div>
</template>
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<span class="xml"><span class="hljs-tag"><<span class="hljs-name">script</span>></span><span class="javascript">
<span class="hljs-keyword">import</span> BootstrapTest <span class="hljs-keyword">from</span> <span class="hljs-string">'./components/BootstrapTest.vue'</span>
<span class="hljs-keyword">export</span> <span class="hljs-keyword">default</span> </span></span><span class="xquery">{
<span class="hljs-built_in"> name</span>: <span class="hljs-string">'App'</span>,
components: {
BootstrapTest
}</span><span class="xml">
}
<span class="hljs-tag"></<span class="hljs-name">script</span>></span></span>
<span class="xml"><span class="hljs-tag"><<span class="hljs-name">script</span>></span><span class="javascript"> <span class="hljs-keyword">import</span> BootstrapTest <span class="hljs-keyword">from</span> <span class="hljs-string">'./components/BootstrapTest.vue'</span> <span class="hljs-keyword">export</span> <span class="hljs-keyword">default</span> </span></span><span class="xquery">{ <span class="hljs-built_in"> name</span>: <span class="hljs-string">'App'</span>, components: { BootstrapTest }</span><span class="xml"> } <span class="hljs-tag"></<span class="hljs-name">script</span>></span></span>
<script>
import BootstrapTest from './components/BootstrapTest.vue'
 
export default {
 name: 'App',
 components: {
   BootstrapTest
 }
}
</script>
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<span class="hljs-tag"><<span class="hljs-name">style</span>></span><span class="css">
<span class="hljs-selector-id">#app</span> {
<span class="hljs-attribute">font-family</span>: Avenir, Helvetica, Arial, sans-serif;
<span class="hljs-attribute">-webkit-font-smoothing</span>: antialiased;
<span class="hljs-attribute">-moz-osx-font-smoothing</span>: grayscale;
<span class="hljs-attribute">text-align</span>: center;
<span class="hljs-attribute">color</span>: <span class="hljs-number">#2c3e50</span>;
<span class="hljs-attribute">margin-top</span>: <span class="hljs-number">60px</span>;
}
</span><span class="hljs-tag"></<span class="hljs-name">style</span>></span>
<span class="hljs-tag"><<span class="hljs-name">style</span>></span><span class="css"> <span class="hljs-selector-id">#app</span> { <span class="hljs-attribute">font-family</span>: Avenir, Helvetica, Arial, sans-serif; <span class="hljs-attribute">-webkit-font-smoothing</span>: antialiased; <span class="hljs-attribute">-moz-osx-font-smoothing</span>: grayscale; <span class="hljs-attribute">text-align</span>: center; <span class="hljs-attribute">color</span>: <span class="hljs-number">#2c3e50</span>; <span class="hljs-attribute">margin-top</span>: <span class="hljs-number">60px</span>; } </span><span class="hljs-tag"></<span class="hljs-name">style</span>></span>
<style>
#app {
 font-family: Avenir, Helvetica, Arial, sans-serif;
 -webkit-font-smoothing: antialiased;
 -moz-osx-font-smoothing: grayscale;
 text-align: center;
 color: #2c3e50;
 margin-top: 60px;
}
</style>

BootstrapTest.vue

以下の内容で、 src – components 配下に保存します。 Bootstrap の ボタン として使用するため、type, class を Bootstrap のもので指定しています。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<template>
<div>
<span class="hljs-type">Bootstrap</span> <span class="hljs-type">Test</span>
<br>
<button <span class="hljs-class"><span class="hljs-keyword">type</span></span>=<span class="hljs-string">"button"</span> <span class="hljs-class"><span class="hljs-keyword">class</span></span>=<span class="hljs-string">"btn btn-success"</span>><span class="hljs-type">Success</span></button>
<button <span class="hljs-class"><span class="hljs-keyword">type</span></span>=<span class="hljs-string">"button"</span> <span class="hljs-class"><span class="hljs-keyword">class</span></span>=<span class="hljs-string">"btn btn-danger"</span>><span class="hljs-type">Danger</span></button>
<button <span class="hljs-class"><span class="hljs-keyword">type</span></span>=<span class="hljs-string">"button"</span> <span class="hljs-class"><span class="hljs-keyword">class</span></span>=<span class="hljs-string">"btn btn-warning"</span>><span class="hljs-type">Warning</span></button>
</div>
</template>
<template> <div> <span class="hljs-type">Bootstrap</span> <span class="hljs-type">Test</span> <br> <button <span class="hljs-class"><span class="hljs-keyword">type</span></span>=<span class="hljs-string">"button"</span> <span class="hljs-class"><span class="hljs-keyword">class</span></span>=<span class="hljs-string">"btn btn-success"</span>><span class="hljs-type">Success</span></button> <button <span class="hljs-class"><span class="hljs-keyword">type</span></span>=<span class="hljs-string">"button"</span> <span class="hljs-class"><span class="hljs-keyword">class</span></span>=<span class="hljs-string">"btn btn-danger"</span>><span class="hljs-type">Danger</span></button> <button <span class="hljs-class"><span class="hljs-keyword">type</span></span>=<span class="hljs-string">"button"</span> <span class="hljs-class"><span class="hljs-keyword">class</span></span>=<span class="hljs-string">"btn btn-warning"</span>><span class="hljs-type">Warning</span></button> </div> </template>
<template>
 <div>
   Bootstrap Test
   <br>
   <button type="button" class="btn btn-success">Success</button>
   <button type="button" class="btn btn-danger">Danger</button>
   <button type="button" class="btn btn-warning">Warning</button>
 </div>
</template>

これらの ファイル を用意した後、 npm run serve で起動してみます。すると、以下の画像のような UI が表示されます。これが Bootstrap 5 適用前の状態になります。

Bootstrap 5 適用後のコード

この UI に Bootstrap を適用するには、 main.js に以下を追記します。

main.js

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<span class="hljs-keyword">import</span> { createApp } <span class="hljs-keyword">from</span> <span class="hljs-string">'vue'</span>
<span class="hljs-keyword">import</span> App <span class="hljs-keyword">from</span> <span class="hljs-string">'./App.vue'</span>
<span class="hljs-keyword">import</span> <span class="hljs-string">"bootstrap/dist/css/bootstrap.min.css"</span>
createApp(App).mount(<span class="hljs-string">'#app'</span>)
<span class="hljs-keyword">import</span> { createApp } <span class="hljs-keyword">from</span> <span class="hljs-string">'vue'</span> <span class="hljs-keyword">import</span> App <span class="hljs-keyword">from</span> <span class="hljs-string">'./App.vue'</span> <span class="hljs-keyword">import</span> <span class="hljs-string">"bootstrap/dist/css/bootstrap.min.css"</span> createApp(App).mount(<span class="hljs-string">'#app'</span>)
import { createApp } from 'vue'
import App from './App.vue'
 
import "bootstrap/dist/css/bootstrap.min.css"
 
createApp(App).mount('#app')

上記修正をした後に、改めて npm run serve すると、以下の画像のような UI が表示されます。これが Bootstrap 5 適用後の状態となります。


Table の実装確認

Table に関しても、 Bootstrap 5 公式ドキュメントのサンプルコードを使って以下のように表示確認することができました。

Hoverable 動作も問題なさそうです。


まとめ

今回は、 Vue CLI を使って Vue 3 プロジェクト を新規作成した場合に Bootstrap を利用する方法を紹介しました。既存の Vue 2 プロジェクト を Vue 3 に移行する場合などは今回のように シンプル にはいかないかもしれませんが、新規で Vue 3 プロジェクトを作成する場合などは、参考にしてみてください。

  • Vue CLI で Vue 3 プロジェクト を作成
  • Vue 3 で Bootstrap を利用する場合は bootstrap-vue ではなく Bootstrap 5 を利用する
  • main.js で bootstrap.min.css をインポートする

関連記事

Ads