Weback + Bulma cssでRailsプロジェクトを始めてみる
目的
Weback + Bulma css構成でアセットパイプライン周りを理解する
構成:
- バンドラー:Webpack
- アセットパイプライン:Sprockets
- CSSフレームワーク:Bulma CSS
Webpackはバンドラーで、Railsではバンドラーを使うときは jsbundling-rails を入れる必要がある。
また、Bulmaを使うために cssbundling-rails を入れる。WebpackにBulmaもバンドルさせる方法もあるが、より楽に設定したいので cssbundling-rails でいく。
このコマンドを叩く。
rails new webpack-cssbundling-bulma -j webpack -c bulma --skip-action-cable --skip-action-text --skip-action-mailer --skip-action-mailbox --sukip-jbuilder
-
-j
オプション:バンドラーを選ぶ -
-c
オプション:CSSフレームワークを選ぶ - その他のスキップオプションで今回不要なものを外している
初期化されたRailsプロジェクト
package.json
{
"name": "app",
"private": true,
"devDependencies": {
"webpack": "^5.94.0",
"webpack-cli": "^5.1.4"
},
"scripts": {
"build": "webpack --config webpack.config.js",
"build:css": "sass ./app/assets/stylesheets/application.bulma.scss:./app/assets/builds/application.css --no-source-map --load-path=node_modules"
},
"dependencies": {
"@hotwired/stimulus": "^3.2.2",
"@hotwired/turbo-rails": "^8.0.9",
"bulma": "^1.0.2",
"sass": "^1.78.0"
}
}
sass は Bulma の依存として入っている。Hotwire関連はRailsプロジェクトにはデフォルトで入っているので今回は無視する。
sass を使って Bulma がビルドされている。
"build:css": "sass ./app/assets/stylesheets/application.bulma.scss:./app/assets/builds/application.css --no-source-map --load-path=node_modules"
},
./app/assets/stylesheets/application.bulma.scss
にある Bulma ファイルを、/app/assets/builds/application.css
に出力する。
app/assets/stylesheets/application.bulma.scss
を見てみる。
// @charset "utf-8";
// Import a Google Font
// @import url('https://fonts.googleapis.com/css?family=Nunito:400,700');
// Set your brand colors
// $purple: #8A4D76;
// $pink: #FA7C91;
// $brown: #757763;
// $beige-light: #D0D1CD;
// $beige-lighter: #EFF0EB;
// Update Bulma's global variables
// $family-sans-serif: "Nunito", sans-serif;
// $grey-dark: $brown;
// $grey-light: $beige-light;
// $primary: $purple;
// $link: $pink;
// $widescreen-enabled: false;
// $fullhd-enabled: false;
// Update some of Bulma's component variables
// $body-background-color: $beige-lighter;
// $control-border-width: 2px;
// $input-border-color: transparent;
// $input-shadow: none;
// Import only what you need from Bulma
// @import "bulma/sass/utilities/_all.sass";
// @import "bulma/sass/base/_all.sass";
// @import "bulma/sass/elements/button.sass";
// @import "bulma/sass/elements/container.sass";
// @import "bulma/sass/elements/title.sass";
// @import "bulma/sass/form/_all.sass";
// @import "bulma/sass/components/navbar.sass";
// @import "bulma/sass/layout/hero.sass";
// @import "bulma/sass/layout/section.sass";
@import 'bulma/bulma';
色に関する初期設定だったり、Bulma のいろんなコンポーネントをimportできるようになっている。
gemfile はこのようになっている。関係ある箇所のみを掲載する。
# The original asset pipeline for Rails [https://github.com/rails/sprockets-rails]
gem "sprockets-rails"
# Bundle and transpile JavaScript [https://github.com/rails/jsbundling-rails]
gem "jsbundling-rails"
# Bundle and process CSS [https://github.com/rails/cssbundling-rails]
gem "cssbundling-rails"
アセットパイプラインはRails従来のライブラリである Sprockets が入っている。これが/app/assets/builds/
配下にあるアセットファイルを/public
に出力する。
webpack.config.js
を見てみる。
const path = require("path")
const webpack = require("webpack")
module.exports = {
mode: "production",
devtool: "source-map",
entry: {
application: "./app/javascript/application.js"
},
output: {
filename: "[name].js",
sourceMapFilename: "[file].map",
chunkFormat: "module",
path: path.resolve(__dirname, "app/assets/builds"),
},
plugins: [
new webpack.optimize.LimitChunkCountPlugin({
maxChunks: 1
})
]
}
エントリーポイントを./app/javascript/application.js
と設定している。
entry: {
application: "./app/javascript/application.js"
},
output
(出力)に関する設定
output: {
filename: "[name].js",
sourceMapFilename: "[file].map",
chunkFormat: "module",
path: path.resolve(__dirname, "app/assets/builds"),
},
filename
:
バンドルされたファイル名を設定している。ここでは、
entry: {
application: "./app/javascript/application.js"
},
のキー名であるapplication
を取得している。つまり、バンドルして出力されるファイル名はapplication.js
となる。
chunkFormat: "module"
chunkFormat: "module"
は、チャンクをESモジュール形式で生成することを定義している。
path
バンドルしたファイルをどこに出力するか定義している。Railsではデフォルトでapp/assets/builds
に出力する。
path: path.resolve(__dirname, "app/assets/builds"),
__dirname
は、Node.js で使われるグローバル変数で、現在実行中のスクリプトが存在するディレクトリの絶対パスを表す。
つまり、webpack.config.js
までの絶対パスがこんな感じなら、
/Users/kanazawa/dev/rails/webpack-cssbundling-bulma/webpack.config.js
__dirname
は/Users/kanazawa/dev/rails/webpack-cssbundling-bulma/
を表す
app/assets/config/manifest.js
//= link_tree ../images
//= link_tree ../builds
Sprocketsがアセットを管理するためのファイル。Railsのアセットパイプラインで使用されるSprocketsの設定ファイルと言ってもいい。
アセットパイプラインに含めるファイルやディレクトリを指定する。指定されたファイルはRailsアプリの公開ディレクトリである/public/assets
に配置される。
Bulmaはどこでビルドされているのかというと、
package.json
~
"scripts": {
"build": "webpack --config webpack.config.js",
"build:css": "sass ./app/assets/stylesheets/application.bulma.scss:./app/assets/builds/application.css --no-source-map --load-path=node_modules"
},
~
ここで sass を使ってビルドしている。そして/app/assets/builds/application.css
とあるとおり、ビルドされたCSSがこのファイルに書き出される。
そして//= link_tree ../builds
とあるとおり、ビルドされた Bulma CSS は/app/assets/builds/
配下に配置されることによって、アセットパイプラインの流れに組み込まれる。