tag:crieit.net,2005:https://crieit.net/tags/LaravelMix/feed 「LaravelMix」の記事 - Crieit Crieitでタグ「LaravelMix」に投稿された最近の記事 2020-01-17T09:28:03+09:00 https://crieit.net/tags/LaravelMix/feed tag:crieit.net,2005:PublicArticle/15687 2020-01-17T09:22:44+09:00 2020-01-17T09:28:03+09:00 https://crieit.net/posts/PWA-Web-TWA-Google-Play PWA対応WebサービスをTWAとしてGoogle Playに登録してみた <p>現在PWA対応のWebサイトはTWAとしてGoogle Playストアに登録してAndroidアプリとしてインストールできるようになっています。当サービスCrieitも試しにやってみました。Laravel + Laravel Mix(Vue.js)という構成です。</p> <h2 id="PWA対応"><a href="#PWA%E5%AF%BE%E5%BF%9C">PWA対応</a></h2> <p>まずはサイト自体がPWA対応していることが前提ですのでそちらの準備を行います。利用しているフレームワークによっては最初からPWA対応されているものもあるのでその場合は特に設定は不要です。</p> <p>色々キャッシュしてトラブルになると面倒だと思ったのでホーム画面追加機能だけ利用しました。</p> <h3 id="Workboxを導入"><a href="#Workbox%E3%82%92%E5%B0%8E%E5%85%A5">Workboxを導入</a></h3> <p>Service Workerの作成のためWorkboxを導入します。</p> <pre><code>yarn add -D workbox-sw workbox-webpack-plugin </code></pre> <p>デフォルトだとLaravel Mixでビルドしたファイルをキャッシュ設定にしてしまうため、今回はそれを無効にしておきました。webpack.mix.jsに下記を追記します。excludeで全無視しています。</p> <pre><code class="javascript">const workboxPlugin = require('workbox-webpack-plugin') mix.webpackConfig({ plugins: [ new workboxPlugin.GenerateSW({ swDest: 'service-worker.js', clientsClaim: true, skipWaiting: true, exclude: [/.*/], runtimeCaching: [] }) ], output: { publicPath: '' } }) </code></pre> <p>PWA用のmanifest.jsonを公開ルートフォルダに作成します。</p> <pre><code class="json">{ "name": "Crieit - プログラマー、クリエイターが何でも気軽に書けるコミュニティ", "short_name": "Crieit", "icons": [ { "src": "/img/card.png", "sizes": "144x144", "type": "image/png" } ], "start_url": "/", "display": "standalone", "theme_color": "#448AFF", } </code></pre> <p>表示するHTMLにmanifest.jsonを位置を記述します。</p> <pre><code class="html"><link rel="manifest" href="/manifest.json"> </code></pre> <p>JavaScriptでService Workerの登録を行います。Laravelプロジェクト作成時に自動的に作られていたbootstrap.jsに追記しておきました。</p> <pre><code class="javascript">if ('serviceWorker' in navigator) { window.addEventListener('load', () => { navigator.serviceWorker.register('/service-worker.js') }) } </code></pre> <p>これでビルドしたら完了です。ビルドすると <code>precache-manifest.なんちゃらかんちゃら.js</code> というファイルがされるためそれもコミットします。ただ、これは毎回生成されてしまうので、一度生成した後にwebpack.mix.jsの記述はコメントアウトしておきました。シンプルなPWA対応の場合は以後もう何も変更がありませんので。</p> <h2 id="TWA対応"><a href="#TWA%E5%AF%BE%E5%BF%9C">TWA対応</a></h2> <p>次にTWAの対応です。これはAndroid StudioでAndroidアプリケーションを作成します。具体的なやり方は下記に書かれています。</p> <p><a target="_blank" rel="nofollow noopener" href="https://qiita.com/zprodev/items/181c1c8f19bc0beb1183">【実践】Google Play Store でPWA配信 (TWA) - Qiita</a></p> <p>ただしちょっとインストールするもののハッシュ値が古かったりするので本家も参考にすると良いでしょう。</p> <p><a target="_blank" rel="nofollow noopener" href="https://developers.google.com/web/updates/2019/02/using-twa">Using Trusted Web Activities  |  Google Developers</a></p> <p>丁度この記事を書いている最中に見つけたできたてほやほやの記事もありました。多分色々情報が最新ですので日本語情報では一番参考になりそうです。</p> <p><a target="_blank" rel="nofollow noopener" href="https://www.maytry.net/how-to-release-twa/">話題のTWAでPWAをGoogle Play Storeに配信してみた</a></p> <h3 id="ハマったところ"><a href="#%E3%83%8F%E3%83%9E%E3%81%A3%E3%81%9F%E3%81%A8%E3%81%93%E3%82%8D">ハマったところ</a></h3> <h4 id="build.gradle"><a href="#build.gradle">build.gradle</a></h4> <p>似たようなセクションがあったりして追記するところを間違えてうまくいかなかった事がありました。</p> <h4 id="customtabsだとうまくいかない"><a href="#customtabs%E3%81%A0%E3%81%A8%E3%81%86%E3%81%BE%E3%81%8F%E3%81%84%E3%81%8B%E3%81%AA%E3%81%84">customtabsだとうまくいかない</a></h4> <p>実は前述リンクでやっているcustomtabsを使った方法ではうまくいきませんでした。ということで、代わりにandroid-browser-helperというものを使いました。なぜうまく行かなかったかというと、多分丁度最近android-browser-helperに変わったばかりで、微妙に各所の情報が古かったのではないかと。</p> <p>具体的には、app/build.gradleに追記したcustomtabsのimplementationの代わりに下記を追記しました。</p> <pre><code class="gradle"> implementation 'androidx.browser:browser:1.0.0' implementation 'com.github.GoogleChrome:android-browser-helper:ff8dfc4ed3d4133aacc837673c88d090d3628ec8' </code></pre> <p>僕は試していませんが、実は公式も変わったようなので下記のほうが正しそうです。ハッシュ値からバージョンに変わっているのでもしかしたら丁度ちゃんとリリースしたよ、というところなのかもしれません。</p> <pre><code class="gradle"> implementation 'com.google.androidbrowserhelper:androidbrowserhelper:1.0.0' </code></pre> <p>あとはAndroidManifest.xmlのActivityもこれを使った形に変更が必要です。</p> <pre><code class="xml"> <activity android:name="com.google.androidbrowserhelper.trusted.LauncherActivity"> </code></pre> <h2 id="assetlinks.json"><a href="#assetlinks.json">assetlinks.json</a></h2> <p>あとはassetlinks.jsonを公開フォルダに追加する必要があります。前述のリンクどれでも作り方の説明が書かれています。</p> <h2 id="アイコンの調整"><a href="#%E3%82%A2%E3%82%A4%E3%82%B3%E3%83%B3%E3%81%AE%E8%AA%BF%E6%95%B4">アイコンの調整</a></h2> <p>そのままだとデフォルトのアイコンでアプリになってしまいますので、適宜アイコンを置き換えます。最近は最新の方の機種用にXMLのアイコンファイルも作成するようです。容量自体も軽量になり、あとはforegroundとbackgroundがあり、Android側でアイコンを揺らしたりするアニメーションなどで利用されるようです。</p> <p>今回は作るのが面倒だったので元々のXMLを削除することで画像を使ってもらうことにしました。</p> <p><a href="https://crieit.now.sh/upload_images/7eaa5757ab431b6429649b8e6c60b2e05e11c99a35548.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/7eaa5757ab431b6429649b8e6c60b2e05e11c99a35548.jpg?mw=700" alt="" /></a></p> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <p>ということでTWAの対応方法を書きました。詳しい説明と言うよりは主にハマったところをメインに書いているため詳しくは記事中のリンクを参考にしてください。</p> だら@Crieit開発者 tag:crieit.net,2005:PublicArticle/15391 2019-09-12T21:30:14+09:00 2020-09-21T16:31:53+09:00 https://crieit.net/posts/Laravel-6-Vue-js-React Laravel 6 でVue.jsやReactを使う <p>Laravel 6 が先日リリースされました。Laravel 5 との違いとして、プロジェクトの初期化時にVue.jsのリソースが自動生成されなくなりました。そのため、引き続きLaravel 6でも使用したい場合は追加で導入する必要があります。</p> <h2 id="laravel/uiをインストール"><a href="#laravel%2Fui%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB">laravel/uiをインストール</a></h2> <p>まずはフロントエンドの初期化を行うためのパッケージとして<code>laravel/ui</code>というものがありますので、それをインストールします。</p> <pre><code class="sh">composer require laravel/ui --dev </code></pre> <h2 id="JavaScriptとCSSの生成"><a href="#JavaScript%E3%81%A8CSS%E3%81%AE%E7%94%9F%E6%88%90">JavaScriptとCSSの生成</a></h2> <p>uiライブラリを使って各種JavaScript、CSSのファイルを生成します。</p> <h3 id="Vue.jsを使う場合"><a href="#Vue.js%E3%82%92%E4%BD%BF%E3%81%86%E5%A0%B4%E5%90%88">Vue.jsを使う場合</a></h3> <p>下記のコマンドで生成します。</p> <pre><code class="sh">php artisan ui vue </code></pre> <p>packages.jsonにパッケージが追加されるのでインストールします。</p> <pre><code class="sh">yarn </code></pre> <p>念の為正常にビルドできるか一度試してみます。</p> <pre><code class="sh">yarn hot </code></pre> <p><code>DONE Compiled successfully</code>と表示されればOKです。hotコマンドの場合はjsファイルを修正すれば自動的にビルド&リロードを行ってくれるのでこのまま修正して実際に表示してみます。welcome.blade.phpのbodyの閉じタグの前に下記を追記してビルドされたJavaScriptを読み込みます。appというIDの要素内でVue.jsを有効化させているため、その中にコンポーネントを配置しています。</p> <pre><code class="html"><div id="app"> <example-component></example-component> </div> <script src="<span>{</span><span>{</span>mix('js/app.js')<span>}</span><span>}</span>"></script> </code></pre> <p>これで画面の端っこに表示されます。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5d7a370b0de7c.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5d7a370b0de7c.png?mw=700" alt="" /></a></p> <h3 id="Reactを使う場合"><a href="#React%E3%82%92%E4%BD%BF%E3%81%86%E5%A0%B4%E5%90%88">Reactを使う場合</a></h3> <p>下記のコマンドで生成します。</p> <pre><code class="sh">php artisan ui react </code></pre> <p>packages.jsonにパッケージが追加されるのでインストールします。</p> <pre><code class="sh">yarn </code></pre> <p>念の為正常にビルドできるか一度試してみます。</p> <pre><code class="sh">yarn hot </code></pre> <p><code>DONE Compiled successfully</code>と表示されればOKです。hotコマンドの場合はjsファイルを修正すれば自動的にビルド&リロードを行ってくれるのでこのまま修正して実際に表示してみます。welcome.blade.phpのbodyの閉じタグの前に下記を追記してビルドされたJavaScriptを読み込みます。また、コンポーネントはexampleというIDの要素に挿入されるように指定されているため、その要素も表示したい場所に追加しておきます。</p> <pre><code class="html"><div id="example"></div> <script src="<span>{</span><span>{</span>mix('js/app.js')<span>}</span><span>}</span>"></script> </code></pre> <p>これで画面の端っこに表示されます。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5d7a370b0de7c.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5d7a370b0de7c.png?mw=700" alt="" /></a></p> <h2 id="参考リンク"><a href="#%E5%8F%82%E8%80%83%E3%83%AA%E3%83%B3%E3%82%AF">参考リンク</a></h2> <p>公式の説明<br /> <a target="_blank" rel="nofollow noopener" href="https://laravel.com/docs/6.0/frontend">JavaScript & CSS Scaffolding - Laravel - The PHP Framework For Web Artisans</a></p> だら@Crieit開発者 tag:crieit.net,2005:PublicArticle/14701 2018-12-30T10:52:32+09:00 2018-12-30T13:13:08+09:00 https://crieit.net/posts/Laravel-Mix-JavaScript-TypeScript Laravel Mixにて途中でJavaScriptをTypeScriptに変える <p>Laravel MixでVueを使っているプロジェクトで、既にコンポーネントをJavaScriptで書いてしまったけどTypeScriptに変えたい、という場合があると思いますが、割と最小限ではじめられます。全部のコンポーネントをTypeScriptに書き直さなければならない、ということもありませんし、おすすめです。具体的な手順を書いておきます。</p> <h2 id="必要なファイルを追加"><a href="#%E5%BF%85%E8%A6%81%E3%81%AA%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E8%BF%BD%E5%8A%A0">必要なファイルを追加</a></h2> <p>vue-cliやcreate-nuxt-appのテンプレートから取ってくると早いと思います。</p> <ul> <li>tsconfig.json</li> <li>resources/assets/js/index.d.ts</li> </ul> <h2 id="mix.jsをmix.tsに変える"><a href="#mix.js%E3%82%92mix.ts%E3%81%AB%E5%A4%89%E3%81%88%E3%82%8B">mix.jsをmix.tsに変える</a></h2> <p>webpack.mix.jsで下記のような設定があると思います。</p> <pre><code class="javascript">mix.js('resources/assets/js/app.js', 'public/js') </code></pre> <p>これをtsに変えます。</p> <pre><code class="javascript">mix.ts('resources/assets/js/app.ts', 'public/js') </code></pre> <p>まるごと全てTypeScriptに置き換える開設の場合はフォルダ名もtsに変更する様な記述があったりしますが、今回は最小限ですのでメソッド名とapp.jsのファイル名だけの変更になります。</p> <h2 id="app.jsをapp.tsにする"><a href="#app.js%E3%82%92app.ts%E3%81%AB%E3%81%99%E3%82%8B">app.jsをapp.tsにする</a></h2> <p>app.jsというかエントリーポイントのファイルですが、これだけはTypeScriptに変更しないといけません。そのため変更し、ビルド時にエラーが出るようであればとりあえず変数の宣言に<code>variable: any</code>のようにanyを付けまくります。とりあえずビルドできないとしょうがないので型の設定はあとでやることにしてひたすらanyを付けていきます。</p> <h2 id="コンポーネントをTypeScript化する"><a href="#%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E3%82%92TypeScript%E5%8C%96%E3%81%99%E3%82%8B">コンポーネントをTypeScript化する</a></h2> <p>とりあえず何か一つTypeScriptに変更してみましょう。これは他で色々解説があるので詳しくはそのあたりを見ていただければ良いと思いますが、一応ざっと何をするかを書いておきます。</p> <h3 id="クラスにする"><a href="#%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%AB%E3%81%99%E3%82%8B">クラスにする</a></h3> <p>これがだいたい基本形です。</p> <pre><code class="typescript"><script lang="ts"> import { Vue, Component, Prop } from 'vue-property-decorator' @Component export default class YourComponentName extends Vue { </code></pre> <h3 id="いくつかの設定はデコレータ側へ"><a href="#%E3%81%84%E3%81%8F%E3%81%A4%E3%81%8B%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%81%AF%E3%83%87%E3%82%B3%E3%83%AC%E3%83%BC%E3%82%BF%E5%81%B4%E3%81%B8">いくつかの設定はデコレータ側へ</a></h3> <p>使うコンポーネントの設定などはデコレータ側で設定します。</p> <pre><code class="typescript">@Component({ components: { SubComponent } }) </code></pre> <h3 id="プロパティもデコレータ"><a href="#%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3%E3%82%82%E3%83%87%E3%82%B3%E3%83%AC%E3%83%BC%E3%82%BF">プロパティもデコレータ</a></h3> <pre><code class="typescript">@Prop({ type: String required: true }) name: string </code></pre> <h3 id="dataは使わず全部クラスのプロパティにする"><a href="#data%E3%81%AF%E4%BD%BF%E3%82%8F%E3%81%9A%E5%85%A8%E9%83%A8%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%AE%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3%E3%81%AB%E3%81%99%E3%82%8B">dataは使わず全部クラスのプロパティにする</a></h3> <p>before</p> <pre><code class="typescript">data() { return { val1: false, val2: 'aaa' val3: null } } </code></pre> <p>after</p> <pre><code class="typescript">val1 = false val2 = 'aaa' val3: YourType </code></pre> <h3 id="メソッドは普通のメソッドに"><a href="#%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%81%AF%E6%99%AE%E9%80%9A%E3%81%AE%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%81%AB">メソッドは普通のメソッドに</a></h3> <p>methods配下には書かず直接クラスのメソッドにする</p> <h3 id="computedはgetterに"><a href="#computed%E3%81%AFgetter%E3%81%AB">computedはgetterに</a></h3> <pre><code class="typescript">get computedId() { return `ID:${this.id}` } </code></pre> <h2 id="その他"><a href="#%E3%81%9D%E3%81%AE%E4%BB%96">その他</a></h2> <ul> <li>ts-loaderがエラーになったらバージョンをあわせてインストール</li> <li>型が入っていない外部モジュール等は@typesに型があればインストール</li> <li>型がない外部モジュールはindex.d.tsにdeclareを追加(VSCodeなどであれば対処方法が表示されていると思います)</li> </ul> だら@Crieit開発者 tag:crieit.net,2005:PublicArticle/14658 2018-12-14T23:46:08+09:00 2018-12-14T23:46:08+09:00 https://crieit.net/posts/Laravel-Mix-Vue-js-IE11 Laravel MixでビルドしたVue.jsがIE11で動かない時の対処法 <p>Laravel MixでビルドしたVue.jsのアプリケーションはIE11では動かない。<code>Object.assign</code>とかが無いため。</p> <p>解決法は下記のpolyfillを使うこと。</p> <p><a target="_blank" rel="nofollow noopener" href="https://babeljs.io/docs/en/babel-polyfill">@babel/polyfill · Babel</a></p> <p>一番簡単な方法は、上記リポジトリ内のdist/内のjsファイルをプロジェクト側で先に読み込んでおくだけでいい。</p> <p>それは面倒だしダサい、という場合は上記リンクの説明通りに先にビルドされるように設定する。</p> だら@Crieit開発者 tag:crieit.net,2005:PublicArticle/14468 2018-06-15T07:39:36+09:00 2018-10-31T15:37:31+09:00 https://crieit.net/posts/Laravel-Laravel-Mix Laravel以外でLaravel Mixを使う方法 <p>Laravel Mixって便利ですよね。</p> <p>ホットリロードもできるし、面倒な設定をしなくても簡単にプロダクションビルドもできる。</p> <p>というか、結局単なるNodeのライブラリなわけなので、フレームワークを使っていないプロジェクトでも簡単に導入できるのではないかと思い、試してみました。バージョニングにも対応しました。</p> <h2 id="準備"><a href="#%E6%BA%96%E5%82%99">準備</a></h2> <p>僕は元々他のLaravelのプロジェクトがあったので、そこからコピーしてきました。<br /> プロジェクトがない場合は<code>laravel new</code>で作りましょう。</p> <ul> <li>resources/assetsフォルダ</li> <li>package.json</li> <li>webpack.mix.js</li> <li>.gitignoreにnode_modulesを入れておく</li> </ul> <p>上記の中身は適宜使うプロジェクトに応じて更新しておきます。</p> <h2 id="初期化"><a href="#%E5%88%9D%E6%9C%9F%E5%8C%96">初期化</a></h2> <p>Nodeのパッケージをインストールします。(npmのコマンドでもいいです)</p> <pre><code class="sh">yarn install </code></pre> <p>起動してみる</p> <pre><code class="sh">yarn run hot </code></pre> <p>これで正常にビルドできればほぼ問題ないと思います。</p> <h2 id="動かしてみる"><a href="#%E5%8B%95%E3%81%8B%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B">動かしてみる</a></h2> <p>あとは実際にhtml内に組み込んでみます。</p> <pre><code class="php"><link rel="stylesheet" href="<?= mix('css/app.css') ?>" type="text/css"> </code></pre> <pre><code class="php"><script src="<?= mix('js/app.js') ?>"></script> </code></pre> <p>上記の通り、Laravelのヘルパーに含まれるmix関数だけはPHP側に用意が必要です。公式のリポジトリからコピーして修正してみたものが下記です。  <br /> (公式のものはLaravelのヘルパーを多用しているためそのままは使えません)</p> <p>ちなみにhotまでしか試していないので後半は微妙に動かないかもしれません。とはいえ<code>mix-manifest.json</code>を読んでそのパスを返しているだけなので、処理自体は簡単なためダメだったら適宜修正してみてください。</p> <p>あ、あと適当にBASE_DIRという定数を入れてしまっているので適宜修正してください。</p> <p>ちなみにコード中に<code>The Mix manifest does not exist.</code>のエラーがありますが、そのjsonファイルが無いということなのでビルドし忘れてるか、コミットする方針ならコミットし忘れてるか、というところが原因だと思われます。</p> <pre><code class="php"> function mix($path, $manifestDirectory = '') { static $manifests = []; if ($path[0] != '/') { $path = "/{$path}"; } if ($manifestDirectory && $manifestDirectory[0] != '/') { $manifestDirectory = "/{$manifestDirectory}"; } $manifestDirectory = substr($manifestDirectory, 1); $hotPath = BASE_DIR . "{$manifestDirectory}/hot"; if (file_exists($hotPath)) { $url = file_get_contents($hotPath); if (preg_match('/^https?:\/\//', $url)) { $url = preg_replace('/^https:/', '', $url); } return "{$url}{$path}"; } $manifestPath = BASE_DIR . $manifestDirectory . '/mix-manifest.json'; if (! isset($manifests[$manifestPath])) { if (! file_exists($manifestPath)) { throw new Exception('The Mix manifest does not exist.'); } $manifests[$manifestPath] = json_decode(file_get_contents($manifestPath), true); } $manifest = $manifests[$manifestPath]; if (! isset($manifest[$path])) { throw new Exception("Unable to locate Mix file: {$path}."); } return $manifestDirectory.$manifest[$path]; } </code></pre> <p>これでページのソースに表示されているcssとjsのURLを開いてみて何かしら表示されれば成功です。</p> <p>Laravelで通常行っている様な感覚でコンポーネントの追加、配置、ホットリロード、プロダクションビルドなどができるようになります。別にPHPじゃなくても良さそうな感じです。</p> <h2 id="ビルド"><a href="#%E3%83%93%E3%83%AB%E3%83%89">ビルド</a></h2> <p>公開フォルダへのパスが違う場合などはビルド時に<code>no such file</code>エラーになるようです。<code>webpack.mix.js</code>に下記のような一文を追加してください(フォルダは適宜指定してください)。</p> <pre><code class="javascript">mix.setPublicPath('.'); </code></pre> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <p>LaravelじゃないけどLaravel Mixが便利だからそのまま使いたい、と思っていた方は是非お試しください。</p> <p>2018/7/15追記)<br /> やっぱり他のフレームワークでも使えて良いみたいですね。僕がPHPメインなのでやっぱり言語でwebpackをラップするというのは非常に違和感があります。<br /> <a target="_blank" rel="nofollow noopener" href="https://qiita.com/saboyutaka/items/8efbb7778993599e52de">RailsでLaravel Mix(webpack)を使って15分でES6を書きはじめる</a></p> だら@Crieit開発者