การประเมินสคริปต์และงานที่ใช้เวลานาน

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

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

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

การประเมินสคริปต์คืออะไร

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

การประเมินสคริปต์จะทำงานตามที่แสดงในเครื่องมือวิเคราะห์ประสิทธิภาพของ Chrome DevTools งานจะทําให้มีงานที่ใช้เวลานานในระหว่างการเริ่มต้นใช้งาน ซึ่งจะบล็อกความสามารถของเทรดหลักในการตอบสนองต่อการโต้ตอบของผู้ใช้
การประเมินสคริปต์จะทำงานตามที่แสดงในเครื่องมือสร้างโปรไฟล์ประสิทธิภาพในเครื่องมือสำหรับนักพัฒนาเว็บใน Chrome ในกรณีนี้ งานมีมากพอที่จะทำให้เกิดงานที่ใช้เวลานานซึ่งบล็อกเธรดหลักไม่ให้ทำงานอื่นๆ ซึ่งรวมถึงงานที่กระตุ้นการโต้ตอบของผู้ใช้

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

การประเมินสคริปต์อาจเป็นปัญหาได้แม้จะจำเป็น เนื่องจากผู้ใช้อาจพยายามที่จะโต้ตอบกับหน้าเว็บหลังจากที่หน้าเว็บแสดงผลครั้งแรกไม่นาน อย่างไรก็ตาม การที่หน้าเว็บแสดงผลไม่ได้หมายความว่าหน้าเว็บโหลดเสร็จแล้ว การโต้ตอบที่เกิดขึ้นระหว่างการโหลดอาจล่าช้าเนื่องจากหน้าเว็บกําลังประเมินสคริปต์ แม้ว่าจะยังรับประกันไม่ได้ว่าการโต้ตอบจะเกิดขึ้น ณ เวลานี้ แต่เนื่องจากสคริปต์ที่มีการโต้ตอบอาจยังไม่ได้โหลด แต่ก็อาจมีการโต้ตอบที่ต้องอาศัย JavaScript ที่พร้อมใช้งาน หรือการโต้ตอบไม่ขึ้นอยู่กับ JavaScript เลย

ความสัมพันธ์ระหว่างสคริปต์กับงานที่ประเมิน

วิธีที่ระบบเริ่มงานที่มีส่วนรับผิดชอบในการประเมินสคริปต์จะขึ้นอยู่กับว่าสคริปต์ที่คุณโหลดนั้นโหลดมาพร้อมกับองค์ประกอบ <script> ทั่วไป หรือสคริปต์เป็นโมดูลที่โหลดมาพร้อมกับ type=module เนื่องจากเบราว์เซอร์มีแนวโน้มที่จะจัดการกับสิ่งต่างๆ ที่แตกต่างกันออกไป ดังนั้นเครื่องมือหลักของเบราว์เซอร์ในการจัดการการประเมินสคริปต์จึงขึ้นอยู่กับลักษณะการทำงานของการประเมินสคริปต์ในแต่ละเบราว์เซอร์ที่แตกต่างกัน

สคริปต์ที่โหลดด้วยองค์ประกอบ <script>

โดยทั่วไปแล้ว จำนวนงานที่ส่งไปประเมินสคริปต์จะมีความสัมพันธ์โดยตรงกับจํานวนองค์ประกอบ <script> ในหน้าเว็บ องค์ประกอบ <script> แต่ละรายการจะเริ่มต้นงานเพื่อประเมินสคริปต์ที่ขอเพื่อให้สามารถแยกวิเคราะห์ คอมไพล์ และดำเนินการได้ กรณีนี้เกิดขึ้นกับเบราว์เซอร์ที่ใช้ Chromium, Safari และ Firefox

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

คุณสามารถแบ่งงานการประเมินสคริปต์โดยหลีกเลี่ยงการโหลด JavaScript กลุ่มใหญ่ และโหลดสคริปต์ขนาดเล็กลงให้เหมาะกับแต่ละบุคคลมากขึ้นโดยใช้องค์ประกอบ <script> เพิ่มเติม

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

งานหลายอย่างที่เกี่ยวข้องกับการประเมินสคริปต์ตามที่แสดงในภาพในเครื่องมือวิเคราะห์ประสิทธิภาพของ Chrome DevTools เนื่องจากมีการโหลดสคริปต์ขนาดเล็กหลายรายการแทนสคริปต์ขนาดใหญ่จำนวนน้อย งานจึงมีแนวโน้มที่จะกลายเป็นงานที่ใช้เวลานานน้อยลง ซึ่งช่วยให้เธรดหลักตอบสนองต่ออินพุตของผู้ใช้ได้เร็วขึ้น
ระบบสร้างงานหลายรายการเพื่อประเมินสคริปต์อันเป็นผลมาจากองค์ประกอบ <script> หลายรายการที่มีอยู่ใน HTML ของหน้า วิธีนี้ดีกว่าการส่งกลุ่มสคริปต์ขนาดใหญ่รายการเดียวไปยังผู้ใช้ เนื่องจากมีแนวโน้มที่จะบล็อกเธรดหลัก

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

สคริปต์ที่โหลดด้วยองค์ประกอบ <script> และแอตทริบิวต์ type=module

ตอนนี้คุณสามารถโหลดโมดูล ES แบบเนทีฟในเบราว์เซอร์ได้แล้วด้วยแอตทริบิวต์ type=module ในองค์ประกอบ <script> วิธีการโหลดสคริปต์นี้มีข้อดีบางอย่างสำหรับนักพัฒนาซอฟต์แวร์ เช่น ไม่ต้องเปลี่ยนรูปแบบโค้ดเพื่อใช้งานในเวอร์ชันที่ใช้งานจริง โดยเฉพาะเมื่อใช้ร่วมกับแผนที่การนําเข้า อย่างไรก็ตาม การโหลดสคริปต์ในลักษณะนี้จะกำหนดเวลางานของแต่ละเบราว์เซอร์ที่แตกต่างกัน

เบราว์เซอร์แบบ Chromium

ในเบราว์เซอร์อย่าง Chrome หรือเบราว์เซอร์ที่มาจาก Chrome การโหลดโมดูล ES โดยใช้แอตทริบิวต์ type=module จะสร้างงานประเภทต่างๆ แตกต่างจากที่คุณเห็นตามปกติเมื่อไม่ได้ใช้ type=module เช่น งานสำหรับสคริปต์ของโมดูลแต่ละรายการจะทำงานซึ่งเกี่ยวข้องกับกิจกรรมที่มีป้ายกำกับว่าคอมไพล์โมดูล

การคอมไพล์โมดูลในหลายงานตามที่แสดงในภาพในเครื่องมือสำหรับนักพัฒนาเว็บใน Chrome
ลักษณะการโหลดโมดูลในเบราว์เซอร์ที่ใช้ Chromium สคริปต์แต่ละข้อบังคับจะสร้างการเรียกคอมไพล์ข้อบังคับเพื่อคอมไพล์เนื้อหาก่อนการประเมิน

เมื่อคอมไพล์โมดูลแล้ว โค้ดที่ทำงานในโมดูลนั้นๆ จะเริ่มต้นกิจกรรมที่ติดป้ายกํากับว่าประเมินโมดูล

การประเมินโมดูลแบบทันท่วงทีตามที่แสดงในแผงประสิทธิภาพของเครื่องมือสำหรับนักพัฒนาเว็บใน Chrome
เมื่อโค้ดในโมดูลทำงาน ระบบจะประเมินโมดูลนั้นในทันท่วงที

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

  • โค้ดโมดูลทั้งหมดจะทำงานในโหมดเข้มงวดโดยอัตโนมัติ ซึ่งทำให้เครื่องมือ JavaScript มีโอกาสเพิ่มประสิทธิภาพสูงสุด ซึ่งไม่สามารถทำได้ในบริบทที่ไม่เข้มงวด
  • ระบบจะถือว่าสคริปต์ที่โหลดโดยใช้ type=module เป็นสคริปต์ที่เลื่อนไว้โดยค่าเริ่มต้น คุณสามารถใช้แอตทริบิวต์ async ในสคริปต์ที่โหลดด้วย type=module เพื่อเปลี่ยนลักษณะการทำงานนี้ได้

Safari และ Firefox

เมื่อโหลดโมดูลใน Safari และ Firefox ระบบจะประเมินแต่ละโมดูลในภารกิจแยกกัน ซึ่งหมายความว่าในทางทฤษฎี คุณสามารถโหลดโมดูลระดับบนสุดโมดูลเดียวที่มีเฉพาะคำสั่ง static import ไปยังโมดูลอื่นๆ และโมดูลที่โหลดทุกโมดูลจะทำให้เกิดคำขอเครือข่ายและงานแยกต่างหากเพื่อประเมิน

สคริปต์ที่โหลดด้วย import() แบบไดนามิก

import()แบบไดนามิกเป็นวิธีโหลดสคริปต์อีกวิธีหนึ่ง การเรียก import() แบบไดนามิกสามารถปรากฏที่ใดก็ได้ในสคริปต์เพื่อโหลด JavaScript บางส่วนตามคําขอ ซึ่งแตกต่างจากคำสั่ง import แบบคงที่ที่ต้องอยู่ด้านบนของโมดูล ES เทคนิคนี้เรียกว่าการแยกโค้ด

import() แบบไดนามิกมีข้อดี 2 ข้อในการปรับปรุง INP ดังนี้

  1. โมดูลที่เลื่อนเวลาการโหลดไปไว้ภายหลังจะลดการแย่งชิงของเธรดหลักระหว่างการเริ่มต้นระบบโดยการลดจํานวน JavaScript ที่โหลดในเวลานั้น ซึ่งจะช่วยเพิ่มพื้นที่ว่างของเธรดหลักเพื่อให้ตอบสนองต่อการโต้ตอบของผู้ใช้ได้ดียิ่งขึ้น
  2. เมื่อมีการเรียกใช้ import() แบบไดนามิก การเรียกใช้แต่ละครั้งจะแยกการรวบรวมและการประเมินของแต่ละโมดูลออกเป็นงานของตนเองอย่างมีประสิทธิภาพ แน่นอนว่า import() แบบไดนามิกที่โหลดโมดูลขนาดใหญ่มากจะเริ่มต้นงานการประเมินสคริปต์ที่ค่อนข้างใหญ่ และอาจรบกวนความสามารถของเทรดหลักในการตอบกลับอินพุตของผู้ใช้ หากการโต้ตอบเกิดขึ้นพร้อมกับการเรียกใช้ import() แบบไดนามิก ดังนั้น สิ่งสำคัญก็คือคุณต้องโหลด JavaScript ให้น้อยที่สุดเท่าที่จะทำได้

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

สคริปต์ที่โหลดในเว็บเวิร์กเกอร์

เวิร์กเกอร์เว็บเป็นกรณีการใช้งาน JavaScript พิเศษ ระบบจะลงทะเบียนเวิร์กเกอร์เว็บในเธรดหลัก จากนั้นโค้ดภายในเวิร์กเกอร์จะทำงานในเธรดของตัวเอง การดำเนินการนี้มีประโยชน์อย่างมากในแง่ที่ว่าในขณะที่โค้ดที่ลงทะเบียน Web Worker ทำงานบนเธรดหลัก โค้ดภายใน Web Worker จะไม่ทำงาน ซึ่งจะช่วยลดการแออัดของเธรดหลัก และช่วยให้เธรดหลักตอบสนองต่อการโต้ตอบของผู้ใช้ได้ดียิ่งขึ้น

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

ข้อดีและข้อเสียที่ต้องพิจารณา

แม้ว่าการแยกสคริปต์ออกเป็นไฟล์ขนาดเล็กๆ แยกกันจะช่วยจำกัดงานที่ใช้เวลานานได้ แทนที่จะโหลดไฟล์ขนาดใหญ่จำนวนน้อยลง แต่คุณก็ควรพิจารณาบางสิ่งเมื่อตัดสินใจว่าจะแยกสคริปต์อย่างไร

ประสิทธิภาพการบีบอัด

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

เครื่องมือรวมเป็นเครื่องมือที่เหมาะสําหรับจัดการขนาดเอาต์พุตสําหรับสคริปต์ที่เว็บไซต์ของคุณใช้อยู่

  • สำหรับ webpack นั้น ปลั๊กอิน SplitChunksPlugin จะช่วยได้ โปรดดูตัวเลือกที่คุณตั้งค่าได้เพื่อช่วยจัดการขนาดชิ้นงานในเอกสารประกอบของ SplitChunksPlugin
  • สำหรับเครื่องมือรวมอื่นๆ เช่น Rollup และ esbuild คุณสามารถจัดการขนาดไฟล์สคริปต์ได้โดยใช้การเรียก import() แบบไดนามิกในโค้ด เครื่องมือจัดกลุ่มเหล่านี้และ webpack จะแยกชิ้นงานที่นำเข้าแบบไดนามิกออกเป็นไฟล์ของตัวเองโดยอัตโนมัติ จึงหลีกเลี่ยงไม่ให้กลุ่มเริ่มต้นมีขนาดใหญ่

การทำให้แคชใช้งานไม่ได้

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

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

โมดูลที่ฝังอยู่และประสิทธิภาพการโหลด

หากคุณจะจัดส่งโมดูล ES ในเวอร์ชันที่ใช้งานจริงและโหลดด้วยแอตทริบิวต์ type=module โปรดทราบว่าการฝังโมดูลอาจส่งผลต่อเวลาเริ่มต้นอย่างไร การซ้อนโมดูลหมายถึงเมื่อโมดูล ES นำเข้าโมดูล ES อื่นแบบคงที่ที่นำเข้าโมดูล ES อื่นแบบคงที่ ดังนี้

// a.js
import {b} from './b.js';

// b.js
import {c} from './c.js';

หากโมดูล ES ไม่ได้รวมกลุ่มไว้ด้วยกัน รหัสก่อนหน้าจะส่งผลให้เกิดห่วงโซ่คำขอเครือข่าย: เมื่อมีการขอ a.js จากองค์ประกอบ <script> จะมีการส่งคำขอเครือข่ายอื่นสำหรับ b.js ซึ่งจะรวมถึงคำขออื่นสำหรับ c.js วิธีหนึ่งในการหลีกเลี่ยงปัญหานี้คือการใช้เครื่องมือรวม แต่อย่าลืมกําหนดค่าเครื่องมือรวมให้แบ่งสคริปต์เพื่อกระจายงานการประเมินสคริปต์

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

บทสรุป

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

เพื่อเป็นการสรุป ต่อไปนี้คือสิ่งที่คุณสามารถทำได้เพื่อแบ่งงานการประเมินสคริปต์ขนาดใหญ่

  • เมื่อโหลดสคริปต์โดยใช้องค์ประกอบ <script> ที่ไม่มีแอตทริบิวต์ type=module ให้หลีกเลี่ยงการโหลดสคริปต์ที่มีขนาดใหญ่มาก เนื่องจากจะเริ่มต้นงานการประเมินสคริปต์ที่ต้องใช้ทรัพยากรมากซึ่งบล็อกเธรดหลัก กระจายสคริปต์ไปยังองค์ประกอบ <script> เพิ่มเติมเพื่อแบ่งงานนี้
  • การใช้แอตทริบิวต์ type=module เพื่อโหลดโมดูล ES ในเบราว์เซอร์โดยตรงจะเริ่มต้นแต่ละงานเพื่อประเมินสคริปต์โมดูลแยกต่างหากแต่ละรายการ
  • ลดขนาดของ App Bundle เริ่มต้นโดยใช้การเรียก import() แบบไดนามิก การดำเนินการนี้ยังใช้ได้กับเครื่องมือรวมไฟล์ด้วย เนื่องจากเครื่องมือรวมไฟล์จะถือว่าแต่ละโมดูลที่นําเข้าแบบไดนามิกเป็น "จุดแยก" ซึ่งจะส่งผลให้มีการสร้างสคริปต์แยกต่างหากสําหรับแต่ละโมดูลที่นําเข้าแบบไดนามิก
  • อย่าลืมพิจารณาข้อดีข้อเสีย เช่น ประสิทธิภาพการบีบอัดและการเลิกใช้แคช สคริปต์ขนาดใหญ่จะบีบอัดได้ดีกว่า แต่มีแนวโน้มที่จะเกี่ยวข้องกับงานการประเมินสคริปต์ที่มีราคาแพงกว่าในจำนวนงานที่น้อยลง และส่งผลให้แคชของเบราว์เซอร์ใช้งานไม่ได้ ซึ่งทำให้ประสิทธิภาพการแคชโดยรวมลดลง
  • หากใช้โมดูล ES แบบเนทีฟโดยไม่มีการรวมกลุ่ม ให้ใช้คำแนะนำเกี่ยวกับทรัพยากร modulepreload เพื่อเพิ่มประสิทธิภาพการโหลดโมดูลดังกล่าวในช่วงเริ่มต้นใช้งาน
  • และเช่นเคย โปรดจัดส่ง JavaScript ให้น้อยที่สุดเท่าที่จะทำได้

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