4章
Webpackerについて
app/javascript
配下で作業し、ビルド結果をpublic/packs/js
へ出力する。
$ rails webpacker:compile
で明示的なビルドを行う。
app/javascript/packs
配下のJSファイルが、実際にエントリーポイントとなるファイルへビルドされる。
例えば、app/javascript/packs/hello.js
を作成してコンパイルすると、public/packs/js
には以下のようなファイルが生成される。
|
|
<!DOCTYPE html>
<html>
<head>
...
<%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
</head>
...
</html>
javascript_pack_tag
の第一引数でエントリーファイルを指定する。
なので、先程のhello.jsを読み込む場合は、<%= javascript_pack_tag 'hello', 'data-turbolinks-track': 'reload' %>
と書く必要がある。
(まあ実際は大概application.jsでいろいろrequireする)
|
|
p.181 パス | 内容 |
---|---|
app/javascript/packs | エントリーファイルを置く場所 |
app/javascript/ | エントリーファイルから読み込まれるモジュールを置く場所 |
config/webpacker.yml | Webpackerの設定ファイル |
config/webpack/*.js | 最終的なwebpackの設定を出力するファイル |
babel.config.js | babel用の設定ファイル |
.browserlistrc | コンパイル対象となるブラウザ環境を記述するファイル |
CSSや画像もWebpackerで管理する
CSSの場合
例えばapp/javascript/stylesheets/application.css
を読み込む場合、
|
|
|
|
こうすればいい(development環境ではこれがなくても表示されるらしい)。
画像の場合
パスをapp/javascript/images/sample.png
、エントリーポイントをapp/javascript/images/
とするとき
|
|
ビューで画像を表示するときは<%= image_pack_tag("media/images/sample.png") %>
ファイルパスを表示するときは<%= image_tag(assert_pack_path("media/images/sample.png")) %>
Webpackerの拡張
loaderを追加する
$ rails webpacker:install:erb
でrails-erb-loaderパッケージと設定が導入される。
|
|
|
|
|
|
environment.loaders
にはWebpackerが管理しているloaderの設定ファイルが格納されている。
このenvironment変数はmodule.exports = environment
でエクスポートされ、config/webpack/development.js
などの中でenvironment.toWebpackConfig()
とされて最終的なwebpackの設定オブジェクトになる。
|
|
environment.js
に書いたenvironmentファイルはどの環境でもrequireされるので、どの環境でも利用する場合はenvironment.js
に書く。
しかし、開発環境のみで利用するときはdevelopment.js
、本番環境のみのときはproduction.js
に直接記述を書く。
environment.js→環境.js→webpack というイメージ。
|
|
pluginを追加する
ProvidePlugin(明示的なrequireをしなくてもライブラリを参照できるplugin)を利用する。
各ファイルごとにimport $ from 'jquery'
を書くのを省略できる。
$ yarn add jquery
でjQueryを追加。
config/webpack/plugins/provide.js
を作成して、以下のように定義する。
|
|
loaderと同じようにenvironment.js
から呼び出す。
|
|
これによって、requireなしでも$
やjQuery
が使えるようになる。
Sprockets
省略。
Railsに組み込まれているJavaScriptの機能
- rails-ujs
- 画面制御(二重送信の防止)
local: true
によるAjax通信
- Turbolinks
- 画面遷移時にbodyタグのみ切り替える
window.foo
のようにグローバルなオブジェクトにデータを保存すると、データが初期化されない- rails newのときに
--skip-turbolinks
で外すことができる
- Stimulus
- 控えめなフレームワーク