tag:crieit.net,2005:https://crieit.net/tags/Vuex/feed 「Vuex」の記事 - Crieit Crieitでタグ「Vuex」に投稿された最近の記事 2020-10-19T18:06:59+09:00 https://crieit.net/tags/Vuex/feed tag:crieit.net,2005:PublicArticle/16152 2020-10-19T18:06:59+09:00 2020-10-19T18:06:59+09:00 https://crieit.net/posts/Vuex 【Vuex】別モジュールのステート、メソッド呼び出し <pre><code class="js">const moduleA = { // ... actions: { testA(context) { // state console.log(context.rootState.moduleName.stateName) // mutation context.commit("moduleName/mutationName", "引数", {root: true}); // action context.dispatch("moduleName/actionName", "引数", {root: true}); } } </code></pre> みみみみみ tag:crieit.net,2005:PublicArticle/15650 2019-12-29T11:19:56+09:00 2019-12-29T11:19:56+09:00 https://crieit.net/posts/vuex-module-decorators-nuxtServerInit-store-index-ts-actions vuex-module-decoratorsでnuxtServerInitするときは、store/index.tsにactionsを追加する <p><a target="_blank" rel="nofollow noopener" href="https://typescript.nuxtjs.org/ja/cookbook/store.html#%E3%82%AF%E3%83%A9%E3%82%B9%E3%83%99%E3%83%BC%E3%82%B9">公式ガイドのストア</a>のページで紹介されていた<a target="_blank" rel="nofollow noopener" href="https://github.com/championswimmer/vuex-module-decorators">vuex-module-decorators</a>。</p> <p>nuxtServerInitをどこに書けばいいか迷ったので、いろいろ調べたときの備忘録。</p> <h3 id="こんな感じでstore/index.tsに追加するっぽい"><a href="#%E3%81%93%E3%82%93%E3%81%AA%E6%84%9F%E3%81%98%E3%81%A7store%2Findex.ts%E3%81%AB%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B%E3%81%A3%E3%81%BD%E3%81%84">こんな感じでstore/index.tsに追加するっぽい</a></h3> <pre><code class="typescript">import { ActionTree, Store } from "vuex"; import { ActionContext } from "vuex/types"; import { Context } from "@nuxt/types"; import { initialiseStores } from "~/utils/store-accessor"; // RootStateを追加 export const state = () => ({}); export type RootState = ReturnType<typeof state>; const initializer = (store: Store<any>) => initialiseStores(store); export const plugins = [initializer]; // Rootのactionsを追加 export const actions: ActionTree<any, any> = { nuxtServerInit: async ( context: ActionContext<RootState, RootState>, server: Context ) => { // nuxtServerInitの処理 } }; export * from "~/utils/store-accessor"; </code></pre> <p>ほかの導入する部分は、以下の記事を参照。</p> <p><a target="_blank" rel="nofollow noopener" href="https://www.memory-lovers.blog/entry/2019/12/12/200000" target="_blank" rel="noopener">Nuxt+TypeScript+Firebaseのはじめるときにやること: 2019年12月版 - くらげになりたい。</a></p> <p>以上!!</p> <h2 id="こんなのつくってます!!"><a href="#%E3%81%93%E3%82%93%E3%81%AA%E3%81%AE%E3%81%A4%E3%81%8F%E3%81%A3%E3%81%A6%E3%81%BE%E3%81%99%21%21">こんなのつくってます!!</a></h2> <p>積読用の読書管理アプリ 『積読ハウマッチ』をリリースしました!<br /> <a target="_blank" rel="nofollow noopener" href="https://tsundoku.site">積読ハウマッチ</a>は、Nuxt.js+Firebaseで開発してます!</p> <p><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/572d4947-f40b-e4dc-1c9c-bc584cd2a66c.png" width="200"/></p> <p>もしよかったら、遊んでみてくださいヽ(=´▽`=)ノ</p> <p>要望・感想・アドバイスなどあれば、<br /> 公式アカウント(<a target="_blank" rel="nofollow noopener" href="https://twitter.com/MemoryLoverz">@MemoryLoverz</a>)や開発者(<a target="_blank" rel="nofollow noopener" href="https://twitter.com/kira_puka">@kira_puka</a>)まで♪</p> <h1 id="参考にしたサイト"><a href="#%E5%8F%82%E8%80%83%E3%81%AB%E3%81%97%E3%81%9F%E3%82%B5%E3%82%A4%E3%83%88">参考にしたサイト</a></h1> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://github.com/championswimmer/vuex-module-decorators/issues/80#issuecomment-500374511">Examples of how to use the modules in a Vue component · Issue #80 · championswimmer/vuex-module-decorators</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/suzukenz/items/0b5c0eb5196646599377">Nuxt.js + Typescript + Vuexする現時点のベストと思う方法 - Qiita</a></li> </ul> きらぷか@積読ハウマッチ/SSSAPIなど tag:crieit.net,2005:PublicArticle/14854 2019-03-04T07:21:16+09:00 2020-10-11T09:37:18+09:00 https://crieit.net/posts/Crieit-5c7c535c6fca2 Crieitの記事詳細ページが日本の技術系投稿サービスで最速になった <p>Crieitの記事詳細ページのレスポンスがdev.toのような速さになりました。実際にはdev.toよりも速いです。技術記事系サービスとしてはQiita等を含めて日本一となります。</p> <p>この画像は各サービスの記事ページのレスポンスにかかった時間を比較したものになります。タイミングによってばらつきもあるため速いものをメモしてみましたが、国内のQiitaやQrunchは170ミリ秒ほど、爆速で話題になったdev.toも意外にも30ミリ秒ほどで、平均だともうちょっと遅い感じがします。そしてCrieitは15ミリ秒くらいなのでダントツで最速です。</p> <p><a href="https://crieit.now.sh/upload_images/01b220b58fd2f913ea6f07542d8741565c7bfe868fd02.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/01b220b58fd2f913ea6f07542d8741565c7bfe868fd02.png?mw=700" alt="" /></a></p> <p>確認方法としては、トップページから記事ページのリンクをクリックするか、記事ページでリロードするかが分かりやすいと思います。</p> <p>追記)<br /> 現在はZennがZennページ同じ速さになったので恐らく総合的に最速だと思います。Next.jsのキャッシュコントロールにまだ不足点がありますので、そちらがコントロールできるような実装がされると完璧になるでしょう。</p> <h2 id="なぜ速いのか"><a href="#%E3%81%AA%E3%81%9C%E9%80%9F%E3%81%84%E3%81%AE%E3%81%8B">なぜ速いのか</a></h2> <p>理由としては、Laravel側で動的にレンダリングしたHTMLをCloudflareというCDNでキャッシュしてもらっているため、サイトを閲覧している人のブラウザではそれが表示されているだけだからです。つまり、プログラム無しの単なるhtmlファイルを読み込んでいるのと同じレベルということです。実際に阿部 寛のホームページも大体17ミリ秒という感じで同じくらいの速さです。</p> <p>最近Gatsbyという静的サイトジェネレータが流行っています。これもコンテンツを事前にビルドし、サイト上では静的なファイルを表示するだけのため最速でコンテンツを届けることができるのですが、つまりはこれと全く同じレベルということです。しかもCloudflareのようなCDNは閲覧者の近くのサーバーから配信を行うため、ネットワークのレイテンシも非常に少なくあっという間にブラウザに表示されます。なので、速いのは何もすごくはなく、当たり前といえば当たり前のことです。</p> <p>mizchiさんもブログで仰っていました。</p> <blockquote> <p>フロントエンドの最適化の行き着く先の解の一つ、それは「CDN Edge で HTML をキャッシュして返却する」というものです。</p> </blockquote> <p><a target="_blank" rel="nofollow noopener" href="https://mizchi.hatenablog.com/entry/2019/02/21/235403">Edge Worker PaaS の fly.io が面白い - mizchi's blog</a></p> <h2 id="完璧なのか"><a href="#%E5%AE%8C%E7%92%A7%E3%81%AA%E3%81%AE%E3%81%8B">完璧なのか</a></h2> <p>全然完璧ではありません。そもそも現在記事ページしか対応していないので、他のページは今までどおりです。</p> <p>さらには、各ページには一度誰かがアクセスしなければならないので、投稿後や編集後に限っては今までどおりですし、普段誰もアクセスしない記事などはキャッシュされていないので最初に誰かがアクセスした時に重さを味わってもらわなければなりません。具体的にはChromeのDev Tools等で見ると下記のようにHITというレスポンスになっていればキャッシュが効いている状態です。(MISSになっている場合はリロードするとその後はHITになります)</p> <p><a href="https://crieit.now.sh/upload_images/baf891a4cf72ecfd1374559401f2af6b5c794c55ab21b.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/baf891a4cf72ecfd1374559401f2af6b5c794c55ab21b.png?mw=700" alt="" /></a></p> <p>あと僕自身の理解も完璧とは言えないので、何かしら勘違いしている可能性もあります。一度でもbotがアクセスされればキャッシュされるという認識ですが、適当な記事にアクセスしてみると意外にキャッシュされていないことが多いです。まだリリースして間もない時期ということもあり不明点や十分な確認ができていない部分も多いため、このあたりは引き続き要確認です。</p> <p>ということで記事タイトルも文字数を気にしなければ「Crieitの記事詳細ページのHTML取得レスポンスはCDNのキャッシュが効いているページに限っては日本の技術系投稿サービスで最速になったが効いてなければすごく遅い」が正確です。</p> <h2 id="GatsbyやHugoとの違い"><a href="#Gatsby%E3%82%84Hugo%E3%81%A8%E3%81%AE%E9%81%95%E3%81%84">GatsbyやHugoとの違い</a></h2> <p>最近流行っているGatsbyやHugoを使えばよいのでは、と思うかもしれませんが、これらは事前にビルドが必要なため、Crieitのようなユーザー投稿型のサービスで利用することはできません。(何か方法があるのかもしれませんが、どちらにしろリアルタイムで反映していくのは難しそうな気がします)</p> <p>そのためサーバーサイドでレンダリングしたものをそのままキャッシュしてもらうのが現実的な気がします。ビルドも不要です。</p> <h2 id="どんなメリットがあるのか"><a href="#%E3%81%A9%E3%82%93%E3%81%AA%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88%E3%81%8C%E3%81%82%E3%82%8B%E3%81%AE%E3%81%8B">どんなメリットがあるのか</a></h2> <h3 id="速い事自体が良い"><a href="#%E9%80%9F%E3%81%84%E4%BA%8B%E8%87%AA%E4%BD%93%E3%81%8C%E8%89%AF%E3%81%84">速い事自体が良い</a></h3> <p>とにかく速い事自体がメリットです。遅いとやはりイライラしますし、検索エンジン的にも速ければ速いほど良いと思います。そしてアクセスした時の気持ちよさも大きいです。</p> <h3 id="サーバーの負荷もない"><a href="#%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%AE%E8%B2%A0%E8%8D%B7%E3%82%82%E3%81%AA%E3%81%84">サーバーの負荷もない</a></h3> <p>CDN側で配信してくれるため、サーバーへのアクセスが来ません。そのためサーバーの負荷を抑えることができるようになります。実際にこのサーバーはGoogle Compute Engineの一番しょぼいサーバーで無料運用しているレベルのため、パフォーマンスも悪いしアメリカのリージョンのためレイテンシも大きいです。大体普通にアクセスすると1秒くらいかかってしまいます。(なので、dev.toは当然として、QiitaやQrunchも非常に高速という印象です)</p> <p>まあそれはそれほどの問題にはならないのですが、記事や投稿が増えてそれに伴ってページが増えていくと、サイトを勝手に巡回するよくわからないbotのアクセスもどんどん増えていってしまいます。普通に閲覧してくれるユーザーさんのアクセスだけだと全く問題にはならないのですが、そういうbotのアクセスまで含めてしまうと結構限界が来るのも早くなってしまうのではないかと思います。</p> <p>ですのでbotは全部もううちのサーバーに一切来なくなってほしいという思いからも対応を決意しました。</p> <h2 id="具体的にどうやったのか"><a href="#%E5%85%B7%E4%BD%93%E7%9A%84%E3%81%AB%E3%81%A9%E3%81%86%E3%82%84%E3%81%A3%E3%81%9F%E3%81%AE%E3%81%8B">具体的にどうやったのか</a></h2> <h3 id="そもそもCloudflareとは"><a href="#%E3%81%9D%E3%82%82%E3%81%9D%E3%82%82Cloudflare%E3%81%A8%E3%81%AF">そもそもCloudflareとは</a></h3> <p>CDNというのは各サービスの静的コンテンツをキャッシュし、それを世界中に張り巡らされた配信ネットワークを利用して、最も近い拠点から配信してくれる、というものすごい仕組みです。</p> <p>例えばCloudflareではデフォルトではjs, css, 画像を配信してくれます。jsファイルやcssファイルは最近はビルドされていて数MBになっていることもあるため、サーバー上から配信するとかなり遅かったりします。うちでも初期はダウンロードに数秒かかっていました。CDNを通して配信すると一瞬で配信できるため、そもそもCloudflareがないと成り立たないレベルになっています。</p> <p>デフォルトでは上記のファイルしか配信されないのですが、Page rulesを設定すると他のパターンでも配信できるようになります。それを用いて記事のURLのパターンを設定し、配信されるようにしました。</p> <h3 id="ヘッダーの調整が必要"><a href="#%E3%83%98%E3%83%83%E3%83%80%E3%83%BC%E3%81%AE%E8%AA%BF%E6%95%B4%E3%81%8C%E5%BF%85%E8%A6%81">ヘッダーの調整が必要</a></h3> <p>しかし、ただPage rulesを設定してもキャッシュされません。というのもCloudflareはページのレスポンスヘッダの内容を見てキャッシュするかどうかを判断してくれます。キャッシュ期間を定めていればその期間でキャッシュを破棄して再度更新されるようにすることができますし、そもそも個人情報などを含んでいてキャッシュしてはならないページなどはキャッシュしないようになっています。</p> <p>例えばLaravelとかであればデフォルトで全てキャッシュを無効化するレスポンスヘッダが含まれていますので、一切キャッシュされません。そのため、Middlewareやルーティングを設定してキャッシュを許可するためのレスポンスヘッダを返す必要があります。</p> <p>具体的にはCache-Controlヘッダで下記を返すようにします。CDN用のMiddlewareグループを作成し、それ用のルーティングファイルにルーティングを記述するようにしています。ヘッダだけでなく、安全のためセッションも無効にしています。</p> <h4 id="public"><a href="#public">public</a></h4> <p>好き勝手にキャッシュしていいよ、というやつです。</p> <h4 id="s-maxage"><a href="#s-maxage">s-maxage</a></h4> <p>CDN向けのキャッシュ時間です。とにかく大きくして永久にキャッシュしてもらうようにしました。(実際にされているかどうかは検証できていませんが)</p> <h4 id="max-age"><a href="#max-age">max-age</a></h4> <p>ブラウザ向けのキャッシュ時間です。s-maxageを指定していない場合はCDNのキャッシュ時間にも用いられます。これは長くしすぎるとCDN側のキャッシュが切れたことに気づくことができませんので、短めにしています。ブラウザキャッシュが切れてもCDNのキャッシュを取ってくるだけなので、問題はありません。</p> <h4 id="Set-Cookieヘッダを送信しない"><a href="#Set-Cookie%E3%83%98%E3%83%83%E3%83%80%E3%82%92%E9%80%81%E4%BF%A1%E3%81%97%E3%81%AA%E3%81%84">Set-Cookieヘッダを送信しない</a></h4> <p>Set-Cookieをレスポンスで返すと個人情報が含まれている可能性があると判断されるようでキャッシュが行われませんので送信しないようにします。</p> <p>Laravelであればこのヘッダを無効にするためのミドルウェアを追加します。ただ、webのルーティングでこのミドルウェアだけ追加しても動作しないようなので、別途CDN用のミドルウェアグループを作ると良いと思います。</p> <h3 id="キャッシュのpurgeが必要"><a href="#%E3%82%AD%E3%83%A3%E3%83%83%E3%82%B7%E3%83%A5%E3%81%AEpurge%E3%81%8C%E5%BF%85%E8%A6%81">キャッシュのpurgeが必要</a></h3> <p>このままだと永久にキャッシュされてしまい、記事を更新しても反映されなくなってしまいます。そのため、キャッシュを破棄する必要があります。</p> <p>Cloudflareの管理画面で可能ですが、APIも用意されているためそれを用います。</p> <p><a href="https://crieit.net/posts/PHP-Cloudflare-API">PHPでCloudflareのAPI経由でキャッシュを削除する</a></p> <p>これで記事が更新された時にキャッシュをpurgeするようにしました。今のところは上手くいっている気がします。</p> <h3 id="ログイン状態をどう管理するか"><a href="#%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E7%8A%B6%E6%85%8B%E3%82%92%E3%81%A9%E3%81%86%E7%AE%A1%E7%90%86%E3%81%99%E3%82%8B%E3%81%8B">ログイン状態をどう管理するか</a></h3> <p>静的にキャッシュしてしまっているため、サーバーサイドのテンプレート上でログインしている場合だけこれを表示、みたいなことはできなくなります。そのため、VuexのStoreにログインしている状態を保持しておき、ページが表示されたあとに必要なところだけ置き換えるようにしました。</p> <p>置き換えると言っても単にVueコンポーネント化しておき、Storeの情報によって表示を切り替えているだけです。</p> <h3 id="リアルタイムのデータをどうするか"><a href="#%E3%83%AA%E3%82%A2%E3%83%AB%E3%82%BF%E3%82%A4%E3%83%A0%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E3%81%A9%E3%81%86%E3%81%99%E3%82%8B%E3%81%8B">リアルタイムのデータをどうするか</a></h3> <p>リアルタイムのデータというのは、例えばキャッシュはできないけど表示が必要なコメントやアクセス数などです。これらはページが表示されたあと、ajaxで取って来ています。つまりキャッシュされていればまだ良いのですが、キャッシュされていない場合はページの描画を含めると2回通信していることになります。</p> <p>ただ、これは独自でアクセス数をカウントするため元々通信していたので変わらないのと、あとあくまでもやろうと思ったきっかけはbot対策のため、そのアクセスを軽減できれば問題ないかなと思っています。よくアクセスがあるページはだいたいキャッシュされた状態になると思いますし、そうでないページはさほどアクセスも来ないと思うので誤差かなと思います。とにかくbotを無視して、実際に見に来てくれる方の負荷だけを気にすれば良くなると考えると大きなメリットだと思っています。</p> <h2 id="問題点等の考察"><a href="#%E5%95%8F%E9%A1%8C%E7%82%B9%E7%AD%89%E3%81%AE%E8%80%83%E5%AF%9F">問題点等の考察</a></h2> <p>まだ謎や問題点があるので考察していきます。単なる知識不足の勘違いの可能性もあるのでわかる方は是非アドバイスをお願いします。また、この考察はあくまでもCloudflareの話ですので、他のCDNサービスの場合は全然関係ない可能性もあります。</p> <h3 id="キャッシュされていない?"><a href="#%E3%82%AD%E3%83%A3%E3%83%83%E3%82%B7%E3%83%A5%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%81%AA%E3%81%84%EF%BC%9F">キャッシュされていない?</a></h3> <p>Google Analyticsでアクセスされたことが確認できたページや、サーバーのログでbotが来たらしきページにアクセスしてみるのですが、キャッシュが効いていない事が多いです。(前述のヘッダがHITではなくMISSになる)</p> <p>そのため上手く期限が設定できていなかったり、そもそもCDN自体の仕様を勘違いしているのではないか、と心配になりました。ただ、もしかするとネットワークのエリア毎にキャッシュをしているようであれば、そのようになる可能性もあるのかな、と思いました。</p> <p>前述のように近いエリアからコンテンツが配信されるので、必ずしも全てのCDNサーバーがキャッシュを持っているとは限りません。確かにそのあたり細かく連携するとレスポンスの速さが失われる要因になるような気もするので、エリアごとの管理で十分なのかなという気はします。purgeは多分全て連動で行ってくれるのかな、と思います。(どこかで瞬時に削除する、というような記述を見たような)</p> <p>もしくはbotっぽいアクセスはキャッシュを使わず素通りさせるようにしているとか?</p> <h3 id="アップデート時にpurgeが必要"><a href="#%E3%82%A2%E3%83%83%E3%83%97%E3%83%87%E3%83%BC%E3%83%88%E6%99%82%E3%81%ABpurge%E3%81%8C%E5%BF%85%E8%A6%81">アップデート時にpurgeが必要</a></h3> <p>あとで気づいたのですが、よくよく考えると何かしら機能を更新してリリースしても、HTMLが変わらないのでリリースしたことが反映されません。ビルド済みのJavaScriptファイルはバージョニングされているのですが、それも新しいバージョンのものを見てくれないので、結局何かアップデートした際にはpurgeが必要で、また全てのページが一度重い状態になります。頻繁にアップデートすればするほどキャッシュが効かない状態が多くなります。(とはいえ対応前と変わらない状況ではありますが)</p> <p>そのためとりあえず手動全purgeするか、しんどくなってきたら今手動でやっているデプロイを自動デプロイできるようにしてその中に組み込むか、あとはCDN芸をやめて最速の座から降りるか、というところになりそうです。</p> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <p>とりあえずCloudflareを使った無料でのCDN芸をやってみたかった、というところもあったので試してみました。有料にはなりますが、他のCDNサービスであればもうちょっと楽な運用ができるのではないかと思います。もしログイン情報をあまり使っていないサービス等であればすぐにでも導入できたりするかもしれません。</p> <p>Crieit上でもボードのデータ数が増えてきているため、こちらもCDN化を試しているところです。プライベート機能があるのでそのあたりでちょっとコツが必要だったりします。また、サーバー側のアクセスログもどういう風にアクセス数が推移しているかも解析してみたいなと思っています。また面白い情報が出たら記事にしてみます。(詳しく設定を確認していないのでもう消えているかもしれませんが…)</p> だら@Crieit開発者 tag:crieit.net,2005:PublicArticle/14719 2019-01-14T01:06:52+09:00 2019-01-14T01:07:09+09:00 https://crieit.net/posts/Vue-Vue-Router-Vuex-Laravel-16 Vue + Vue Router + Vuex + Laravel チュートリアル(全16回)を書きました。 <p><img src="https://cdn.hypertextcandy.com/posts/vue-laravel-tutorial/eye-catch.jpg" alt="" /></p> <p><a target="_blank" rel="nofollow noopener" href="https://www.hypertextcandy.com">技術ブログ</a>に<br /> 『<a target="_blank" rel="nofollow noopener" href="https://www.hypertextcandy.com/vue-laravel-tutorial-introduction/">Vue + Vue Router + Vuex + Laravelで写真共有アプリを作ろう</a>(全16回)』<br /> を公開しました 😄👏🎉</p> <p>出来るだけたくさんの方に見てほしいので宣伝エントリを書きます。</p> <h2 id="コンテンツ"><a href="#%E3%82%B3%E3%83%B3%E3%83%86%E3%83%B3%E3%83%84">コンテンツ</a></h2> <p>フロントエンドに Vue.js + Vue Router + Vuex と<br /> サーバーサイドに Laravel を使用して写真共有アプリを開発するという内容です。</p> <p>こんなやつ 👇 ができます。</p> <p><img src="https://cdn.hypertextcandy.com/posts/vue-laravel-tutorial/VLT-vuesplash-1.jpg" alt="トップページ" /></p> <p>写真を投稿できます。</p> <p><img src="https://cdn.hypertextcandy.com/posts/vue-laravel-tutorial/VLT-vuesplash-7.jpg" alt="写真投稿パネル" width="480" /></p> <p>コメント投稿、いいね、ダウンロード機能も実装します。</p> <p><img src="https://cdn.hypertextcandy.com/posts/vue-laravel-tutorial/VLT-vuesplash-5.jpg" alt="写真閲覧ページ" /></p> <p>ログイン・会員登録といった認証機能もカバーします。</p> <p><img src="https://cdn.hypertextcandy.com/posts/vue-laravel-tutorial/VLT-vuesplash-3.jpg" alt="ログイン / 会員登録ページ" /></p> <p>ちなみにチュートリアルで扱うツールなどのバージョンは以下の通りです。</p> <div class="table-responsive"><table> <thead> <tr> <th align="center">Node</th> <th align="center">npm</th> <th align="center">Vue.js</th> <th align="center">Vue Router</th> <th align="center">Vuex</th> <th align="center">PHP</th> <th align="center">Laravel</th> </tr> </thead> <tbody> <tr> <td align="center">10.7.0</td> <td align="center">6.4.1</td> <td align="center">2.5.21</td> <td align="center">3.0.2</td> <td align="center">3.0.1</td> <td align="center">7.2.10</td> <td align="center">5.7.19</td> </tr> </tbody> </table></div> <h2 id="学べること"><a href="#%E5%AD%A6%E3%81%B9%E3%82%8B%E3%81%93%E3%81%A8">学べること</a></h2> <ul> <li>Vue.js と Laravel を組み合わせる</li> <li>ルーティングライブラリ Vue Router を取り入れる</li> <li>状態管理ライブラリ Vuex を取り入れる</li> <li>タブやローディングを作る</li> <li>Vue.js + Laravel の構成でクッキー認証と CSRF 対策を行う</li> <li>SPA でエラー処理を行う</li> </ul> <h2 id="こんな人に読んでほしい"><a href="#%E3%81%93%E3%82%93%E3%81%AA%E4%BA%BA%E3%81%AB%E8%AA%AD%E3%82%93%E3%81%A7%E3%81%BB%E3%81%97%E3%81%84">こんな人に読んでほしい</a></h2> <p>Vue や Laravel について、</p> <ul> <li>入門書を読んだあとに実際に何か作ってみたい!という人</li> <li>仕事などで触れて基本的な機能はわかったけどゼロからアプリを作ったことはない人</li> </ul> <p>より複雑なアプリを作れるようになるためのきっかけになればいいなと思います 🤗</p> <h2 id="連載記事"><a href="#%E9%80%A3%E8%BC%89%E8%A8%98%E4%BA%8B">連載記事</a></h2> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://www.hypertextcandy.com/vue-laravel-tutorial-introduction/">Vue + Vue Router + Vuex + Laravelで写真共有アプリを作ろう (1) イントロダクション</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://www.hypertextcandy.com/vue-laravel-tutorial-application-design/">Vue + Vue Router + Vuex + Laravelで写真共有アプリを作ろう (2) アプリケーションの設計</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://www.hypertextcandy.com/vue-laravel-tutorial-setting-up-spa-project/">Vue + Vue Router + Vuex + Laravelで写真共有アプリを作ろう (3) SPA開発環境とVue Router</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://www.hypertextcandy.com/vue-laravel-tutorial-authentication/">Vue + Vue Router + Vuex + Laravelで写真共有アプリを作ろう (4) 認証API</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://www.hypertextcandy.com/vue-laravel-tutorial-authentication-part-2/">Vue + Vue Router + Vuex + Laravelで写真共有アプリを作ろう (5) 認証ページ</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://www.hypertextcandy.com/vue-laravel-tutorial-authentication-part-3/">Vue + Vue Router + Vuex + Laravelで写真共有アプリを作ろう (6) 認証機能とVuex</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://www.hypertextcandy.com/vue-laravel-tutorial-authentication-part-4/">Vue + Vue Router + Vuex + Laravelで写真共有アプリを作ろう (7) 認証機能とVuex Part.2</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://www.hypertextcandy.com/vue-laravel-tutorial-error-handling/">Vue + Vue Router + Vuex + Laravelで写真共有アプリを作ろう (8) エラーハンドリング</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://www.hypertextcandy.com/vue-laravel-tutorial-submit-photo/">Vue + Vue Router + Vuex + Laravelで写真共有アプリを作ろう (9) 写真投稿API</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://www.hypertextcandy.com/vue-laravel-tutorial-submit-photo-part-2/">Vue + Vue Router + Vuex + Laravelで写真共有アプリを作ろう (10) 写真投稿フォーム</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://www.hypertextcandy.com/vue-laravel-tutorial-list-photos/">Vue + Vue Router + Vuex + Laravelで写真共有アプリを作ろう (11) 写真一覧取得API</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://www.hypertextcandy.com/vue-laravel-tutorial-list-photos-part-2/">Vue + Vue Router + Vuex + Laravelで写真共有アプリを作ろう (12) 写真一覧ページ</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://www.hypertextcandy.com/vue-laravel-tutorial-photo-detail/">Vue + Vue Router + Vuex + Laravelで写真共有アプリを作ろう (13) 写真詳細ページ</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://www.hypertextcandy.com/vue-laravel-tutorial-add-comment/">Vue + Vue Router + Vuex + Laravelで写真共有アプリを作ろう (14) コメント投稿機能</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://www.hypertextcandy.com/vue-laravel-tutorial-likes/">Vue + Vue Router + Vuex + Laravelで写真共有アプリを作ろう (15) いいね機能</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://www.hypertextcandy.com/vue-laravel-tutorial-error-handling-part-2/">Vue + Vue Router + Vuex + Laravelで写真共有アプリを作ろう (16) エラーハンドリング Part.2</a></li> </ul> <p>🚀🚀🚀</p> <p>以上です。ぜひチェックしてみてください。</p> Masahiro Harada