オンラインの数え切れないほどの場所で、JavaScriptの前にCSSを組み込むことを推奨しています。推論は一般に、この形式のものです:
CSSとJavaScriptの注文に関しては、CSSが最初に来るようにします。その理由は、レンダリングスレッドには、ページのレンダリングに必要なすべてのスタイル情報があるためです。JavaScriptのインクルードが最初に来る場合、JavaScriptエンジンはそれをすべて解析してから次のリソースセットに進む必要があります。つまり、必要なスタイルがすべて揃っていないため、レンダリングスレッドはページを完全には表示できません。
私の実際のテストでは、まったく異なるものが明らかになりました。
私のテストハーネス
次のRubyスクリプトを使用して、さまざまなリソースに特定の遅延を生成します。
require 'rubygems'
require 'eventmachine'
require 'evma_httpserver'
require 'date'
class Handler < EventMachine::Connection
include EventMachine::HttpServer
def process_http_request
resp = EventMachine::DelegatedHttpResponse.new( self )
return unless @http_query_string
path = @http_path_info
array = @http_query_string.split("&").map{|s| s.split("=")}.flatten
parsed = Hash[*array]
delay = parsed["delay"].to_i / 1000.0
jsdelay = parsed["jsdelay"].to_i
delay = 5 if (delay > 5)
jsdelay = 5000 if (jsdelay > 5000)
delay = 0 if (delay < 0)
jsdelay = 0 if (jsdelay < 0)
# Block which fulfills the request
operation = proc do
sleep delay
if path.match(/.js$/)
resp.status = 200
resp.headers["Content-Type"] = "text/javascript"
resp.content = "(function(){
var start = new Date();
while(new Date() - start < #{jsdelay}){}
})();"
end
if path.match(/.css$/)
resp.status = 200
resp.headers["Content-Type"] = "text/css"
resp.content = "body {font-size: 50px;}"
end
end
# Callback block to execute once the request is fulfilled
callback = proc do |res|
resp.send_response
end
# Let the thread pool (20 Ruby threads) handle request
EM.defer(operation, callback)
end
end
EventMachine::run {
EventMachine::start_server("0.0.0.0", 8081, Handler)
puts "Listening..."
}
上記のミニサーバーを使用すると、JavaScriptファイル(サーバーとクライアントの両方)に任意の遅延と任意のCSS遅延を設定できます。例えば、http://10.0.0.50:8081/test.css?delay=500
、CSSの転送に500 msの遅延が発生します。
次のページを使用してテストします。
<!DOCTYPE html>
<html>
<head>
<title>test</title>
<script type='text/javascript'>
var startTime = new Date();
</script>
<link href="http://10.0.0.50:8081/test.css?delay=500" type="text/css" rel="stylesheet">
<script type="text/javascript" src="http://10.0.0.50:8081/test2.js?delay=400&jsdelay=1000"></script>
</head>
<body>
<p>
Elapsed time is:
<script type='text/javascript'>
document.write(new Date() - startTime);
</script>
</p>
</body>
</html>
最初にCSSを含めると、ページのレンダリングに1.5秒かかります。
最初にJavaScriptを含めると、ページのレンダリングに1.4秒かかります。
Chrome、Firefox、Internet Explorerでも同様の結果が得られます。ただし、Operaでは、順序は重要ではありません。
すべてのCSSがダウンロードされるまで、JavaScriptインタープリターは開始を拒否しているようです。したがって、JavaScriptスレッドの実行時間が長くなるほど、JavaScriptを最初にインクルードする方が効率的であるようです。
何か不足していますか?JavaScriptインクルードの前にCSSインクルードを配置するという推奨は正しくありませんか?
非同期を追加したり、setTimeoutを使用してレンダリングスレッドを解放したり、JavaScriptコードをフッターに挿入したり、JavaScriptローダーを使用したりできることは明らかです。ここで重要なのは、主要なJavaScriptビットとCSSビットをヘッドで順序付けることです。
delay=400&jsdelay=1000
、delay=500
それは100ミリ秒または89ミリ秒の近くではありません。あなたがどの番号を参照しているかはわかりません。