私のリアクションアプリケーションでは、window
オブジェクト、document
オブジェクト、localStorage
オブジェクトを使用しています。エラーを回避するためにReactサーバサイドレンダリングのウィンドウ、ドキュメント、ローカルストレージ
は、私は次のようにそれを設定している:
var jsdom = require("jsdom");
var doc = jsdom.jsdom("");
if (typeof localStorage === "undefined" || localStorage === null) {
var LocalStorage = require('node-localstorage').LocalStorage;
localStorage = new LocalStorage('./scratch');
global.localStorage = localStorage;
}
var win = doc.defaultView
console.log("document default viewwwwwwwwwwwwwwwwww", doc);
global.document = doc
global.window = win
function propagateToGlobal (window) {
for (let key in window) {
if (!window.hasOwnProperty(key)) continue
if (key in global) continue
global[key] = window[key]
}
}
propagateToGlobal(win)
しかし、私のアプリケーションでは、私は、本当のlocalStorageと実際の文書が代わりに私が上記設定した内容を使用するために、実際のウィンドウをしたいです。
localStorageはこのディレクトリscratch.Doを作成しました。つまり、ブラウザlocalStorageは現在使用されません。
私はドキュメント変数をコンソールに試してみて、問題を作成している文書変数の代わりに使用されている場合にも、コンソール文はこれを与える:
Document { location: [Getter/Setter] }
これは私が持っているスクリプトです:
<script dangerouslySetInnerHTML={{__html:(function(w,d,s,l,i){
console.log(d.getElementsByTagName(s)[0]);
w[l]=w[l]||[];
w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});
var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';
j.async=false;
j.src= '//www.googletagmanager.com/gtm.js?id='+i+dl;
console.log("f is",f);
f.parentNode ? f.parentNode.insertBefore(j,f) : false;
})(window,document,'script','dataLayer','ID')}}/>
ここで、getElementByTagNameは未定義を返し、要素は必要ではありません。これをどうやって解決するのですか?