JavaScript ที่ไม่สร้างความรำคาญ: <script> ที่ด้านบนหรือด้านล่างของโค้ด HTML?


91

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

แต่ที่ไหนกันแน่และเมื่อไหร่?

เราควรใส่ก่อนปิด</html>หรือหลัง? และเหนือสิ่งอื่นใดเมื่อเราควรใส่ไว้ใน<head>ส่วนนี้?


คำตอบ:


87

มีความเป็นไปได้สองประการสำหรับสคริปต์ที่ไม่สร้างความรำคาญอย่างแท้จริง:

  • รวมถึงไฟล์สคริปต์ภายนอกผ่านแท็กสคริปต์ในส่วน head
  • รวมถึงไฟล์สคริปต์ภายนอกผ่านแท็กสคริปต์ที่ด้านล่างของเนื้อหา (ก่อนหน้า</body></html>)

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

หากไซต์สคริปต์ภายนอกอยู่ในโดเมนอื่น (เช่นวิดเจ็ตภายนอก) อาจคุ้มค่าที่จะวางไว้ที่ด้านล่างเพื่อหลีกเลี่ยงการโหลดหน้าเว็บล่าช้า

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


13
เกี่ยวกับสคริปต์ที่มีส่วน 'พร้อม' การวางสคริปต์นั้นไว้ที่ด้านล่างของเนื้อหาจะเป็นการรับประกันว่า DOM พร้อมที่จะจัดการหากคุณใส่ไว้ในหัวคุณต้องห่อไว้เพื่อรอเหตุการณ์ DOMReady (หรือคล้ายกัน)
Juan Mendes

4
@ Juan ใช่เป็นเช่นนั้น แต่ด้วยการวางสคริปต์ที่ด้านล่างคุณจะทำให้เหตุการณ์ DOMReady ล่าช้าตามระยะเวลาที่เบราว์เซอร์ต้องใช้ในการแยกวิเคราะห์เอกสารและประมวลผลองค์ประกอบส่วนหัว (200-500 มิลลิวินาที) ก่อนที่จะร้องขอสคริปต์นั้น . ส่วนใหญ่ในการโหลดหน้าแรก (สมมติว่าสามารถแคชได้จากที่นั่น) ในขณะที่ถ้าคุณวางไว้ที่ศีรษะ น่าจะพร้อมเร็วกว่ามาก ดังนั้นเมื่อคำนึงถึง HTML5 แล้วหากสคริปต์ต้องแก้ไขเค้าโครงเมื่อ DOM พร้อมตอนนี้คุณควรใช้สคริปต์ "async" หรือ "defer" ในส่วนหัว
hexalys

31

ไม่เคยขาดและแห้ง - Yahoo แนะนำให้วางสคริปต์ไว้หน้า</body>แท็กปิดซึ่งจะสร้างภาพลวงตาว่าหน้าเว็บโหลดเร็วขึ้นบนแคชว่าง (เนื่องจากสคริปต์จะไม่บล็อกการดาวน์โหลดส่วนที่เหลือของเอกสาร) อย่างไรก็ตามหากคุณมีโค้ดบางโค้ดที่ต้องการเรียกใช้ในการโหลดเพจโค้ดจะเริ่มดำเนินการหลังจากโหลดทั้งเพจแล้วเท่านั้น หากคุณใส่สคริปต์ใน<head>แท็กสคริปต์จะเริ่มดำเนินการก่อนดังนั้นในแคชที่เตรียมไว้แล้วหน้าเว็บจะโหลดได้เร็วขึ้น

นอกจากนี้สิทธิ์ในการวางสคริปต์ที่ด้านล่างของหน้าก็ไม่สามารถใช้ได้เสมอไป หากคุณต้องการรวมสคริปต์แบบอินไลน์ในมุมมองของคุณที่ขึ้นอยู่กับไลบรารีหรือโค้ด JavaScript อื่น ๆ ที่โหลดมาก่อนคุณต้องโหลดการอ้างอิงเหล่านั้นใน<head>แท็ก

คำแนะนำทั้งหมดของ Yahoo นั้นน่าสนใจ แต่ใช้ไม่ได้เสมอไปและควรพิจารณาเป็นกรณี ๆ ไป


1
หากคุณมี javscript ที่ไม่สร้างความรำคาญคุณจะไม่มีตัวอย่างข้อมูลแบบอินไลน์คำถามที่กล่าวถึงโดยเฉพาะอย่างไม่เป็นการรบกวน
Juan Mendes

1
<script>แท็กแบบอินไลน์ไม่ได้หมายความถึงจาวาสคริปต์ที่น่ารำคาญ
Eran Galperin

@Eric Galperin: อะไรคือการใช้แท็กสคริปต์แบบอินไลน์ที่ไม่เป็นการรบกวน?
Juan Mendes

4
@Juan ดื้อ Javascript หมายความว่า UI เสียหากไม่มีหรือฝังอยู่ในมาร์กอัป <script>แท็กแยกจากมาร์กอัปและสามารถใช้กับโค้ดที่ปรับปรุงอินเทอร์เฟซได้ แต่ไม่จำเป็นต้องใช้ ดังนั้นจึงไม่มีสิ่งใดมารบกวน<script>แท็กแบบอินไลน์
Eran Galperin

4
1. ชื่อของฉันคือ Eran ไม่ใช่ Eric 2. เมื่อคุณต้องการส่งผ่านข้อมูลไปยัง Javascript จากภาษาฝั่งเซิร์ฟเวอร์ในการวนซ้ำหากรายการต่างๆเช่นคุณอาจใช้<script>แท็กเพื่อเข้ารหัสค่าเหล่านั้นให้เป็นตัวแปรจาวาสคริปต์เพื่อใช้กับ การแก้ไขแบบอินไลน์หรือพฤติกรรมอื่น ๆ ที่คล้ายคลึงกัน
Eran Galperin

22

อย่างที่คนอื่นบอกให้วางไว้หน้าแท็กhtml เนื้อหา ปิด

เมื่อวันก่อนเราได้รับโทรศัพท์จำนวนมากจากลูกค้าที่บ่นว่าไซต์ของพวกเขาทำงานช้ามาก เราไปเยี่ยมพวกเขาในพื้นที่และพบว่าพวกเขาใช้เวลา 20-30 วินาทีในการโหลดหน้าเดียว คิดว่าเป็นเซิร์ฟเวอร์ที่ทำงานได้ไม่ดีเราจึงเข้าสู่ระบบ - แต่เซิร์ฟเวอร์ทั้งเว็บและ sql มีกิจกรรม ~ 0%

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

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


10
เรื่องเด็ด :) แต่อย่างจริงจังนี่เป็นข้อโต้แย้งที่น่าสนใจที่สุดที่ฉันเคยเห็นในการวางแท็กสคริปต์ที่ด้านล่างของหน้า
user271608

16

สรุปตามคำแนะนำข้างต้น:

  1. สำหรับสคริปต์ภายนอก (การวิเคราะห์ของ Google ตัวติดตามการตลาดของบุคคลที่สาม ฯลฯ ) วางไว้หน้า</body>แท็ก
  2. สำหรับสคริปต์ที่มีผลต่อเค้าโครงหน้าให้วางไว้ในส่วนหัว
  3. สำหรับสคริปต์ที่ใช้ 'dom ready' (เช่น jquery) ให้พิจารณาการวางไว้ก่อน</body>เว้นแต่คุณจะมีเหตุผลในการวางสคริปต์ไว้ในส่วนหัว
  4. หากมีสคริปต์แบบอินไลน์ที่มีการอ้างอิงให้วางสคริปต์ที่ต้องการไว้ในส่วนหัว

6

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

http://developer.yahoo.com/yslow/


5

ไม่ควรจะเป็นหลังจาก</html>นั้นจะไม่ถูกต้อง ตำแหน่งที่ดีที่สุดในการวางสคริปต์คือหน้าไฟล์</body>

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


คุณทราบดีว่าหากคุณกังวลเรื่องความเร็วจริงๆจะไม่มี </body> หรือ </html> แท็กปิดสำหรับประเภทองค์ประกอบเหล่านี้เป็นทางเลือก ใส่ <script> ไว้ท้ายสุดและอย่าลืมใช้ </body> และ </html> ไปเลย
จิม

9
หวังว่าจิมจะประชดประชัน - ไม่ว่าในกรณีใดก็ตามอย่ารับคำแนะนำของเขา XHTML ที่มีรูปแบบดีต้องการแท็กปิดสำหรับทุกองค์ประกอบรวมทั้งแท็ก body และ html หากโค้ดของคุณไม่ใช่ XML ที่ถูกต้องแสดงว่าคุณทำผิด
matt lohkamp

6
ไม่ฉันไม่ได้ประชดประชัน ลองดูที่คำถาม ระบุ HTML ไม่ใช่ XHTML เป็นความจริงที่ XHTML ที่ถูกต้องต้องการสิ่งเหล่านี้ แต่ HTML ที่ถูกต้องไม่ได้ ไม่มีอะไรผิดปกติในการเลือก HTML และการละเว้นแท็กปิดสำหรับประเภทองค์ประกอบเหล่านี้
จิม

2

หากคุณวางไว้ที่ด้านล่างมันจะโหลดครั้งสุดท้ายดังนั้นจึงเร่งความเร็วที่ผู้ใช้สามารถดูหน้าเว็บได้ จำเป็นต้องอยู่ก่อนขั้นสุดท้าย</html>แม้ว่ามิฉะนั้นจะไม่เป็นส่วนหนึ่งของ DOM

หากต้องการรหัสทันทีให้ใส่ไว้ในหัว

ที่ดีที่สุดคือวางสิ่งต่างๆเช่นวิดเจ็ตบล็อกไว้ที่ด้านล่างเพื่อที่ว่าหากไม่โหลดก็จะไม่ส่งผลต่อการใช้งานของหน้า

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