Angular5 で Bootstrap4 ( beta ) を使ってみよう
Angular で Bootstrap を使う機会があったので手順を記録します。Angular は 2017年11月11日にバージョン5.0.0がでました。Bootstrapは 2017年12月19日時点で v4.0.0-beta.2 が利用できます。
利用ツール | バージョン |
---|---|
Angular | 5.1.1 |
Bootstrap | 4.0.0-beta.2 |
angular-cli | 1.6.1 |
Angular5 の導入
最新版の angular-cli を使ってプロジェクトを作ることで Angular5 が利用できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | npm install -g @angular /cli @latest ng new angular-bootstrap cd angular-bootstrap ng version Angular CLI: 1.6.1 Node: 8.5.0 OS: darwin x64 Angular: 5.1.1 ... animations, common, compiler, compiler-cli, core, forms ... http, language-service, platform-browser ... platform-browser-dynamic, router @angular /cli : 1.6.1 @angular-devkit /build-optimizer : 0.0.36 @angular-devkit /core : 0.0.22 @angular-devkit /schematics : 0.0.42 @ngtools /json-schema : 1.1.0 @ngtools /webpack : 1.9.1 @schematics /angular : 0.1.11 @schematics /schematics : 0.0.11 typescript: 2.4.2 webpack: 3.10.0 |
Bootstrap4 の導入
Angular で Bootstrap を使う方法はいくつかありますが、今回は npm を使ってインストールした場合の導入方法を説明します。まずは npm でインストールしましょう。また、Bootstrap4 を使うにあたり必要になるスクリプトも一緒に導入します。
1 2 | npm install --save bootstrap@4.0.0-beta.2 npm install --save jquery popper.js |
Angular では、グローバルに読み込むCSSやスクリプトを .angular-cli.json
で指定できます。Bootstrap公式サイトの導入を見ながら、必要なCSS、JSのパスを指定することで読み込ませます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | { "$schema" : "./node_modules/@angular/cli/lib/config/schema.json" , "project" : { "name" : "angular-bootstrap" }, "apps" : [ { "root" : "src" , "outDir" : "dist" , "assets" : [ "assets" , "favicon.ico" ], "index" : "index.html" , "main" : "main.ts" , "polyfills" : "polyfills.ts" , "test" : "test.ts" , "tsconfig" : "tsconfig.app.json" , "testTsconfig" : "tsconfig.spec.json" , "prefix" : "app" , "styles" : [ "styles.css" , "../node_modules/bootstrap/dist/css/bootstrap.min.css" ], "scripts" : [ "../node_modules/jquery/dist/jquery.slim.min.js" , "../node_modules/popper.js/dist/umd/popper.min.js" , "../node_modules/bootstrap/dist/js/bootstrap.min.js" ], "environmentSource" : "environments/environment.ts" , "environments" : { "dev" : "environments/environment.ts" , "prod" : "environments/environment.prod.ts" } } ], "e2e" : { "protractor" : { "config" : "./protractor.conf.js" } }, "lint" : [ { "project" : "src/tsconfig.app.json" , "exclude" : "**/node_modules/**" }, { "project" : "src/tsconfig.spec.json" , "exclude" : "**/node_modules/**" }, { "project" : "e2e/tsconfig.e2e.json" , "exclude" : "**/node_modules/**" } ], "test" : { "karma" : { "config" : "./karma.conf.js" } }, "defaults" : { "styleExt" : "css" , "component" : {} } } |
これだけで使える状態になります。コンポーネントを作って Bootstrap の class を指定してみましょう。
1 | ng g component card-ui |
1 2 3 4 5 6 7 8 | < div class = "card" style = "width: 20rem;" > < img class = "card-img-top" src = "/assets/img_318_180.svg" alt = "Card image cap" > < div class = "card-body" > < h4 class = "card-title" >Card title</ h4 > < p class = "card-text" >Some quick example text to build on the card title and make up the bulk of the card's content.</ p > < a href = "#" class = "btn btn-primary" >Go somewhere</ a > </ div > </ div > |
1 2 | <!--The content below is only a placeholder and can be replaced.--> < app-card-ui ></ app-card-ui > |
1 | ng serve |
その後、http://localhost:4200
にアクセスします。
Bootstrap4 の Card UI が表示されていることがわかります。新しく作成したコンポーネントにも、Bootstrap のCSSが効いていることがわかりました。ただ、気になるエラーが出ていますね。
1 2 | Failed to load resource: the server responded with a status of 404 (Not Found) |
どうやらソースマップを読み込もうとして失敗しているようです。npm経由で取得した Bootstrap の Javascript は、(おそらくデバッグのための)ソースマップへのリンクが記載されいてます。npm モジュールとして require('bootstrap')
のような形で使う場合は問題になりませんが、今回のようにピンポイントで Javascript のパスだけ指定しているような場合は関連する asset へのパスを見失うことがあります。解決策として、 .angular-cli.json にソースマップの場所を教えてやればOKです。jquery, popper.js も同様でしたので同じようにソースマップを追加しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | ...前略... { ... "apps" : [ { "root" : "src" , "outDir" : "dist" , "assets" : [ "assets" , "favicon.ico" , { "glob" : "jquery.slim.min.js.map" , "input" : "../node_modules/jquery/dist/" , "output" : "./" }, { "glob" : "popper.min.js.map" , "input" : "../node_modules/popper.js/dist/umd/" , "output" : "./" }, { "glob" : "bootstrap.min.js.map" , "input" : "../node_modules/bootstrap/dist/js/" , "output" : "./" } ], ... } ] } ...後略... |
これで、デバッグコンソールでみたときにエラーはでなくなりました。ただしこの方法は、おそらく本番環境用ビルド ng build --prod
でビルドした場合も asset ファイルとして成果物に含まれることになると思います。やや成果物を肥大化させてしまうことになります。
Bootstrap4 の Card UI を試す
このタイプのUI、とくにECサイトや、最近ではニュースサイトでも見かけますね。Bootstrap で手軽に実装できるようになったのは嬉しいポイントです。いくつか試してみます。
Card groups
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | < div class = "container-fluid" > < div class = "card-group" > < div class = "card" > < img class = "card-img-top" src = "/assets/019Yamasha1218_TP_V.jpg" alt = "Card image cap" > < div class = "card-body" > < h4 class = "card-title" >蓼科山山頂から望む厳冬期八ヶ岳連峰</ h4 > < p class = "card-text" >山頂はとても寒いです。2500メートルを超える高さを誇り、頂上からの長めは絶景です。</ p > < p class = "card-text" > < small class = "text-muted" >Last updated 3 mins ago</ small > </ p > </ div > </ div > < div class = "card" > < img class = "card-img-top" src = "/assets/gunma-IMG_6125_TP_V.jpg" alt = "Card image cap" > < div class = "card-body" > < h4 class = "card-title" >毛無峠から破風岳のルート</ h4 > < p class = "card-text" >近辺での硫黄採掘が始まり、精錬時に発生する亜硫酸ガスによって裸山になってしまいました。鉱山跡は観光スポットにもなっています。</ p > < p class = "card-text" > < small class = "text-muted" >Last updated 5 days ago</ small > </ p > </ div > </ div > < div class = "card" > < img class = "card-img-top" src = "/assets/1711163AMEMAN005_TP_V.jpg" alt = "Card image cap" > < div class = "card-body" > < h4 class = "card-title" >八幡平の紅葉渓谷</ h4 > < p class = "card-text" >岩手県の紅葉名所。松川温泉もあり特に秋は絶好の観光スポットです。</ p > < p class = "card-text" > < small class = "text-muted" >Last updated 10 days ago</ small > </ p > </ div > </ div > </ div > </ div > |
Image overlays
1 2 3 4 5 6 7 | < div class = "card bg-dark text-white" > < img class = "card-img" src = "/assets/gunma-IMG_6125_TP_V.jpg" alt = "Card image" > < div class = "card-img-overlay" > < h4 class = "card-title" >毛無峠から破風岳のルート</ h4 > < p class = "card-text" >近辺での硫黄採掘が始まり、精錬時に発生する亜硫酸ガスによって裸山になってしまいました。鉱山跡は観光スポットにもなっています。</ p > </ div > </ div > |
Header and footer
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | < div class = "card text-center" > < div class = "card-header" > ピザ&ワインからのお知らせ </ div > < div class = "card-body" > < h4 class = "card-title" >白ワインのセットご注文で5%OFF!</ h4 > < img class = "card-img" src = "/assets/tachiaraiIMGL4852_TP_V.jpg" alt = "Card image" > < p class = "card-text" >週末のパーティにいかがですか?</ p > < a href = "#" class = "btn btn-primary" >購入ページへ行く</ a > </ div > < div class = "card-footer text-muted" > 2 days ago </ div > </ div > |
まとめ
Angular で Bootstrap を利用する一例を紹介しました。Angular の考え方としてコンポーネント指向がベースとなっており、コンポーネントを組み合わせて画面を構成していくことになると思います。Bootstrap のように、全コンポーネントでCSSを利用したいといったシーンで、 .angular-cli.json
への設定を追加することがわかれば、いろいろと応用できますね。Bootstrap は新しく追加された Card UI を始め、コンポーネントの見た目を手早く整えてくれるのでSPAを作る際などはかなり重宝することになるでしょう。Bootstrap を利用する際の参考になれば幸いです。