Closed Yukimarupie closed 3 years ago
となったところで、その状況を別のメンターさんに相談したところ、
と教えていただいた。
なるほど。 一応自分でも色々調べてみたが、やはりDRYな実装を諦めるが一番簡単な手な気がしたので、さくっと今回は諦めることにした。
と思ったが、やはりwebpackを環境にインストールしないことには、login.js以外のファイルが読み込まれないことが発覚した。 app/javascript/packs配下に、何も書いてないtest.jsを作成&new.html.erbで読み込んだが、 全く同様のエラーがでた。
Webpacker can't find letters/test.js in /app/public/packs/manifest.json. Possible causes:
1. You want to set webpacker.yml value of compile to true for your environment
unless you are using the `webpack -w` or the webpack-dev-server.
2. webpack has not yet re-run to reflect updates.
3. You have misconfigured Webpacker's config/webpacker.yml file.
4. Your webpack configuration is not creating a manifest.
Your manifest contains:
{
"application.js": "/packs/js/application-e0b08808587a244fccb3.js",
"application.js.map": "/packs/js/application-e0b08808587a244fccb3.js.map",
"entrypoints": {
"application": {
"js": [
"/packs/js/application-e0b08808587a244fccb3.js"
],
"js.map": [
"/packs/js/application-e0b08808587a244fccb3.js.map"
]
},
"letters/login": {
"js": [
"/packs/js/letters/login-12426d3f343bb4c84251.js"
],
"js.map": [
"/packs/js/letters/login-12426d3f343bb4c84251.js.map"
]
}
},
"letters/login.js": "/packs/js/letters/login-12426d3f343bb4c84251.js",
"letters/login.js.map": "/packs/js/letters/login-12426d3f343bb4c84251.js.map"
ここで、acks/letters配下にあるからダメなのではと思い、packs配下にnotletters.jsを作成し、パスを繋いでみたが、やはりエラー内容は変わらなかった。
DRYな実装を諦めたら、webpackに対応しなくていいかと思ったが、 これはちょっとwebpackの環境作らないと、今後新規JS作れないみたい... LIFF_IDを環境変数で呼び出すために、config/webpack/environments.jsの設定をいじったのも原因かもしれない。
ということで、 自分で頑張ってみる。
とりあえずエラー文的は、webpacker.ymlのコンパイルの値をtrueにしないとダメ。
それかwebpack -w
か the webpack-dev-server.を使え。
と言われている。
config/配下にあるwebpacker.ymlを確認する。
development:
<<: *default
compile: true
developmentもtestも既にconpile: true
になってる...
productionのみfalseになっている..
production:
<<: *default
# Production depends on precompilation of packs prior to booting for performance.
compile: false
開発環境で怒られているのだが、なぜtrueになっているのにダメなんだろうか..
webpackについてはほんわりとしか理解していなかったんだけれども、 ちゃんと勉強しないとダメだな。。
役割については以下サイトが一番わかりやすい気がしたので引用する↓
https://ics.media/entry/12140/
webpackとはウェブコンテンツを構成するファイルをまとめてしまうツールです。一番多い使い方は、複数のJavaScriptを1つにまとめることでしょう。複数のJavaScriptをまとめるのは、いろんな利点があります。
複数JSをまとめられるメリット①転送の最適化 複数JSをまとめられるメリット②モジュールが使える 複数JSをまとめられるメリット③JSだけでなく、CSSや画像もバンドルできる 複数JSをまとめられるメリット④包括的な開発環境が整う
HTTP/1.1接続ではブラウザとウェブサーバーの同時接続数が限られるため、複数のファイルの転送に時間がかかります。複数のJSファイルを1つにまとめてしまうことが一般的な解決案として知られている。=> サイトの高速化に役立つ
まぁこれはやろうとしてたこと。 複数のJSファイルを1つにまとめるだけなら他のツールでもできますが、webpackの場合は標準仕様のES Modulesが使えたり、node_modulesのモジュールを結合できるといったメリットがあります。
標準のES Modulesを使うと変数の競合やグローバル汚染を防げるので開発時の安全性が高まります。さらには、コードの可読性が上がり、開発作業の分担やテストがしやすくなり、再利用性や保守性があがります。
webpackはJavaScriptだけでなくスタイルシートや画像までもバンドルできてしまうのです。先述の転送の最適化につながるメリット
JSファイルの圧縮やソースマップに対応していたり、ローカルサーバーの起動まで包括的な制作環境としての機能まであります。タスクランナーのGulpやnpm scriptsだけでは、ツールの組み合わせが無限。「オレが数々の案件で作り込んだ秘伝のタレ」のように、設定ファイルが煩雑化しがちです。webpackであれば、はじめから最後までwebpack一式でツールを揃えられます。このあたりが、イマドキのフロントエンドエンジニアのツールと言われる所以ゆえんです。
webpackを導入しておけばフロントエンドエンジニアに必要な技術がひととおり揃う、ということが最大の利点でしょう。
うん、大体理解できた。 とりあえず諸々面倒臭いことをやってくれてサイトの高速化に役立つし、開発に便利やでって感じですよね。 Gulpなどのタスクランナーでできることは大抵webpackで代替できるらしい。
ただこれ、だいぶ前に他のフロントエンジニアの方に聞いた時、 Gulpもwebpackも別に使う必要ないよーーって言われたような気がしたから、 正直放置してた問題である。
ここに時間取られたくないなーーと思いつつ、 もう少しだけ調査を進める。
調べていて少し気になったのでメモとして残す。 webpackとgemのwebpackerだと、少し違うらしい。 勉強しなければならないことが増えるとか。
引用元: Steb by Step で剥がす Webpacker
Webpackerを使っている Rails アプリからWebpackerを剥がし、webpackを使うようにするための手順を書いていく。
Webpackerを止めたい理由は様々だが、主な理由は以下のような感じだろうか。
・現時点ではWebpackerが使用しているwebpackのバージョンは3.xで、最新バージョンに追従できていない ・webpackの設定の他に、「Webpackerの設定」について学ばなければならず、無駄が多い ・webpackを直接触れば済む話を、常にWebpackerという仲介者を通して作業しなければならない ・カスタマイズやマイグレーションの際に、考慮しなければならない要素が増えてしまう
手軽にフロントエンド開発環境を導入できる、というのがWebpackerの利点であり、カスタマイズやらアップデートやらが必要になってしまうのならあまりメリットはない、と個人的には感じている。
以下のサイトは英語だが、結構 source_pathとか、source_entry_pathの設定方法について、詳しく書かれている。
引用元: Understanding webpacker.yml
The webpacker.yml config file does not work with ERB as is typical with other Rails YAML config files, since the file must also be read in JavaScript. This may come as a surprise as indicated by recent issues, e.g. #1615, #956. One possible workaround is to use one of the supported ENV var overrides. It may also be an option to manipulate the JavaScript config in one of the config/webpack JavaScript files—look for a future post on the subject.
・現在のdocker-compose.ymlではwebpackの環境できてないから、それなのにモジュール読み込むES6の書き方をしようとしてるのが原因ではないか ・webpack-dev-serverコマンドは詰まっちゃうだろうからwebpack serveとかの手動コンパイルをしてみるか、もしくはDRYな書き方を諦めるのも手
調べても調べてもようわからんーー ebpack-dev-serverがオワコンになってたのでwebpack-serveに置換えたらwebpack-serveがオワコンになってwebpack-dev-serverが復活した
とりあえずもしdocker-compose.ymlの設定書き直してビルドしなおせばいいならそれがいい。
ただのめも
RAILS_ENV=production bundle exec rails webpacker:compile
https://bityl.co/6gsfより
なんていうか問題の切り分けができない。
https://qiita.com/naokit-dev/items/99225bf3d8665ecfdec2
後これは今の問題と直接関係ないけど
bundle installの-j4オプションでbundle installが高速化
ができる、不要ファイルの削除とイメージの軽量化のため"alpine"を使用するとコンテナの軽量化ができるっぽい。軽量化してどうすんのって感じだけど。
# 不要ファイル削除
RUN rm -rf /usr/local/bundle/cache/* /usr/local/share/.cache/* /var/cache/* /tmp/* && \
apk del build-packs
``
ようさんとzoomしてやったこと記録
% docker container exec -it project_file_web_1 bash でdockerコンテナの中入る、
% docker container exec -it bash
"docker container exec" requires at least 2 arguments. See 'docker container exec --help'.
Usage: docker container exec [OPTIONS] CONTAINER COMMAND [ARG...]
project_file_db_1 docker-entrypoint.sh --def ... Up 0.0.0.0:3307->3306/tcp, 33060/tcp
project_file_web_1 entrypoint.sh bash -c rm - ... Up 0.0.0.0:3000->3000/tcp
yk_h@YukinoMacBook-Pro project_file % docker container exec -it project_file_web_1 bash
root@b8c0e7dd0f3c:/app# yarn -v 1.22.5 root@b8c0e7dd0f3c:/app# bin/webpack /app/node_modules/webpack-cli/bin/cli.js:93 throw err; ^
Error: Cannot find module 'dotenv'
at Function.Module._resolveFilename (internal/modules/cjs/loader.js:636:15)
at Function.Module._load (internal/modules/cjs/loader.js:562:25)
at Module.require (internal/modules/cjs/loader.js:692:17)
at require (/app/node_modules/v8-compile-cache/v8-compile-cache.js:159:20)
at Object.
なぜgemでdotenvが入ってるのにこのエラーが出るの?
/app/node_modules/webpack-cli/bin/cli.js:93
node_modulesはJSのライブラリを管理するやつ。 JSのライブラリの中にdotenvがないよと言われているので、gemとは無関係。
スタックとレースの読み方は下からがスタート なので、docker環境にdotenvをインストールする。。
root@b8c0e7dd0f3c:/app# yarn add dotenv
yarn add v1.22.5
[1/4] Resolving packages...
[2/4] Fetching packages...
info fsevents@2.3.2: The platform "linux" is incompatible with this module.
info "fsevents@2.3.2" is an optional dependency and failed compatibility check. Excluding it from installation.
info fsevents@1.2.13: The platform "linux" is incompatible with this module.
info "fsevents@1.2.13" is an optional dependency and failed compatibility check. Excluding it from installation.
[3/4] Linking dependencies...
warning " > webpack-dev-server@3.11.2" has unmet peer dependency "webpack@^4.0.0 || ^5.0.0".
warning "webpack-dev-server > webpack-dev-middleware@3.7.3" has unmet peer dependency "webpack@^4.0.0 || ^5.0.0".
[4/4] Building fresh packages...
success Saved lockfile.
success Saved 1 new dependency.
info Direct dependencies
└─ dotenv@8.4.0
info All dependencies
└─ dotenv@8.4.0
Done in 35.10s.
root@b8c0e7dd0f3c:/app# bin/webpack
Hash: 5529ff341b36c0fb3723
Version: webpack 4.46.0
Time: 1652ms
Built at: 05/05/2021 1:05:21 PM
Asset Size Chunks Chunk Names
js/application-e0b08808587a244fccb3.js 71.4 KiB application [emitted] [immutable] application
js/application-e0b08808587a244fccb3.js.map 80 KiB application [emitted] [dev] application
js/letters/login-7fcf20257e521d388cce.js 6.01 KiB letters/login [emitted] [immutable] letters/login
js/letters/login-7fcf20257e521d388cce.js.map 6.06 KiB letters/login [emitted] [dev] letters/login
js/notletters-f9fe5a9170626939700d.js 3.89 KiB notletters [emitted] [immutable] notletters
js/notletters-f9fe5a9170626939700d.js.map 3.52 KiB notletters [emitted] [dev] notletters
manifest.json 1.02 KiB [emitted]
Entrypoint application = js/application-e0b08808587a244fccb3.js js/application-e0b08808587a244fccb3.js.map
Entrypoint letters/login = js/letters/login-7fcf20257e521d388cce.js js/letters/login-7fcf20257e521d388cce.js.map
Entrypoint notletters = js/notletters-f9fe5a9170626939700d.js js/notletters-f9fe5a9170626939700d.js.map
[./app/javascript/channels sync recursive _channel.js$] ./app/javascript/channels sync _channel.js$ 160 bytes {application} [built]
[./app/javascript/channels/index.js] 211 bytes {application} [built]
[./app/javascript/packs/application.js] 435 bytes {application} [built]
[./app/javascript/packs/letters/login.js] 2.11 KiB {letters/login} [built]
[./app/javascript/packs/notletters.js] 0 bytes {notletters} [built]
[./node_modules/webpack/buildin/module.js] (webpack)/buildin/module.js 552 bytes {application} [built]
が、変わらん
手動コンパイルはdockerの中入ってbin/railsコマンド叩けばできる!
% docker container exec -it project_file_web_1 bash
root@00ebb999755e:/app# bin/webpack
Hash: b9ba2098ed66676189f8
Version: webpack 4.46.0
Time: 1481ms
Built at: 05/05/2021 1:18:09 PM
Asset Size Chunks Chunk Names
js/application-e0b08808587a244fccb3.js 71.4 KiB application [emitted] [immutable] application
js/application-e0b08808587a244fccb3.js.map 80 KiB application [emitted] [dev] application
js/letters/login-7fcf20257e521d388cce.js 6.01 KiB letters/login [emitted] [immutable] letters/login
js/letters/login-7fcf20257e521d388cce.js.map 6.06 KiB letters/login [emitted] [dev] letters/login
js/letters/notletters-35eb071fce92e8568b83.js 3.93 KiB letters/notletters [emitted] [immutable] letters/notletters
js/letters/notletters-35eb071fce92e8568b83.js.map 3.54 KiB letters/notletters [emitted] [dev] letters/notletters
manifest.json 1.08 KiB [emitted]
Entrypoint application = js/application-e0b08808587a244fccb3.js js/application-e0b08808587a244fccb3.js.map
Entrypoint letters/login = js/letters/login-7fcf20257e521d388cce.js js/letters/login-7fcf20257e521d388cce.js.map
Entrypoint letters/notletters = js/letters/notletters-35eb071fce92e8568b83.js js/letters/notletters-35eb071fce92e8568b83.js.map
[./app/javascript/channels sync recursive _channel.js$] ./app/javascript/channels sync _channel.js$ 160 bytes {application} [built]
[./app/javascript/channels/index.js] 211 bytes {application} [built]
[./app/javascript/packs/application.js] 435 bytes {application} [built]
[./app/javascript/packs/letters/login.js] 2.11 KiB {letters/login} [built]
[./app/javascript/packs/letters/notletters.js] 0 bytes {letters/notletters} [built]
[./node_modules/webpack/buildin/module.js] (webpack)/buildin/module.js 552 bytes {application} [built]
Dockerfileをいじっておく。 docker消すとまたyarn add dotenvしないといけないので
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \ echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \ apt-get update -qq && \ apt-get install -y --no-install-recommends \ build-essential \ nodejs \ yarn && \ yarn add dotenv && \
そもそもなぜローカルにRailsをインストールすると汚れるのか
このバージョンでやってるつもりだったけど、 実際は違うバージョンでやってた!みたいなことを防止するため。
これでrbenvでインストールできるバージョン % rbenv install -l 2.6.7 2.7.3 3.0.1 jruby-9.2.17.0 mruby-3.0.0 rbx-5.0 truffleruby-21.1.0 truffleruby+graalvm-21.1.0
Only latest stable releases for each Ruby implementation are shown. Use 'rbenv install --list-all / -L' to show all local versions.
今ローカルにあるバージョン yk_h@YukinoMacBook-Pro project_file % rbenv versions system 3.0.0
↓でデフォルトのバージョン切り換え % rbenv global 3.0.1
切り替えができたのでgem install rails 6.1.3.1
でインストール
今回はrailsっていう頻繁に使うgemなので、ローカルにインストールしてもおk。
Macのライブラリをいい感じに管理してくれるやつ
Rubyのバージョン管理してくれるやつ
Rubyのライブラリを管理してくれるgem
gemfileに書いたものをもとに、そのプロジェクトに必要なライブラリを依存関係などを考慮していい感じに入れてくれる
rails --versionで出ない。
An error occurred while installing mysql2 (0.5.3), and Bundler cannot
continue.
Make sure that gem install mysql2 -v '0.5.3' --source 'https://rubygems.org/'
succeeds before bundling.
Vueを使うメリット
・jQueryとかでDOMを操作するとブラウザが重くなりがち ・それほどDOMをいじらなくていいならjQueryでいいよね。 ・でもやっぱりアニメーションとかでDOM操作するならVueとかReact使った方がいいよねという話
dockerのメリット
Dockerにバージョンとかを書いてれば、 そのバージョンと全く同じrailsにローカルにインストールして、 rails db:create=> db:migrateすれば、 Dockerコンテナ上で動かしていたアプリがローカルでも動かせるようになるよ。
もし、login.jsを全コメントアウトしても認証が走る事態が起きたら、
対処法1 dockerコンテナに入って、vimかcatで対象ファイル(new.html)を見てみて、本当にその差分が反映されてるか見てみる
・dockerコンテナに入って、bin/webpackコマンドを叩いて、ビルド
・ローカルでbin/webpack
でビルド
herokuにpushした後、db:migrateしたらエラー解消するよ
JSのデバック方法
逐次console.log(変数);を入れ込み、どの時点でどの変数はきちんと取得できているのかブラウザの検証ツールで検証する
LIFFのメソッドを使用する際、ほぼ確実にliff.initとliff.login();のコードが必要になる。 なので、よりDRYな実装をするため、必須のJS処理をモジュール化し、必要に応じて読み込む形を取りたかった。 が、過程で以下のようなことが起こり、結論、現在の開発環境・私の能力を考慮見て、DRYな実装を諦めることにした。
①LIFFログイン&ユーザー情報取得の為のモジュールをexportするためのmodule_test.jsを作成=>targetpicker.jsで読み込み。new.html.erbの<%= javascript_pack_tag ‘letters/login’ %>パスを、モジュール読み込んでるtargetpicker.jsに通したところ、エラー(Webpacker::Manifest::MissingEntryError in Letters#new)が出た
③エラー文で一応ググり、どうやらwebpack周りが怪しいというところまではたどり着いたが、再度パスを‘letters/login’ に直すと、また認証&プロフィール情報の表示ができたのでモジュール化に失敗しているか、読み込みに失敗しているか、targetpicker.jsの実装が間違っていることが原因だと仮定した。
④どれが原因を調べるために、login.jsにtargetpicker.jsの実装を丸々コピペして動作を確認したところ、認証が走った。 ということはtargetpicker.jsの実装のせいではないと仮定した。
⑤メンターさんに質問し、読み込みの仕方・モジュール化の仕方が間違ってないか聞いたが、間違ってない&メンターさんのRailsアプリ(LIFFとの連携はなし)を起動して同様のモジュール化&読み込みをしてみると、きちんと動作することが発覚した。
⑥とすると、やはりtargetpicker.jsのせいかなと思い、再度login.jsにtargetpicker.jsの実装をコピペしてみた。今度は念のためdockerの再起動&ブラウザのキャッシュ削除を実施した。すると、③の時点では認証&プロフィール情報の表示ができたのにも関わらず、今度は認証後プロフィール情報の表示ができなくなった。consoleのobjectの中身を確認すると、JWSエラーが出ていた。
⑦なんでだ!勘弁しろ!と思い、きちんとプロフィール情報の表示ができていた時点までgit checkout .で戻した。docker再起動&ブラウザのキャッシュ削除を実行してから挙動を確認すると、きちんと③と同じ挙動になった
⑧再度new.html.erbの<%= javascript_pack_tag ‘letters/login’ %>パスを、モジュール読み込んでるtargetpicker.jsに通したが、やはり同様のエラーが出た。
⑨パスを‘letters/login’ に戻し、login.jsの実装を再度targetpicker.jsと同様にした。やはり認証&プロフィールの表示ができることを再度確認
➓login.jsの実装を全て削除してみたらどうなるんだろうと思い、login.jsの実装を全て削除してみた。すると、⑨と全く同じ挙動になることを確認した。え??笑なんで??