追記:
コンメトで正攻法の解決方法をアドバイスいただきました。
当記事はやっつけの解決策なので、みんなはマネしちゃダメだぞ☆
laravel5.6
をインストールして jQuery
を使おうとしたら、jquery.js
を読み込んでいるはずなのに使えなくてハマったのでメモ。
状況
laravel5.6
を普通にインストールして、
$ npm install
$ npm run dev
した状態からスタート。
デフォルトで jQuery
が読み込まれているようなので、
blade.php
ファイルに jQuery
のコードを書いたらエラーが発生して動かない。
$(function(){
// ここにプログラムを記述
});
これだけなのに、以下のエラー。
Uncaught ReferenceError: $ is not defined
どうやら jQuery
が読み込まれていないというエラーのよう。
原因
あまり詳しくはないけど、どうやら laravel5.6
では(5.5あたりから?) vue
がデフォルトになっているようなので、もしかしたら jQuery
なんかも vue
方式で書かないと行けないのかもしれない。
そんな急に vue
を覚えろと言われても、すぐに実用レベルで使えるかどうかもわからないので、まずは旧来の書き方で良いから動かしたい。(そんなんだから二流プログラマーなんだよと言われそうだけど)
調べていたら、こいつが怪しい。
<!-- Scripts -->
<script src="{{ asset('js/app.js') }}" defer></script>
defer
ってなんだ?
<script> タグに async / defer を付けた場合のタイミング
https://qiita.com/phanect/items/82c85ea4b8f9c373d684
どうやら、 defer
を付けると処理の実行を遅延させることができるらしい。
つまり、blade内に jQuery
のプログラムを書いても、元になる jquery.js
が遅延されて後から実行されるので、 jquery.js
が読み込まれていないというエラーが発生しているようだ。
結論
とりあえず、 jQuery
をベタに書いて動かしたいなら、 defer
を削除すれば動く。
- <script src="{{ asset('js/app.js') }}" defer></script>
+ <script src="{{ asset('js/app.js') }}"></script>
最初に書いた vue
は関係ありそうな気がしたけど関係なさそう。
でも今回は使わないので、 assets/js/app.js
から vue
関連のところは消してコンパイルしておきました。
app.js
に重い処理などを書くようになると、 defer
を外した影響が出てくる可能性があるので、ちゃんと良い書き方覚えないとと思いながら、今日も妥協のコーディング。