- + JavaScript の質問用スレッド vol.124 + [転載禁止]©2ch.net
873 :デフォルトの名無しさん[sage]:2018/02/16(金) 10:54:49.83 ID:ijGXrmYh - さて、むそろそろ俺の登場かな?
この問題はねSPAだからといってパフォーマンスさげないよね? 無駄なことはしないよね?という話で解決するんだよ。 例えば、http://example.com/foo/1 とかにアクセスした時、 index.html に30x のリダイレクトしたりはしない なぜかって? リダイレクトしたらパフォーマンス落ちるでしょ? つまりね。PATH_INFO(でいいかな?)の情報を持った状態で サーバーサイドアプリが呼び出されるんだよ そこでサーバーサイド側の仕組みを使って404を返せばいい SPAの話なのに何を言ってるのと思うかもしれないけど、 ちゃんとしたSPAっていうのはF5を押しても同じ画面が表示されるし URLも http://example.com/foo/1 のままになるもの SPAは/foo/1のデータをAjaxで読み込むものだと思ってるかもしれないけど、 それは他のページから辿った場合で、直接 http://example.com/foo/1 に アクセスした場合は、JavaScriptで取ってくるそのデータを最初からHTMLに埋め込むものなんだよ。 なぜかって? ページアクセスして表示されてからデータを取りに行くとパフォーマンスさがるだろ? だからSPAは基本Ajaxでデータを取るのは間違ってないんだけど、最初のページに限っては 最初からHTMLに埋め込んでおく。埋め込むことができるってことは、 データが見つからない時に404を返すことも容易 そして検索エンジンとかは、基本的にAjaxを使ってデータを読んだりしない。 読むことも有るかもしれないけど、Ajaxリクエスト(Content-Type: application/json)として そのページを読み込むことはないだろう。だからいま問題にしているどうやって404を返すか?という 話は実は当てはまらない。検索エンジンは http://example.com/foo/1 を直接読み込むのだから Ajaxによるリクエスト、つまり別ページを読み込んでからSPAの処理としてページを読み込む場合は そのリクエストを404にすればよい。たしかにページ自体は404にはならないんだけどね。 でも検索エンジンには関係ない話
|
- スレ立てるまでもない質問はここで 148匹目 [無断転載禁止]©2ch.net
264 :デフォルトの名無しさん[sage]:2018/02/16(金) 11:03:33.72 ID:ijGXrmYh - >>263
理由は?
|
- + JavaScript の質問用スレッド vol.124 + [転載禁止]©2ch.net
875 :デフォルトの名無しさん[sage]:2018/02/16(金) 12:12:33.62 ID:ijGXrmYh - > GoogleBotはちゃんとjsを解釈してくれます。
なにを解釈しているかちゃんと分かってますか? 解釈していると主張しているだけで、何をどう解釈しているかは 非公開のはずですが? どうして問題ないと信じられるのでしょうか?
|
- + JavaScript の質問用スレッド vol.124 + [転載禁止]©2ch.net
877 :デフォルトの名無しさん[sage]:2018/02/16(金) 12:34:28.83 ID:ijGXrmYh - >>876
それで今はサーバーサイドレンダリングの話なんですか? 404にサーバーサイドレンダリングなんか関係ないでしょ
|
- + JavaScript の質問用スレッド vol.124 + [転載禁止]©2ch.net
880 :デフォルトの名無しさん[sage]:2018/02/16(金) 12:54:41.12 ID:ijGXrmYh - >>878
突っ込みになってないよ? パフォーマンスの点から、最初から表示に必要なデータを HTMLに埋め込むって言ってるんだから
|
- + JavaScript の質問用スレッド vol.124 + [転載禁止]©2ch.net
882 :デフォルトの名無しさん[sage]:2018/02/16(金) 13:01:32.14 ID:ijGXrmYh - >>879
> 悪手よ。二種類のルーターの同時保守は。 そんなもんする必要が無いだろ? http://example.com/foo/1 にアクセスしたら どうせクライアントサイドから /api/foo/1とか呼び出すんだろ? ならその呼び出す命令の代わりに、 サーバーサイド側で http://example.com/foo/1 でアクセスした時に 同じ /api/foo/1 を呼び出せばいいだけ 汎用化できるから保守の必要はない
|
- + JavaScript の質問用スレッド vol.124 + [転載禁止]©2ch.net
883 :デフォルトの名無しさん[sage]:2018/02/16(金) 13:04:20.87 ID:ijGXrmYh - /api/foo/1と書いたけど、もちろん /foo/1 でもよい。
その場合、Ajax(Content-Type: application/json)からのリクエストか どうか判別してそのページのデータのみを返すか、 HTMLを返すか切り分ければいい
|
- + JavaScript の質問用スレッド vol.124 + [転載禁止]©2ch.net
885 :デフォルトの名無しさん[sage]:2018/02/16(金) 13:12:18.28 ID:ijGXrmYh - また関係ない話が出てきたな・・・
|
- + JavaScript の質問用スレッド vol.124 + [転載禁止]©2ch.net
887 :デフォルトの名無しさん[sage]:2018/02/16(金) 16:23:26.06 ID:ijGXrmYh - しないならしなければいいだけだろ?
何を言いたいのか分からん
|
- + JavaScript の質問用スレッド vol.124 + [転載禁止]©2ch.net
889 :デフォルトの名無しさん[sage]:2018/02/16(金) 18:24:29.38 ID:ijGXrmYh - >>888
> リクエストのURIと同じURIのリソースを呼び出すこともあれば呼び出さないこともあるSPAだと。 それはページ内部の話だろ。クローラーからすりゃ関係ない話 クローラーが記録するのはブラウザのアドレスバーに表示される あのURLのみと考えればいい。そのURLに対してGETリクエストを行うだけ そもそもお前、SPAの初期ページの読み込みが遅いって問題と解決方法知ってるか? https://qiita.com/takeshy/items/b7e1b6bd30d12ecb02c6 > 1.データを別々にAjaxで取得 > 各CollectionやModelがRESTを使ってデータをAjaxで取得するので、 > リクエスト数が多くて遅くなる上に、ブラウザの同じサイトに対しての同時リクエスト数制限にひっかかります。 > 1.に関しては、初期画面のHTMLにAjaxで取得予定のデータを予め埋め込んでしまい、 > 初期データとして使うことで初期画面表示時のAjax呼び出しをなくしました。 https://qiita.com/takeshy/items/ba8b3ee4606993c1c5b8 > 初期表示時にサーバとの通信を極力行わない > SPAで作成する場合、各モデルごとにサーバとデータを同期する必要がありますが、 > データを初期のHTMLにJSONデータとして埋め込んでしまうことで、Ajax通信を回避することが可能です。 どうせこれやるんだから、この時にデータが見つからなければ404を返すだけの話だろ
|
- + JavaScript の質問用スレッド vol.124 + [転載禁止]©2ch.net
890 :デフォルトの名無しさん[sage]:2018/02/16(金) 18:31:57.24 ID:ijGXrmYh - >>888
> クライアントサイドだけが生成するものの404は、クライアントサイドだけでさばくべきかと。 > クライアントサイドだけが生成するものってのは、サーバに持ち込まない事がセキュリティ上の担保になるようなブラウザで生成するものになるだろうけど。 クライアントサイドだけが生成されるものというのはURLを持たないってことか? URLを持たないページならクローラーの対象とならないんだから そんなのどうでもいいだろ。URLがなb「ならクローラ=[はこねーよw まさかURLを持たなくてもクロールしてくれるとか思ってねーよな? クローラーがクリックイベントまでシミュレートして、URLは変わらないのに ページ辿ってくれるとか思ってねーよな?しねーからなそんなこと > https://www.bricoleur.co.jp/blog/archives/2628 > 原文: > We don’t “click” during rendering so any click event will be ignored, > but we do execute JavaScript that is triggered by for example onLoad events. > > 原文: > (Googlebotは)ページをレンダリングする際に何も「クリック」しない。 > 従って、クリックイベント(によって発生する動的なコンテンツ)は無視する。 > しかし、onLoadイベントなどがトリガーとなるようなJavaScriptについては実行する。 クローラーの動きとしては 1. ページを読み込んでレンダリングする 2. そのページのURLをかき集める 3. そのページは一旦閉じSPAが終了されてるのと同じ状態から、かき集めたURLの一つを読み込む だからな。SPAアプリをクローラーが操作してくれるわけじゃない。 SPAの画面をそのままクロールしてくれるんじゃなくて、その状態からF5(画面更新)を 押して表示されたものしか見てくれないからな。だからURLがあることは必須
|
- + JavaScript の質問用スレッド vol.124 + [転載禁止]©2ch.net
893 :デフォルトの名無しさん[sage]:2018/02/16(金) 19:33:28.56 ID:ijGXrmYh - なってるといいよねw
どちらにしろURLがないコンテンツは クロールしてくれないことに変わりないんだがな
|
- + JavaScript の質問用スレッド vol.124 + [転載禁止]©2ch.net
894 :デフォルトの名無しさん[sage]:2018/02/16(金) 19:36:08.89 ID:ijGXrmYh - >>892
リンクタグを使った所で、そのリンクを アドレスバーに入れて表示されないと意味ないからね クローラーはリンクのみを取り出してアドレスバーに入れて 表示されたものを、そのURLのコンテンツとして認識する そこからクリックして変化したものまでクロールしてくれない (普通に考えれば当たり前だが)
|
- + JavaScript の質問用スレッド vol.124 + [転載禁止]©2ch.net
896 :デフォルトの名無しさん[sage]:2018/02/16(金) 19:54:10.08 ID:ijGXrmYh - >>895
運次第だろ? 1秒毎に変わるページでも作って、それがクロールされるかとか やってみたら?少なくとも全部クロールされることはないだろうね クリックされると副作用が現れるということで、 ページ上にクリックできるものが複数あって、 じゃあどれをクリックしたものをクロールされるのか?とかさ 考えてみれば不可能だってわかると思うんだが クローラーがJavaScriptを実行するというのは JavaScriptで動的に出したもの全てをクロールして くれるわけじゃないことはわかるでしょ? クロールされるのは指定したURLを表示して(JavaScriptで) レンダリングした最初の画面ぐらいに思っておいたほうが良いよ そこからのonclickは動かないとみなした方がいい もちろんレンダリングした結果に含まれるリンクにはURLが書いてあるので 新たなクロール対象になる。 onclickの場合はURLが書いてないのでクロール対象にならない
|
- + JavaScript の質問用スレッド vol.124 + [転載禁止]©2ch.net
900 :デフォルトの名無しさん[sage]:2018/02/16(金) 23:57:21.24 ID:ijGXrmYh - >>898
あるURLに対してクローラーがアクセスしてくる場合には サーバーサイド側で404を表示できる。 なぜならサーバーサイド側でそのリクエストを処理するから その時にデータがなければ404を返せる Ajaxを使ってアクセスする場合は、そのリクエストで404を返せばいい
|