2017年4月28日

IE11はPromiseに対応していないだって?

JavaScriptで非同期処理の要のPromiseを使うアプリケーションをいろいろなブラウザに対応させるためちょっと調べました。
というか、Internet ExplorerやAndroidの標準ブラウザ(4.4以下?)は、Promiseに対応していないようです。

headタグ内に以下を記載しておくことで、Promiseに標準対応していないブラウザでも使うことができるようになります。

<script>window.Promise || document.write('<script src="//www.promisejs.org/polyfills/promise-7.0.4.min.js"><\/script>');</script>
<script>window.Promise || document.write('<script src="/js/promise-7.0.4.min.js"><\/script>');</script>
 
1行目は、CDNを使ってPromiseが使えるようにするスクリプトを読み込みます。
2行目は、CDNのサーバがダウンしている場合を考慮してPromiseが使えるようにするスクリプトを読み込みます。

どちらにも、「window.Promise ||」とありますが、グローバルオブジェクトにPromiseが定義されていない場合のみ、スクリプトを読み込むようにしています。
なので、Chromeなどモダンなブラウザの場合は、スクリプトを読み込むことなくNaitiveのPromiseを使用します。

よかった、よかった。これでどのブラウザでもPromiseが使用できます。

2017年4月8日

hostsの設定をミスる

 Webアプリケーションを作っているときに、IPアドレスでアクセスするのが嫌でhostsにドメイン名を定義して開発してます。

今回も設定してやってたんですが、Google Chrome57でアクセスするとなぜかレスポンスがとても悪くなってしまいました。
全然大きくもないアプリケーションなのに…。


デベロッパーツールのNetworkタブので見てみるとInitial Connectionが21.0sとかになっていました。
接続に時間がかかっていると…。

Apacheの何かの設定をミスったのでは無いかと、数時間調査したけど特段それらしいものも発見できず。

じゃ、Firefoxだったらどうか?
一瞬でレスポンスが返ってきました。

おかしい、ブラウザの問題か?
IE10でやってみてもそれほど遅くなくレスポンスが返ってくる。


もしかしてとpingを打ってみたら、思ったのと違うIPアドレスを返してきたのですよ。
「当然、要求がタイムアウトしました。」と宣ってます。

「がっくし…。」
はい、同じドメイン名に違うIPアドレスをふっていました。

アホな設定
192.168.33.13 app.example.com
192.168.33.12 app.example.com

でも、ブラウザによって使用する設定が違うってどういうことですかね?
ドメイン名の名前解決って通常DNSがやってくれるからブラウザ依存にはならないような気がするのですが…。

hostsファイルに書くときは、重複しないように書いてください。
こんなのに何時間も費やすのはアホ以外の何物でもありません。
(と自分に言い聞かせる)