หากคุณไม่ได้โหลดสคริปต์แบบไดนามิกหรือทำเครื่องหมายเป็นdefer
หรือแสดงasync
ว่าสคริปต์ถูกโหลดตามลำดับที่พบในหน้าเว็บ ไม่สำคัญว่าเป็นสคริปต์ภายนอกหรือสคริปต์แบบอินไลน์โดยจะดำเนินการตามลำดับที่พบในหน้าเว็บ สคริปต์แบบอินไลน์ที่มาหลังจากสคริปต์ภายนอกจะถูกเก็บไว้จนกว่าสคริปต์ภายนอกทั้งหมดที่มาก่อนสคริปต์จะโหลดและรัน
สคริปต์ Async (โดยไม่คำนึงถึงวิธีที่ระบุว่าเป็น async) โหลดและรันตามลำดับที่คาดเดาไม่ได้ เบราว์เซอร์โหลดมันแบบขนานและเป็นอิสระในการรันตามลำดับที่ต้องการ
ไม่มีคำสั่งซื้อที่คาดเดาได้ในหลาย ๆ เรื่องของ async หากต้องการคำสั่งซื้อที่คาดเดาได้ก็จะต้องมีการเข้ารหัสโดยการลงทะเบียนสำหรับการแจ้งเตือนการโหลดจากสคริปต์ async และการโทรออกตามลำดับด้วยตนเองเมื่อมีการโหลดสิ่งที่เหมาะสม
เมื่อแทรกแท็กสคริปต์แบบไดนามิกลำดับการดำเนินการจะขึ้นอยู่กับเบราว์เซอร์ คุณสามารถดูวิธี Firefox ทำงานในบทความนี้อ้างอิง สรุป Firefox เวอร์ชันที่ใหม่กว่าจะแท็กสคริปต์ที่เพิ่มแบบไดนามิกเป็น async ยกเว้นว่ามีการตั้งค่าแท็กสคริปต์ไว้เป็นอย่างอื่น
แท็กสคริปต์ด้วยasync
อาจถูกเรียกใช้ทันทีที่มีการโหลด ในความเป็นจริงเบราว์เซอร์อาจหยุด parser จากสิ่งอื่นที่กำลังทำอยู่และรันสคริปต์นั้น ดังนั้นมันสามารถวิ่งได้ตลอดเวลา หากสคริปต์ถูกแคชก็อาจทำงานเกือบจะทันที หากสคริปต์ใช้เวลาสักครู่ในการโหลดสคริปต์อาจทำงานหลังจาก parser เสร็จสิ้น สิ่งหนึ่งที่ต้องจำasync
คือมันสามารถทำงานได้ทุกเวลาและเวลานั้นไม่สามารถคาดเดาได้
แท็กสคริปต์ที่defer
รอจนกว่าตัวแยกวิเคราะห์ทั้งหมดจะเสร็จสิ้นจากนั้นเรียกใช้สคริปต์ทั้งหมดที่ทำเครื่องหมายด้วยdefer
ตามลำดับที่พบ defer
นี้จะช่วยให้คุณสามารถทำเครื่องหมายสคริปต์หลายอย่างที่ขึ้นอยู่กับอีกคนหนึ่ง พวกเขาทั้งหมดจะถูกเลื่อนออกไปจนกว่าจะเสร็จสิ้นการแยกวิเคราะห์เอกสาร แต่พวกเขาจะดำเนินการตามลำดับที่พวกเขาพบว่ารักษาการอ้างอิงไว้ ฉันคิดว่าdefer
เหมือนสคริปต์ถูกดร็อปเข้าสู่คิวที่จะถูกประมวลผลหลังจาก parser เสร็จสิ้น เทคนิค, เบราว์เซอร์ที่อาจจะดาวน์โหลดสคริปต์ในพื้นหลังในเวลาใด ๆ แต่พวกเขาจะไม่ดำเนินการหรือปิดกั้นการแยกวิเคราะห์จนกว่า parser จะทำแยกหน้าและการแยกวิเคราะห์และทำงานสคริปต์แบบอินไลน์ใด ๆ ที่ไม่ได้ทำเครื่องหมายหรือdefer
async
นี่คือคำพูดจากบทความนั้น:
สคริปต์ที่แทรกสคริปต์ดำเนินการแบบอะซิงโครนัสใน IE และ WebKit แต่ซิงโครไนซ์ใน Opera และ pre-4.0 Firefox
ส่วนที่เกี่ยวข้องของสเปค HTML5 (เบราว์เซอร์ที่สอดคล้องกับที่ใหม่กว่า) เป็นที่นี่ มีจำนวนมากที่เขียนเกี่ยวกับพฤติกรรม async เห็นได้ชัดว่าข้อกำหนดนี้ไม่ได้ใช้กับเบราว์เซอร์รุ่นเก่า (หรือเบราว์เซอร์ที่ไม่สอดคล้อง) ซึ่งพฤติกรรมที่คุณอาจต้องทดสอบเพื่อตรวจสอบ
คำพูดจากสเป็ค HTML5:
จากนั้นต้องปฏิบัติตามตัวเลือกแรกต่อไปนี้ที่อธิบายถึงสถานการณ์:
หากองค์ประกอบนั้นมีแอตทริบิวต์ src และองค์ประกอบนั้นมีแอตทริบิวต์ที่เลื่อนออกไปและองค์ประกอบนั้นถูกตั้งค่าสถานะเป็น "parser-insert" และองค์ประกอบนั้นไม่มีแอตทริบิวต์ async
องค์ประกอบนั้นจะต้องเพิ่มไว้ที่ท้ายรายการ สคริปต์ที่จะดำเนินการเมื่อเอกสารเสร็จสิ้นการแยกวิเคราะห์ที่เชื่อมโยงกับเอกสารของตัวแยกวิเคราะห์ที่สร้างองค์ประกอบ
งานที่แหล่งงานเครือข่ายวางอยู่บนคิวงานเมื่ออัลกอริทึมการดึงข้อมูลเสร็จสมบูรณ์ต้องตั้งค่าสถานะ "พร้อมที่จะดำเนินการ parser" องค์ประกอบ โปรแกรมแยกวิเคราะห์จะจัดการกับการเรียกใช้สคริปต์
หากองค์ประกอบมีแอตทริบิวต์ src และองค์ประกอบนั้นถูกตั้งค่าสถานะเป็น "parser-insert" และองค์ประกอบนั้นไม่มีแอตทริบิวต์ async
องค์ประกอบนั้นเป็นสคริปต์การบล็อกการแยกวิเคราะห์ที่ค้างอยู่ของเอกสารของโปรแกรมวิเคราะห์คำที่สร้างองค์ประกอบนั้น (สามารถมีได้เพียงหนึ่งสคริปต์ต่อเอกสารในแต่ละครั้ง)
งานที่แหล่งงานเครือข่ายวางอยู่บนคิวงานเมื่ออัลกอริทึมการดึงข้อมูลเสร็จสมบูรณ์ต้องตั้งค่าสถานะ "พร้อมที่จะดำเนินการ parser" องค์ประกอบ โปรแกรมแยกวิเคราะห์จะจัดการกับการเรียกใช้สคริปต์
หากองค์ประกอบไม่มีแอตทริบิวต์ src และองค์ประกอบถูกตั้งค่าสถานะเป็น "parser-insert" และเอกสารของตัวแยกวิเคราะห์ HTML หรือตัวแยกวิเคราะห์ HTML ที่สร้างองค์ประกอบสคริปต์มีสไตล์ชีทที่บล็อกสคริปต์องค์ประกอบนั้นเป็น สคริปต์การบล็อกการแยกวิเคราะห์ที่ค้างอยู่ของเอกสารของตัวแยกวิเคราะห์ที่สร้างองค์ประกอบ (สามารถมีได้เพียงหนึ่งสคริปต์ต่อเอกสารในแต่ละครั้ง)
ตั้งค่าสถานะ "พร้อมที่จะแยกวิเคราะห์" ขององค์ประกอบ parser จะจัดการกับการดำเนินการสคริปต์
หากองค์ประกอบมีแอตทริบิวต์ src ไม่มีแอตทริบิวต์ async และไม่มีการตั้งค่าสถานะ "force-async"องค์ประกอบจะต้องเพิ่มในส่วนท้ายของรายการสคริปต์ที่จะดำเนินการตามลำดับโดยเร็วที่สุดเท่าที่จะเป็นไปได้ ด้วยเอกสารขององค์ประกอบสคริปต์ในเวลาที่การเตรียมอัลกอริทึมสคริปต์เริ่มต้นขึ้น
งานที่แหล่งงานเครือข่ายวางอยู่บนคิวงานเมื่ออัลกอริทึมการดึงข้อมูลเสร็จสมบูรณ์ต้องรันขั้นตอนต่อไปนี้:
หากองค์ประกอบนั้นไม่ได้เป็นองค์ประกอบแรกในรายการสคริปต์ที่จะดำเนินการตามลำดับโดยเร็วที่สุดเท่าที่จะทำได้ซึ่งถูกเพิ่มไว้ด้านบนให้ทำเครื่องหมายองค์ประกอบนั้นให้พร้อม แต่ยกเลิกขั้นตอนเหล่านี้โดยไม่ต้องเรียกใช้สคริปต์เลย
การดำเนินการ: ดำเนินการบล็อกสคริปต์ที่สอดคล้องกับองค์ประกอบสคริปต์แรกในรายการสคริปต์นี้ที่จะดำเนินการตามลำดับโดยเร็วที่สุด
ลบองค์ประกอบแรกออกจากรายการสคริปต์นี้ที่จะดำเนินการตามลำดับโดยเร็วที่สุด
หากรายการของสคริปต์ที่จะดำเนินการตามลำดับโดยเร็วที่สุดยังคงไม่ว่างเปล่าและรายการแรกถูกทำเครื่องหมายว่าพร้อมแล้วให้ข้ามกลับไปที่ขั้นตอนการปฏิบัติที่มีข้อความกำกับ
หากองค์ประกอบมีคุณสมบัติ srcองค์ประกอบจะต้องเพิ่มเข้าไปในชุดของสคริปต์ที่จะดำเนินการโดยเร็วที่สุดเท่าที่เป็นไปได้ของเอกสารขององค์ประกอบสคริปต์ในเวลาที่เตรียมอัลกอริทึมสคริปต์เริ่มต้น
งานที่แหล่งงานเครือข่ายวางอยู่บนคิวงานเมื่ออัลกอริทึมการดึงข้อมูลเสร็จสมบูรณ์จะต้องดำเนินการบล็อกสคริปต์แล้วลบองค์ประกอบออกจากชุดของสคริปต์ที่จะดำเนินการโดยเร็วที่สุด
มิฉะนั้นเอเจนต์ผู้ใช้จะต้องเรียกใช้งานบล็อกสคริปต์ทันทีแม้ว่าสคริปต์อื่นกำลังดำเนินการอยู่
สิ่งที่เกี่ยวกับสคริปต์โมดูล Javascript type="module"
?
ตอนนี้ Javascript รองรับการโหลดโมดูลด้วยไวยากรณ์ดังนี้:
<script type="module">
import {addTextToBody} from './utils.mjs';
addTextToBody('Modules are pretty cool.');
</script>
หรือด้วยsrc
แอตทริบิวต์:
<script type="module" src="http://somedomain.com/somescript.mjs">
</script>
สคริปต์ทั้งหมดที่มีtype="module"
จะได้รับdefer
แอตทริบิวต์โดยอัตโนมัติ สิ่งนี้จะดาวน์โหลดแบบขนาน (หากไม่ใช่แบบอินไลน์) พร้อมการโหลดหน้าอื่น ๆ จากนั้นเรียกใช้ตามลำดับ แต่หลังจากโปรแกรมแยกวิเคราะห์เสร็จแล้ว
โมดูลสคริปต์ยังสามารถกำหนดแอasync
ททริบิวต์ที่จะเรียกใช้สคริปต์โมดูลแบบอินไลน์โดยเร็วที่สุดไม่รอจนกว่าตัวแยกวิเคราะห์เสร็จสิ้นและไม่รอที่จะเรียกใช้async
สคริปต์ตามลำดับเฉพาะที่สัมพันธ์กับสคริปต์อื่น ๆ
: มีแผนภูมิระยะเวลาที่มีประโยชน์สวยที่แสดงให้เห็นว่าสามารถดึงข้อมูลและการดำเนินการแตกต่างกันของสคริปต์รวมทั้งสคริปต์โมดูลที่นี่ในบทความนี้เป็นJavascript โมดูลโหลด