こんにちは、Webプログラマの隅です。
12月になって一気に寒くなりましたね。銭湯に行きたいです。
先日、Laravelでの開発時にLaravel mixでapp.jsにまとめてコンパイルしたJavascriptの関数が動かないといった問題でうんうん頭を抱えたのですが、解決法が見つかったのでご紹介いたします。
この記事の目次
Javascriptでfunctionを設定し、Laravel Mixでコンパイルすると動かない!?
既存のLaravelアプリケーションをリファクタリングしていたのですが、
Javascriptの同じ記述が複数箇所に出てきたため、関数化して1つのファイルにまとめてしまおうと
下記のようにapp.jsに読み込む形でコンパイルすることにしました。
resources/js/app.js
1 2 |
require('./bootstrap'); require('./common'); |
resources/js/common.js
1 2 3 |
function sentou(){ console.log('銭湯行きたい'); } |
resources/views/sample.blade.php
1 2 3 4 5 6 |
<head> <script src="{{ asset('js/app.js') }}" defer></script> </head> <body> <div class="btn" onclick="sentou();">いまの気持ち</div> </body> |
そして、いざnpm run dev!そしてボタンをクリック!としたところ……
1 |
sentou is not defined |
WHY JAPANESE PEOPLE!?
さっきまで動いていたじゃないか!?
銭湯に行くなってことかい!?
Laravel Mixのコンパイル時にはグローバル変数に関数を代入する
調査したところ、Laravel Mixで使用されているwebpackは JavaScript のモジュール機構 (ES2015 モジュール) が実装されており、異なる js ファイルで同じ名前の変数や関数が定義されても問題が起こらないように、各 js ファイルが独立した名前空間を持つようになっているようです。
(つまり、関数sentouはcommon.jsのローカル関数として扱われるため、外部から実行できないのです)
解決策として、関数sentouをwindowオブジェクトのプロパティに代入します。
resources/js/common.js
1 2 3 |
window.sentou = function(){ console.log('銭湯行きたい'); } |
resources/views/sample.blade.php
1 |
<div class="btn" onclick="sentou();">いまの気持ち</div> |
そして、いざnpm run dev!そして再びボタンをクリック!
console
1 |
銭湯行きたい |
カポーーーン……♨️
ありがとうございます。無事銭湯に行けそうです。
ボタンを押すのも待てないほど銭湯に行きたい方は、下記で読み込み時に実行可能です。
resources/views/sample.blade.php
1 2 3 4 5 6 7 8 |
<head> <script src="{{ asset('js/app.js') }}" defer></script> </head> <script type="text/javascript" defer> window.addEventListener('load', function() { window.sentou(); }); </script> |
最後に
ALAKIでは、これからどんどん海外に向けたビジネスを展開していきます。
クリエイティブ業務における修正依頼にかかる時間を1/5にできる自社サービス「MONJI」は海外のユーザー様にも好評です。
以下のサイトより、超直感的な修正依頼をぜひ体験してみてください!
■MONJI サービス紹介サイト
https://monji.tech/ja/
また最近では、閲覧しているサイトから修正依頼を1クリックで作成可能なChrome拡張機能「MONJI-izm」をリリースしました。
従来の読み込みと比較すると、読み込み速度が2倍に高速化。あっという間に読み込みが完了します。
これまでにない、爆速な読み込みを体験してみてください!
■MONJI Chrome拡張機能「MONJI-izm」
https://chrome.google.com/
※Chrome ウェブストアのページが開きます
ALAKI株式会社では、「MONJI」をはじめとするサービスで世界中に価値を提供するため、一緒に大きな目標に挑戦する仲間を募集中です!
さまざまな国で、さまざまな人たちと、ワクワクするビジネスに挑戦したい方のご応募をお待ちしております!
■ALAKI リクルートサイト
https://recruit.alaki.co.jp/
現場の業務フローに寄り添ったWebシステムをお求めなら、私たちALAKIにご相談ください。
ALAKIは経営者様が感じている問題点と、実際にWebシステムを利用される現場スタッフ様が直面している課題を、弊社システムエンジニアが丁寧に聞き取り、お客様と共にシステムを作り上げていきます。
業務改善が実現できるWebシステムをお求めの方は、是非ALAKIにご相談ください。