ลำดับการโหลดและการดำเนินการของหน้าเว็บ?


244

ฉันได้ทำโครงการบนเว็บมาแล้ว แต่ฉันไม่ได้คิดมากเกี่ยวกับลำดับการโหลดและการดำเนินการของหน้าเว็บธรรมดา แต่ตอนนี้ฉันต้องรู้รายละเอียด ยากที่จะหาคำตอบจาก Google หรือ SO ดังนั้นฉันจึงสร้างคำถามนี้ขึ้นมา

หน้าตัวอย่างเป็นเช่นนี้:

<html>
 <head>
  <script src="jquery.js" type="text/javascript"></script>
  <script src="abc.js" type="text/javascript">
  </script>
  <link rel="stylesheets" type="text/css" href="abc.css"></link>
  <style>h2{font-wight:bold;}</style>
  <script>
  $(document).ready(function(){
     $("#img").attr("src", "kkk.png");
  });
 </script>
 </head>
 <body>
    <img id="img" src="abc.jpg" style="width:400px;height:300px;"/>
    <script src="kkk.js" type="text/javascript"></script>
 </body>
</html>

ดังนั้นนี่คือคำถามของฉัน:

  1. หน้านี้โหลดอย่างไร
  2. ลำดับของการโหลดคืออะไร?
  3. รหัส JS จะทำงานเมื่อใด (อินไลน์และภายนอก)
  4. CSS ถูกใช้งานเมื่อใด
  5. เมื่อ $ (เอกสาร). เสร็จแล้วทำการดำเนินการ?
  6. จะดาวน์โหลด abc.jpg หรือไม่ หรือเพียงแค่ดาวน์โหลด kkk.png

ฉันมีความเข้าใจดังต่อไปนี้:

  1. เบราว์เซอร์โหลด html (DOM) ในตอนแรก
  2. เบราว์เซอร์เริ่มโหลดทรัพยากรภายนอกจากบนลงล่างล่างละบรรทัด
  3. หาก a <script>ตรงกับการโหลดจะถูกบล็อกและรอจนกว่าไฟล์ JS จะถูกโหลดและดำเนินการแล้วดำเนินการต่อ
  4. ทรัพยากรอื่น ๆ (CSS / ภาพ) ถูกโหลดในแบบขนานและดำเนินการถ้าจำเป็น (เช่น CSS)

หรือเป็นเช่นนี้

เบราว์เซอร์จะแยกวิเคราะห์ html (DOM) และรับทรัพยากรภายนอกในอาร์เรย์หรือโครงสร้างแบบกองซ้อน หลังจากโหลด html แล้วเบราว์เซอร์จะเริ่มโหลดทรัพยากรภายนอกในโครงสร้างแบบขนานและดำเนินการจนกว่าจะโหลดทรัพยากรทั้งหมด จากนั้น DOM จะเปลี่ยนไปตามพฤติกรรมของผู้ใช้โดยขึ้นอยู่กับ JS

ทุกคนสามารถให้คำอธิบายโดยละเอียดเกี่ยวกับสิ่งที่เกิดขึ้นเมื่อคุณได้รับการตอบกลับของหน้า html หรือไม่ สิ่งนี้แตกต่างกันไปในเบราว์เซอร์ที่แตกต่างกันอย่างไร มีการอ้างอิงเกี่ยวกับคำถามนี้หรือไม่?

ขอบคุณ

แก้ไข:

ฉันทำการทดลองใน Firefox ด้วย Firebug และมันจะแสดงเป็นภาพต่อไปนี้: ข้อความแสดงแทน


11
Steve Souders ได้ทำงานเป็นอย่างมากในสาขานี้ Google สำหรับสตีฟ + souders + high + performance และดู
anddoutoi

3
ฉันไม่ได้หมายถึงการปรับแต่งประสิทธิภาพ ฉันต้องการทราบรายละเอียด
Zhu Tao

2
โดยการอ่านงานของเขาฉันเข้าใจว่า "มัน" ทำงานโดยละเอียดเพิ่มขึ้นเป็นสิบเท่าได้อย่างไร ฉันไม่ได้รับอนุญาตจากลิขสิทธิ์ให้อ้างหนังสือทั้งเล่มของเขาที่นี่ดังนั้นฉันขอแนะนำให้คุณดูงานของเขา
anddoutoi

3
คำอธิบายที่ดีของสิ่งต่าง ๆ ที่เกิดขึ้นอยู่ที่นี่
Gerrat

คำตอบ:


277

ตามตัวอย่างของคุณ

<html>
 <head>
  <script src="jquery.js" type="text/javascript"></script>
  <script src="abc.js" type="text/javascript">
  </script>
  <link rel="stylesheets" type="text/css" href="abc.css"></link>
  <style>h2{font-wight:bold;}</style>
  <script>
  $(document).ready(function(){
     $("#img").attr("src", "kkk.png");
  });
 </script>
 </head>
 <body>
    <img id="img" src="abc.jpg" style="width:400px;height:300px;"/>
    <script src="kkk.js" type="text/javascript"></script>
 </body>
</html>

ประมาณการไหลของการดำเนินการประมาณดังนี้:

  1. ดาวน์โหลดเอกสาร HTML แล้ว
  2. การแยกวิเคราะห์เอกสาร HTML เริ่มต้นขึ้น
  3. การแยกวิเคราะห์ HTML ถึง <script src="jquery.js" ...
  4. jquery.js ถูกดาวน์โหลดและแยกวิเคราะห์
  5. การแยกวิเคราะห์ HTML ถึง <script src="abc.js" ...
  6. abc.js ถูกดาวน์โหลดแยกวิเคราะห์และรัน
  7. การแยกวิเคราะห์ HTML ถึง <link href="abc.css" ...
  8. abc.css ถูกดาวน์โหลดและแยกวิเคราะห์
  9. การแยกวิเคราะห์ HTML ถึง <style>...</style>
  10. มีการแยกวิเคราะห์และกำหนดกฎ CSS ภายใน
  11. การแยกวิเคราะห์ HTML ถึง <script>...</script>
  12. Javascript ภายในถูกวิเคราะห์และเรียกใช้
  13. การแยกวิเคราะห์ HTML ถึง <img src="abc.jpg" ...
  14. abc.jpg ถูกดาวน์โหลดและแสดงผล
  15. การแยกวิเคราะห์ HTML ถึง <script src="kkk.js" ...
  16. kkk.js ถูกดาวน์โหลดแยกวิเคราะห์และรัน
  17. การแยกเอกสาร HTML สิ้นสุด

โปรดทราบว่าการดาวน์โหลดอาจไม่ตรงกันและไม่บล็อกเนื่องจากพฤติกรรมของเบราว์เซอร์ ตัวอย่างเช่นใน Firefox มีการตั้งค่าซึ่ง จำกัด จำนวนคำขอพร้อมกันต่อโดเมน

นอกจากนี้ยังขึ้นอยู่กับว่าองค์ประกอบนั้นถูกแคชไว้แล้วหรือไม่ส่วนประกอบอาจไม่ได้รับการร้องขออีกในอนาคตอันใกล้ หากส่วนประกอบถูกแคชส่วนประกอบจะถูกโหลดจากแคชแทน URL จริง

เมื่อการวิเคราะห์คำสิ้นสุดลงและเอกสารพร้อมและโหลดเหตุการณ์onloadจะเริ่มทำงาน ดังนั้นเมื่อonloadเป็นเชื้อเพลิงที่$("#img").attr("src","kkk.png");มีการเรียก ดังนั้น:

  1. เอกสารพร้อมใช้งานโหลด onload
  2. จาวาสคริปต์ยอดฮิต $("#img").attr("src", "kkk.png");
  3. kkk.png ถูกดาวน์โหลดและโหลดเข้าสู่ #img

$(document).ready()เหตุการณ์เป็นจริงเหตุการณ์ยิงเมื่อส่วนประกอบของหน้าทั้งหมดจะถูกโหลดและพร้อม อ่านเพิ่มเติมเกี่ยวกับมัน: http://docs.jquery.com/Tutorials:Introducing_$ (เอกสาร) .ready ()

แก้ไข - ส่วนนี้จะอธิบายเพิ่มเติมในส่วนที่ขนานหรือไม่:

ตามค่าเริ่มต้นและจากความเข้าใจปัจจุบันของฉันเบราว์เซอร์มักจะเรียกใช้แต่ละหน้าใน 3 วิธี: ตัวแยกวิเคราะห์ HTML, Javascript / DOM และ CSS

ตัวแยกวิเคราะห์ HTML มีหน้าที่แยกวิเคราะห์และตีความภาษามาร์กอัปและจะต้องสามารถโทรไปยัง 2 องค์ประกอบอื่น ๆ

ตัวอย่างเช่นเมื่อ parser เจอบรรทัดนี้:

<a href="#" onclick="alert('test');return false;" style="font-weight:bold">a hypertext link</a>

ตัวแยกวิเคราะห์จะทำการโทร 3 ครั้งสองไปยัง Javascript และอีกหนึ่งเป็น CSS อันดับแรกตัวแยกวิเคราะห์จะสร้างองค์ประกอบนี้และลงทะเบียนในเนมสเปซ DOM พร้อมกับแอตทริบิวต์ทั้งหมดที่เกี่ยวข้องกับองค์ประกอบนี้ ประการที่สอง parser จะเรียกให้โยงเหตุการณ์ onclick กับองค์ประกอบเฉพาะนี้ สุดท้ายมันจะทำการเรียกอีกครั้งไปยังเธรด CSS เพื่อใช้สไตล์ CSS กับองค์ประกอบเฉพาะนี้

การดำเนินการอยู่ด้านบนลงล่างและเธรดเดี่ยว Javascript อาจมีหลายเธรด แต่ข้อเท็จจริงคือ Javascript นั้นเป็นเธรดเดี่ยว นี่คือเหตุผลที่เมื่อโหลดไฟล์จาวาสคริปต์ภายนอกการแยกวิเคราะห์หน้า HTML หลักจะถูกระงับ

อย่างไรก็ตามไฟล์ CSS สามารถดาวน์โหลดได้พร้อมกันเพราะกฎ CSS ถูกนำไปใช้เสมอ - หมายถึงองค์ประกอบต่างๆจะถูกวาดใหม่เสมอด้วยกฎ CSS ที่ใหม่ที่สุดที่กำหนดไว้ - จึงทำให้มันไม่ได้ปิดกั้น

องค์ประกอบจะใช้ได้เฉพาะใน DOM หลังจากที่แยกวิเคราะห์แล้ว ดังนั้นเมื่อทำงานกับองค์ประกอบเฉพาะสคริปต์จะถูกวางไว้หลังหรือภายในเหตุการณ์ onload หน้าต่าง

สคริปต์เช่นนี้จะทำให้เกิดข้อผิดพลาด (ใน jQuery):

<script type="text/javascript">/* <![CDATA[ */
  alert($("#mydiv").html());
/* ]]> */</script>
<div id="mydiv">Hello World</div>

เพราะเมื่อสคริปต์ถูกแยกวิเคราะห์#mydivองค์ประกอบยังไม่ได้กำหนด แต่สิ่งนี้จะได้ผล:

<div id="mydiv">Hello World</div>
<script type="text/javascript">/* <![CDATA[ */
  alert($("#mydiv").html());
/* ]]> */</script>

หรือ

<script type="text/javascript">/* <![CDATA[ */
  $(window).ready(function(){
                    alert($("#mydiv").html());
                  });
/* ]]> */</script>
<div id="mydiv">Hello World</div>

4
ขอบคุณ แต่คุณกล่าวถึงการดาวน์โหลดอาจเป็นแบบอะซิงโครนัสและไม่มีการปิดกั้นเนื่องจากพฤติกรรมของเบราว์เซอร์ดังนั้นองค์ประกอบใดบ้างที่สามารถดาวน์โหลดได้ใน asyn (ใช้ FF เป็นตัวอย่าง) <script>จะปิดกั้นส่วนประกอบอื่น ๆ ใช่ไหม มีการอ้างอิงเกี่ยวกับข้อมูลจำเพาะของแต่ละเบราว์เซอร์หรือไม่?
Zhu Tao

4
$ (เอกสาร). Ready () ถูกเรียกใช้เมื่อ DOM เสร็จสมบูรณ์ไม่ใช่เมื่อทุกองค์ประกอบของหน้าถูกโหลด
Pierre

2
@Pierre ตามองค์ประกอบของหน้าฉันหมายถึง DOM -> ส่วนประกอบใด ๆ ใน DOM
อริส

3
เพียงเพื่อชี้แจง ... หน้าต่างปกติเกิดขึ้นหลังจากที่ # 17 ... ดังนั้นสิ่งที่ # $ jQuery ของ $ (เอกสาร). ready () รหัสทำงาน? # 12? แต่ DOM นั้นถูกโหลดที่ # 1 ใช่ไหม?
armyofda12mnkeys

1
หากในแท็บ <body> หากเราเพิ่ม<link href = "bootstrap.min.css" rel = "stylesheet" />ระหว่างแท็ก <img> และ <script> กว่า img จะไม่ปรากฏจนกว่าจะมีการดาวน์โหลดบูทrap ... ดังนั้นฉันคิดว่าขั้นตอน [13], [14] จำเป็นต้องมีการปรับเปลี่ยน ... ใครสามารถอธิบายพฤติกรรมนั้นได้บ้าง
Bhuvan

34

1) ดาวน์โหลด HTML

2) การแยกวิเคราะห์ HTML มีความก้าวหน้า เมื่อถึงคำขอสำหรับเนื้อหาเบราว์เซอร์จะพยายามดาวน์โหลดเนื้อหา การกำหนดค่าเริ่มต้นสำหรับเซิร์ฟเวอร์ HTTP ส่วนใหญ่และเบราว์เซอร์ส่วนใหญ่จะดำเนินการเพียงสองคำขอพร้อมกัน IE สามารถกำหนดค่าใหม่ให้ดาวน์โหลดสินทรัพย์ได้ไม่ จำกัด จำนวนพร้อมกัน Steve Souders สามารถดาวน์โหลดมากกว่า 100 คำขอพร้อมกันบน IE ข้อยกเว้นคือคำขอของสคริปต์บล็อกคำขอสินทรัพย์แบบขนานใน IE นี่คือเหตุผลที่แนะนำให้ใส่ JavaScript ทั้งหมดลงในไฟล์ JavaScript ภายนอกและทำการร้องขอก่อนแท็กเนื้อหาปิดใน HTML

3) เมื่อ HTML ถูกวิเคราะห์คำ DOM จะแสดงผล CSS ถูกเรนเดอร์ขนานกับการเรนเดอร์ของ DOM ในเกือบทุกเอเจนต์ผู้ใช้ ดังนั้นขอแนะนำอย่างยิ่งให้วางโค้ด CSS ทั้งหมดลงในไฟล์ CSS ภายนอกที่ร้องขอให้สูงที่สุดในส่วน <head> </head> ของเอกสาร มิฉะนั้นหน้าจะมีการแสดงผลจนถึงการเกิดขึ้นของตำแหน่งคำขอ CSS ใน DOM จากนั้นการแสดงผลจะเริ่มต้นจากด้านบน

4) เฉพาะหลังจากที่ DOM แสดงผลอย่างสมบูรณ์และคำขอสำหรับเนื้อหาทั้งหมดในหน้านั้นได้รับการแก้ไขหรือหมดเวลาที่ JavaScript จะดำเนินการจากเหตุการณ์ onload IE7 และฉันไม่แน่ใจเกี่ยวกับ IE8 จะไม่หมดเวลาใช้งานสินทรัพย์อย่างรวดเร็วหากไม่ได้รับการตอบกลับ HTTP จากคำขอสินทรัพย์ นี่หมายถึงเนื้อหาที่ร้องขอโดย JavaScript แบบอินไลน์ไปยังหน้าเว็บนั่นคือ JavaScript ที่เขียนลงในแท็ก HTML ที่ไม่มีอยู่ในฟังก์ชั่นสามารถป้องกันการดำเนินการของเหตุการณ์ onload เป็นเวลาหลายชั่วโมง ปัญหานี้สามารถถูกทริกเกอร์หากรหัสอินไลน์ดังกล่าวมีอยู่ในหน้าและล้มเหลวในการดำเนินการเนื่องจากการชนกันของ namespace ที่ทำให้เกิดความผิดพลาดของรหัส

จากขั้นตอนข้างต้นหนึ่งในนั้นที่ใช้ CPU มากที่สุดคือการแยกวิเคราะห์ DOM / CSS หากคุณต้องการให้หน้าของคุณประมวลผลเร็วขึ้นให้เขียน CSS ที่มีประสิทธิภาพโดยกำจัดคำแนะนำที่ซ้ำซ้อนและรวมคำสั่ง CSS ไว้ในการอ้างอิงองค์ประกอบที่น้อยที่สุดเท่าที่จะเป็นไปได้ การลดจำนวนโหนดในทรี DOM ของคุณจะทำให้การเรนเดอร์เร็วขึ้น

โปรดทราบว่าเนื้อหาแต่ละรายการที่คุณร้องขอจาก HTML ของคุณหรือแม้กระทั่งจากเนื้อหา CSS / JavaScript ของคุณจะถูกร้องขอด้วยส่วนหัว HTTP แยกต่างหาก สิ่งนี้ใช้แบนด์วิดท์และต้องประมวลผลตามคำขอ หากคุณต้องการให้หน้าโหลดเร็วที่สุดให้ลดจำนวนคำขอ HTTP และลดขนาดของ HTML คุณไม่ได้ใช้ประโยชน์จากผู้ใช้ของคุณโดยการเฉลี่ยน้ำหนักหน้าเว็บที่ 180k จาก HTML เพียงอย่างเดียว นักพัฒนาหลายคนสมัครสมาชิกการเข้าใจผิดที่ผู้ใช้คำนึงถึงคุณภาพของเนื้อหาในหน้าเว็บใน 6 นาโนวินาทีจากนั้นล้างข้อมูลการค้นหา DNS จากเซิร์ฟเวอร์ของเขาและเบิร์นคอมพิวเตอร์ของเขาหากไม่พอใจดังนั้นแทนที่จะให้หน้าเว็บที่สวยที่สุด HTML 250k ทำให้ HTML สั้นและหวานเพื่อให้ผู้ใช้สามารถโหลดหน้าเว็บของคุณได้เร็วขึ้น


2
การรวมคำสั่ง CSS เข้ากับการอ้างอิงองค์ประกอบที่เป็นไปได้น้อยที่สุดฟังดูแปลก ๆ ถ้าฉันต้องการสไตล์องค์ประกอบสามอย่างฉันต้องอ้างอิงองค์ประกอบสามอย่างแน่ ๆ ฉันไม่สามารถอ้างอิงหนึ่งถึงสิบสไตล์ได้หรือไม่ หรือทำอย่างละเอียดในที่
Green

12

เปิดหน้าของคุณใน Firefox และรับ HTTPFox addon มันจะบอกทุกอย่างที่คุณต้องการ

พบสิ่งนี้ใน archivist.incuito:

http://archivist.incutio.com/viewlist/css-discuss/76444

เมื่อคุณขอหน้าครั้งแรกเบราว์เซอร์ของคุณจะส่งคำขอ GET ไปยังเซิร์ฟเวอร์ซึ่งจะส่งคืน HTML ไปยังเบราว์เซอร์ จากนั้นเบราว์เซอร์เริ่มทำการแยกวิเคราะห์หน้า (อาจเป็นไปได้ก่อนที่จะถูกส่งคืนทั้งหมด)

เมื่อพบการอ้างอิงไปยังเอนทิตีภายนอกเช่นไฟล์ CSS, ไฟล์รูปภาพ, ไฟล์สคริปต์, ไฟล์ Flash, หรือสิ่งอื่น ๆ ภายนอกไปยังหน้า (ไม่ว่าจะอยู่บนเซิร์ฟเวอร์ / โดเมนเดียวกันหรือไม่ก็ตาม) ก็เตรียมที่จะทำ ขอ GET เพิ่มเติมสำหรับทรัพยากรนั้น

อย่างไรก็ตามมาตรฐาน HTTP ระบุว่าเบราว์เซอร์ไม่ควรทำการร้องขอพร้อมกันมากกว่าสองคำขอไปยังโดเมนเดียวกัน ดังนั้นจึงส่งคำขอแต่ละรายการไปยังโดเมนเฉพาะในคิวและเมื่อแต่ละเอนทิตีถูกส่งคืนจะเริ่มคำขอถัดไปในคิวสำหรับโดเมนนั้น

เวลาที่ใช้ในการส่งคืนเอนทิตีขึ้นอยู่กับขนาดของโหลดที่เซิร์ฟเวอร์กำลังเผชิญอยู่และกิจกรรมของทุก ๆ เครื่องระหว่างเครื่องที่ใช้เบราว์เซอร์และเซิร์ฟเวอร์ โดยหลักการแล้วรายการเครื่องจักรเหล่านี้อาจแตกต่างกันไปสำหรับทุกคำขอเท่าที่ภาพหนึ่งอาจเดินทางจากสหรัฐอเมริกาถึงฉันในสหราชอาณาจักรเหนือมหาสมุทรแอตแลนติกในขณะที่อีกภาพจากเซิร์ฟเวอร์เดียวกันออกมาผ่านมหาสมุทรแปซิฟิกเอเชียและยุโรป ซึ่งใช้เวลานาน ดังนั้นคุณอาจได้รับลำดับดังต่อไปนี้โดยที่หน้าหนึ่งมี (ตามลำดับนี้) อ้างอิงถึงไฟล์สคริปต์สามไฟล์และไฟล์รูปภาพห้าไฟล์ขนาดแตกต่างกันทั้งหมด:

  1. รับ script1 และ script2; คำขอคิวสำหรับ script3 และ images1-5
  2. มาถึง script2 (เล็กกว่า script1): GET script3, คิวภาพ 1-5
  3. script1 มาถึง รับ image1, คิวภาพ 2-5
  4. อิมเมจ 1 มาถึง GET image2, คิวอิมเมจ 3-5
  5. สคริปต์ 3 มาถึงไม่ได้เนื่องจากปัญหาเครือข่าย - รับสคริปต์ 3 อีกครั้ง (ลองใหม่อัตโนมัติ)
  6. มาถึง image2, script3 ยังไม่ได้อยู่ที่นี่; รับ image3, คิวภาพ 4-5-5
  7. ภาพที่ 3 มาถึง GET image4, คิวภาพที่ 5, script3 ยังอยู่ระหว่างการดำเนินการ
  8. มาถึง image4 รับ image5;
  9. มาถึง image5
  10. script3 มาถึง

กล่าวโดยย่อ: คำสั่งซื้อเก่าใด ๆ ขึ้นอยู่กับเซิร์ฟเวอร์กำลังทำอะไรส่วนที่เหลือของอินเทอร์เน็ตกำลังทำอะไรและมีอะไรผิดพลาดหรือไม่และจะต้องดึงข้อมูลใหม่ นี่อาจดูเหมือนเป็นวิธีแปลก ๆ ในการทำสิ่งต่าง ๆ แต่มันจะเป็นไปไม่ได้เลยสำหรับอินเทอร์เน็ต (ไม่ใช่แค่ WWW) ในการทำงานกับความน่าเชื่อถือในระดับใด ๆ ถ้ามันไม่ได้ทำแบบนี้

นอกจากนี้คิวภายในของเบราว์เซอร์อาจไม่ดึงเอนทิตีตามลำดับที่ปรากฏในหน้า - ไม่จำเป็นต้องมีมาตรฐานใด ๆ

(โอ้และอย่าลืมแคชทั้งในเบราว์เซอร์และในการแคชพร็อกซีที่ใช้โดย ISPs เพื่อลดภาระในเครือข่าย)


6

หากคุณกำลังถามสิ่งนี้เพราะคุณต้องการเพิ่มความเร็วเว็บไซต์ของคุณให้ตรวจสอบหน้าของ Yahoo เกี่ยวกับวิธีปฏิบัติที่ดีที่สุดสำหรับการเร่งเว็บไซต์ของคุณ มันมีวิธีปฏิบัติที่ดีที่สุดมากมายในการเพิ่มความเร็วเว็บไซต์ของคุณ


2

AFAIK เบราว์เซอร์ (อย่างน้อย Firefox) ร้องขอทรัพยากรทุกอย่างทันทีที่แยกวิเคราะห์ หากพบแท็ก img มันจะขอภาพนั้นทันทีที่แท็ก img ถูกแยกวิเคราะห์ และอาจเป็นไปได้ก่อนที่จะได้รับเอกสาร HTML ทั้งหมด ... นั่นคือมันยังคงสามารถดาวน์โหลดเอกสาร HTML ได้

สำหรับ Firefox มีคิวของเบราว์เซอร์ที่ใช้ขึ้นอยู่กับวิธีการตั้งค่าใน: about ตัวอย่างเช่นจะไม่พยายามดาวน์โหลดมากกว่า 8 ไฟล์พร้อมกันจากเซิร์ฟเวอร์เดียวกัน ... คำขอเพิ่มเติมจะถูกจัดคิว ฉันคิดว่ามีข้อ จำกัด ต่อโดเมนขีด จำกัด พร็อกซีและอื่น ๆ ซึ่งมีการบันทึกไว้ในเว็บไซต์ Mozilla และสามารถตั้งค่าได้ใน about: config ฉันอ่านบางแห่งที่ IE ไม่มีข้อ จำกัด ดังกล่าว

เหตุการณ์พร้อม jQuery จะเริ่มทำงานทันทีที่มีการดาวน์โหลดเอกสาร HTML หลักและ DOM จะถูกแยกวิเคราะห์ จากนั้นเหตุการณ์โหลดจะเริ่มทำงานเมื่อมีการดาวน์โหลดและแยกวิเคราะห์ทรัพยากรที่เชื่อมโยง (CSS, รูปภาพ, ฯลฯ ) เช่นกัน มันชัดเจนในเอกสาร jQuery

หากคุณต้องการควบคุมลำดับที่โหลดทั้งหมดฉันเชื่อว่าวิธีที่น่าเชื่อถือที่สุดในการทำคือผ่าน JavaScript



1

คำตอบที่เลือกดูเหมือนไม่มีผลกับเบราว์เซอร์ที่ทันสมัยอย่างน้อยใน Firefox 52 สิ่งที่ฉันสังเกตคือการร้องขอทรัพยากรการโหลดเช่น css, javascript ออกก่อนที่ตัวแยกวิเคราะห์ HTML จะถึงองค์ประกอบเช่น

<html>
  <head>
    <!-- prints the date before parsing and blocks HTMP parsering -->
    <script>
      console.log("start: " + (new Date()).toISOString());
      for(var i=0; i<1000000000; i++) {};
    </script>

    <script src="jquery.js" type="text/javascript"></script>
    <script src="abc.js" type="text/javascript"></script>
    <link rel="stylesheets" type="text/css" href="abc.css"></link>
    <style>h2{font-wight:bold;}</style>
    <script>
      $(document).ready(function(){
      $("#img").attr("src", "kkk.png");
     });
   </script>
 </head>
 <body>
   <img id="img" src="abc.jpg" style="width:400px;height:300px;"/>
   <script src="kkk.js" type="text/javascript"></script>
   </body>
</html>

สิ่งที่ฉันพบว่าเวลาเริ่มต้นของการร้องขอเพื่อโหลดทรัพยากร css และ javascript ไม่ถูกบล็อก ดูเหมือนว่า Firefox จะมีการสแกน HTML และระบุทรัพยากรที่สำคัญ (ไม่รวมทรัพยากร img) ก่อนที่จะเริ่มแยกวิเคราะห์ HTML

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.