Angular においては SSRなど Angular Universal で使用される可能性があるため、グローバルwindow を直接参照しないようにしたほうがベターです。
Okra でも SSR を行っているため、「Angular Universal で使用される」が当てはまるのですが、もともとは domino で createWindow することによって仮想window を作成し、グローバルwindow を参照できるようにしていました。
しかし、 domino で window を作成すると、 メモリリークが発生し不定期でサーバー上の node.js がクラッシュするという事態が発生しました。
( 同様の問題が発生したという Issue : https://github.com/angular/universal/issues/1089 )
そこで、 domino で window を作成するのをやめ、本来の「グローバルwindowを直接参照しないようにしたほうがベター」という思想に則り、以下の記事を参考に Window Provider を作成しました。
Angular Window Provider [ https://brianflove.com/2018/01/11/angular-window-provider/ ]
しかし、またここで問題が発生します。
メモリリークは解消しましたが Angular Universal で window にアクセスした場合、空オブジェクトが返ってくるため、その後の処理でエラーが発生してしまうのです。
この問題が発生することを事前に予期するため、 Proxy を使って、 window にアクセスする場合、開発中に警告を表示することにしました。
これで window にアクセスするコードを書いた場合、開発中でも
「You are accessing "window.innerWidth" which does not exist on the server.」
のように、事前に console に警告を出し、 isBrowser/isServer で分岐をするように促すことができます。
なお、現在の Okra においては、 isBrowser/isServer にて分岐する煩わしさを減らすべく、 dom.js / domino に倣いつつ SSR 環境でもメモリリークしない仮想windowを上記 Window Provider で作成することに成功、更に一歩進んだ実行環境・開発効率を手に入れています。