九保すこひ@フリーランスエンジニア|累計300万PVのブログ運営中
さてさて、LaravelはPHPのフレームワークだというのはみなさんご存知だと思いますが、実はJavaScriptのパッケージ管理サービスnpm
と連携する機能があるのをご存知でしょうか。
npm
を使うと、必要な別パッケージとの依存関係を自動的に解決してくれますし、何よりソースコードを自動的にダウンロードしてきてくれるためとても重宝します。
もしかするとJavaScriptと聞くとcdn
(インターネット上から読み込むことができるJavaScriptやCSS)を思い出す方もいらっしゃるかもしれませんが、やはりcdn
は便利な分デメリットもあります。つまり、将来的にサービスが終了してしまうとJavaScriptやCSSが読み込めなくなってしまうというリスクが残ってしまうということです。
考えたくはないですが、Googleのように影響が大きなサービスをバツン!と終了させてしまうことも考えられるわけです。
そして、こうした理由からcdn
は使わずにサイト開発したい人も少なからずいらっしゃるのではないでしょうか。
ということで、今回はLaravelでnpm
のパッケージをインストールし、それを実際にウェブページから呼び出すまでの方法をご紹介します。
ぜひ開発の参考にしてくださいね。
※ 開発環境: Laravel 5.7, node.js: 8.10, npm: 6.4
準備
Laravel
からnpm
のパッケージを利用するにはLaravel Mix
が使えるようになっている必要があります。
まずは次のコマンドでインストールしておきましょう。
npm install
※ インストールされる内容はすでにpackage.json
で定義されています。
するとnode_modules
というフォルダが作成され、この中にLaravel Mix
に必要なパッケージがコピーされることになります。
そして、この時点でjQuery
やVue.js
などのパッケージもインストールされていますが、今回はテストとして以前公開した “画像をプレビュー表示できるvueディレクティブ” の v-preview-input をインストールし、このパッケージをサイト上から呼び出してみましょう。
npm i v-preview-input --save
npmパッケージをコンパイルする
では、ここからnpm
でインストールされたパッケージの中から必要なものだけをコンパイル(1つのJSファイルにする)しましょう。
まず、resources/js/app.js
を開きます。
この中で書かれているパッケージがpublic/js/app.js
の中にまとめられるのですが、初期状態では以下のパッケージが含められています。(実際にはbootstrap.js
内で定義されていて、この外部ファイルが呼び出されています)
- lodash ・・・ データ構造を変化させるなどの便利パッケージ
- popper ・・・ ツールチップ表示
- jquery ・・・ JSフレームワーク
- bootstrap ・・・ CSSフレームワーク
- axios ・・・ Ajax通信
- Vue ・・・ JSフレームワーク
ただ、今回のテストで必要なのは以下の2つだけです。
- Vue.js本体
- v-preview-input
そのため、初期状態で利用することになっているパッケージやコンポーネントは次のようにコメントアウトして使えないようにします。
// require('./bootstrap');
// Vue.component('example-component', require('./components/ExampleComponent.vue'));
// const app = new Vue({ // el: '#app' // });
そして、まだ呼び出されていないv-preview-input
を呼び出すようにしましょう。
window.Vue = require('vue'); // ←ここは最初からあります require('v-preview-input');
では、この状態でコンパイルします。
次のコマンドを実行しましょう。
npm run dev
コンパイルが成功するとapp.js
内にVue
とv-preview-input
のコードが1つにまとめられているはずです。
実際に見てみるとこのような形で実行されています。
window.Vue = __webpack_require__(***); __webpack_require__(***);
では、実際にVue
とv-preview-input
を呼び出してみましょう。
app.jsを呼び出す
といっても通常通り<script></script>
タグを使ってapp.js
を呼び出すだけです。
<html> <body> <script src="/js/app.js"></script> </body> </html>
これで、いちいちVue.js
とv-preview-input
を各ページで呼び出さなくてもapp.js
だけ呼び出していれば必要なJavaScriptは読み込まれていることになります。
また、もちろんブラウザの設定にもよりますが、主要なブラウザは初期状態でJavaScriptやCSSのキャッシュをつくる場合が多いので、もし別のページへ移動した場合、app.js
の読み込みを省略できる可能性が高いです。
ちなみに
さきほどnpm
パッケージをひとつにまとめましたが、Google の開発者ツールを見ると以下のようなメッセージが表示されています。
これは、「今あなたが使っているのは開発者用のVueですよ!」という意味で、つまりは「もっとファイルサイズが小さくてコンパクトな本番バージョンもありますからね!」と言っています。
そこで、せっかくなので最後に本番バージョンのapp.js
を作ってみましょう。
では、次のコマンドを実行してください。
npm run production
おそらく今回はnpm run dev
よりも時間がかかったのではないでしょうか。
これは、先ほどのapp.js
の内容をよりコンパクトにより高速に実行できるようコードを変更しているからです。
では実際に作成されたapp.js
の中を見てみましょう。
今回は先ほどとは違ってコードが暗号のように記述されていて改行もありません。
ただ、これはコンピュータからすると元のコードと同じ意味になりますので実行には問題はありません。
そして先ほどのメッセージは消えているはずです。
ただし、繰り返しになりますが本番用のapp.js
は作成に時間がかかるので、開発をしている場合には不向きです。そのため、開発をしている間はnpm run dev
で高速にコンパイルし、開発が完了したらnpm run production
でよりコンパクトなファイルを作成するようにします。
おわりに
ということで今回はnpm
パッケージをLaravel
で利用する方法をまとめてみました。
私個人としてはJavaScriptやCSSをひとつにまとめるのは保守がしにくくなってしまうため好きではないのですが、サイト表示のスピードアップには有効ですのでサイトのコンセプトによって全体的にコンパイルしたりパッケージ部分だけをまとめたりと、使い分けをすればいいのではないかと考えています。
ちなみに元々はJSやCSSのパッケージはbower
で管理していました。
bower
はとてもシンプルで、実行したフォルダ内にbower_components
というフォルダを作ってくれてその中にVue
やjQuery
をコピーしてくれていました。
しかし、ご存知の通りbower
はすでに利用が非推奨となってしまい、本家のサイトでもFacebook
が作ったパッケージマネージャYarn
を使うようにアナウンスされています。
そして、そのYarn
も結局はnpm
のパッケージを使っているので、メインはnpm
というのが開発のスタンダードになりそうですね。
ただ、Yarn
を使うとインストールが早いとの情報もあり、代替案としては残しておこうと思っています。
ではでは〜。