GoogleBot上で動作するJavascriptメモ
GoogleBot上で動作するJavaScriptメモ
※2017年10月時点での実行結果.
2014年ごろから,GoogleはJavascript実行後の結果も見ているらしい.
ということで,GoogleBot上で動作するJavascriptの関数・演算子のメモ.
動作確認
こちらのページ
を参考に,各関数・演算子が動作するか確認. やっていることは, GoogleBotではJavascriptのエラーが出た時点で処理止まるので, 実行したいコードを文字列化,try-catch内で評価となる.
(function(){ function add(title, contents, addToNode){ var h4 = document.createElement("h4") h4.innerHTML = title; var sec = document.createElement("section"); var pre = document.createElement("pre"); pre.innerHTML = JSON.stringify(contents, null, " "); sec.appendChild(h4); sec.appendChild(pre); addToNode.appendChild(sec); } function tryAndPrint(title, code_str, addToNode){ try{ add(title, eval(code_str), addToNode) }catch(e){ add(title, "Error\n" + e.message + "\nstack" + e.stack + "\n", addToNode); } } // 動作 var addToNode=document.getElementById("success"); // for tryAndPrint("for of", "for(var i of [0]) i", addToNode); // Array系 tryAndPrint("Array.prototype.forEach", "Array.prototype.forEach.toString()", addToNode); tryAndPrint("Array.prototype.map", "Array.prototype.map.toString()", addToNode); tryAndPrint("Array.prototype.reduce", "Array.prototype.reduce.toString()", addToNode); tryAndPrint("Array.prototype.filter", "Array.prototype.filter.toString()", addToNode); tryAndPrint("Array.prototype.some", "Array.prototype.some.toString()", addToNode); tryAndPrint("Map", "Map.toString()", addToNode); tryAndPrint("Set", "Set.toString()", addToNode); // Promise・fetch系 tryAndPrint("fetch", "fetch.toString()", addToNode); tryAndPrint("Promise", "Promise.toString()", addToNode); // 変数宣言 tryAndPrint("const", "const c = 'const'", addToNode); tryAndPrint("typeof symbol", "typeof Symbol()", addToNode); tryAndPrint("template literal", "String.raw `a\nb`", addToNode); // 関数 tryAndPrint("generator", "(function* gen(){})", addToNode); // 未動作 var addToNode=document.getElementById("fail"); tryAndPrint("Array.prototype.find", "Array.prototype.find.toString()", addToNode); tryAndPrint("Array.prototype.findIndex", "Array.prototype.findIndex.toString()", addToNode); tryAndPrint("Array.from", "Array.from.toString()", addToNode); // 変数宣言 tryAndPrint("let", "let l = 'let'", addToNode); // operator tryAndPrint("arrow function", "(e => 1)", addToNode); tryAndPrint("... operator", "[...[1]]", addToNode); tryAndPrint("expo operator", "2 ** 0", addToNode); // 同期非同期 tryAndPrint("async function", "(async function f(){})", addToNode); tryAndPrint("default param", "(function(a = 1){})", addToNode); tryAndPrint("method definition", "({method(){}})", addToNode); tryAndPrint("object initializer", "var oi = 100;({oi});", addToNode); tryAndPrint("object key expression", "({['a' + 'b']: 1})", addToNode); })();
動作済み
未動作
(↓以下の関数・演算子は最新のChromeなどでは動作する.)
Fetch As Google での確認
このページをFetch As Googleの"FETCH AND RENDER"にかけてJavaScript実行後の結果を見る.
まとめ
2017年10月時点では,基本的にES6のようなモダンな書き方ではエラーになる.
- ES6以前からあった
Array.prototype.map, reduce
は使えるが,ES6からの'find, findIndex'はできない. ...
operatorはできない.const
宣言はできるが,let
宣言はできない(エラー内容をみる限り,strict
modeならいける?).- 非同期処理・通信
Promise
,fetch
はできるが,非同期関数宣言async
はできない(そのため同期処理のwait
もできない).