รหัส Jquery ควรอยู่ในส่วนหัวหรือส่วนท้ายหรือไม่


190

ที่ที่ดีที่สุดในการใส่รหัส Jquery (หรือแยกไฟล์ Jquery) อยู่ที่ไหน หน้าเว็บจะโหลดเร็วขึ้นหรือไม่ถ้าฉันวางไว้ในท้ายกระดาษ?


คำตอบ:


189

สคริปต์ทั้งหมดควรโหลดครั้งสุดท้าย

ในทุกกรณีมันเป็นการดีที่สุดที่จะวางการอ้างอิงสคริปต์ทั้งหมดของคุณไว้ที่ส่วนท้ายของหน้าก่อนหน้า</body>นี้

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

<script src="my.js" type="text/javascript" defer="defer"></script>

กรณีขอบ

มีบางกรณีขอบมี แต่ที่คุณอาจพบริบหรี่หน้าหรือวัตถุอื่น ๆ ในระหว่างการโหลดหน้าเว็บซึ่งสามารถจะแก้ไขได้โดยเพียงแค่วางอ้างอิงสคริปต์ jQuery คุณใน<head>แท็กโดยไม่ต้องdeferแอตทริบิวต์ กรณีเหล่านี้รวมถึง jQuery UI และส่วนเสริมอื่น ๆ เช่น jCarousel หรือ Treeview ซึ่งแก้ไข DOM เป็นส่วนหนึ่งของฟังก์ชันการทำงาน


คำเตือนเพิ่มเติม

มีบางไลบรารีที่ต้องโหลดก่อนหน้า DOM หรือ CSS เช่น polyfills Modernizr เป็นหนึ่งในห้องสมุดดังกล่าวว่าจะต้องอยู่ในแท็กหัว


5
ดีพิจารณานี้themeforest.net/item/portfolious-professional-business-template/... มันเป็นชุดรูปแบบของไซต์ที่ฉันเพิ่งซื้อซึ่งคุณสมบัติในหน้าแรกของการใช้ jQuery กับ jCarousel เมื่อฉันย้ายบล็อกสคริปต์จากหัวไปยังจุดสิ้นสุดของไฟล์ฉันสังเกตเห็นภาพที่ใช้ในม้าหมุนทั้งหมดจะปรากฏขึ้นในครั้งเดียวในระหว่างการโหลดหน้าในขณะที่เมื่อไฟล์สคริปต์อยู่ในหัวหน้าจะโหลดได้อย่างราบรื่นมากขึ้น
Chad Levy

5
ใช้ CSS เพื่อตั้งค่าสถานะเริ่มต้นของเนื้อหา CSS ควรอยู่ในหัว การทำลายบางสิ่งบางอย่างเพื่อให้งานอื่นไม่ได้เป็นทางออก หากผู้เข้าชมต้องรอให้ jQuery และปลั๊กอินที่เกี่ยวข้องทั้งหมดโหลดก่อนแสดงเนื้อหาใด ๆ เธออาจไม่ยาวพอที่จะดูเนื้อหา
Duncan

9
ChadLevy เป็นขวา: มีเงื่อนไขบางอย่างภายใต้ปลั๊กอิน jQuery <head>ทำงานได้ดีขึ้นหากพวกเขากำลังอ้างถึงใน หากมาร์กอัปของคุณขึ้นอยู่กับปลั๊กอิน jQuery ที่คัดแยกเนื้อหาสำหรับคุณมันไม่มีเหตุผลที่จะวางการอ้างอิงปลั๊กอินที่ด้านล่างของหน้าเว็บในขณะที่คุณจะได้รับมาร์กอัปขี้ขลาดในหน้าเว็บของคุณจนกว่าปลั๊กอินจะโหลด มีการตั้งใจทำตามกฎจนกว่าพวกเขาจะไม่ทำงานอีกต่อไปกฎข้อใดควรถูกทำลาย
Robert Harvey

2
@Duncan: เป็นการดีที่จะเป็นกรณีที่คุณสามารถควบคุมการพึ่งพาทั้งหมดได้ สิ่งที่เกี่ยวกับ jQuery (สิ่งที่เจาะจงมากขึ้นเช่น jQuery UI และส่วนเสริมอื่น ๆ ) คือการออกแบบที่คุณไม่สามารถควบคุมการทำงานได้อย่างสมบูรณ์ดังนั้นการเพิ่มบางอย่างเช่นแอตทริบิวต์การมองเห็นให้กับองค์ประกอบ DOM เพื่อให้โหลดได้อย่างสง่างามอาจเป็นไปไม่ได้ถ้า ส่วนเสริมที่ใช้องค์ประกอบนั้นจะไม่คำนึงถึงแอตทริบิวต์ที่กล่าวไว้ บางครั้งมันเป็นการดีกว่าที่จะต่อต้านการประชุมที่เรียบง่ายกว่าพยายามที่จะได้รับการพึ่งพาในการทำงานแบบที่คุณต้องการ
Chad Levy

2
@Stefan: หากปลั๊กอิน jQuery ของคุณไม่ได้รับอนุญาตให้จัดการ DOM ก็จะมีประเด็นอะไร?
Robert Harvey

229

ใส่สคริปต์ที่ด้านล่าง

ปัญหาที่เกิดจากสคริปต์คือบล็อกการดาวน์โหลดแบบขนาน ข้อกำหนด HTTP / 1.1 แนะนำว่าเบราว์เซอร์ดาวน์โหลดไม่เกินสององค์ประกอบในแบบคู่ขนานต่อชื่อโฮสต์ หากคุณแสดงรูปภาพจากชื่อโฮสต์หลายชื่อคุณสามารถดาวน์โหลดมากกว่าสองครั้งเพื่อให้เกิดขนาน ในขณะที่สคริปต์กำลังดาวน์โหลดอย่างไรก็ตามเบราว์เซอร์จะไม่เริ่มการดาวน์โหลดอื่น ๆ แม้แต่ในชื่อโฮสต์ที่ต่างกัน ในบางสถานการณ์การย้ายสคริปต์ไปที่ด้านล่างไม่ใช่เรื่องง่าย ตัวอย่างเช่นหากสคริปต์ใช้ document.write เพื่อแทรกเนื้อหาบางส่วนของหน้าเว็บจะไม่สามารถย้ายลงในหน้านั้นได้ อาจมีปัญหาการกำหนดขอบเขต ในหลายกรณีมีวิธีแก้ไขสถานการณ์เหล่านี้

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

แก้ไข: Firefox รองรับแอตทริบิวต์ DEFER ตั้งแต่รุ่น 3.6

แหล่งที่มา:


4
ฉันเห็นคำแนะนำที่ทันสมัยว่าควรวางสคริปต์ไว้ที่ด้านบนสุด การวางสคริปต์ที่ด้านล่างจะอนุญาตให้โหลดรูปภาพและเนื้อหาอื่น ๆ ในเนื้อความของหน้าเว็บแบบขนาน แต่จะทำให้สคริปต์ในหน้านั้นโหลดได้อย่างมีประสิทธิภาพในภายหลัง - ต้องดาวน์โหลดเนื้อหา HTML ทั้งหมดก่อนที่เบราว์เซอร์จะรู้เกี่ยวกับ สคริปต์ URL ที่จะโหลด คนส่วนใหญ่อ้างอิงคู่มือ Yahoo ซึ่งไม่ถูกต้องอีกต่อไป - Firefox ให้เกียรติแอตทริบิวต์ที่เลื่อนออกไปของสคริปต์ การเลื่อนออกไปที่ด้านบนจะทำให้โหลดหน้าได้เร็วขึ้นหากคุณวัด
ShadowChaser

ฉันสามารถดูสถิติเกี่ยวกับความเร็วในการโหลดหน้าเว็บด้วยวิธีนี้ได้หรือไม่?
Gabriel Alack

1
Firefox รองรับคุณสมบัติ DEFER ตั้งแต่รุ่น 3.6 ที่มา: w3schools.com/tags/att_script_defer.asp
Nikita 웃

1
อัปเดต: ตั้งแต่ต้น / กลางปี ​​2559 เบราว์เซอร์สมัยใหม่ทั้งหมดได้เพิ่มจำนวนการเชื่อมต่อต่อชื่อโฮสต์เป็นอย่างน้อย 6
Night Owl

32

โหลด jQuery เท่านั้นเองที่ส่วนหัวผ่าน CDN แน่นอน

ทำไม? ในบางสถานการณ์คุณอาจรวมเทมเพลตบางส่วน (เช่นตัวอย่างข้อมูลการลงชื่อเข้าใช้ ajax) ด้วยโค้ดพึ่งพา jQuery หากมีการโหลด jQuery ที่ด้านล่างของหน้าคุณจะได้รับข้อผิดพลาด "$ ไม่ได้กำหนด" ดีมาก

มีวิธีที่จะแก้ปัญหานี้แน่นอน (เช่นไม่ฝัง JS ใด ๆ และผนวกกับภาระที่ด้านล่าง js กำ) แต่ทำไมสูญเสียเสรีภาพในการ js โหลดอย่างเฉื่อยชาที่ความสามารถในการวาง jQuery รหัสขึ้นอยู่ทุกที่ที่คุณโปรด ? เอ็นจิ้น Javascript ไม่สนใจว่าโค้ดอยู่ใน DOM ตราบใดที่การพึ่งพา (เช่นโหลด jQuery) พอใจ

สำหรับไฟล์ js ทั่วไป / ที่ใช้ร่วมกันของคุณใช่ให้วางไว้ก่อนหน้า</body>นี้ แต่สำหรับข้อยกเว้นที่ทำให้การบำรุงรักษาแอปพลิเคชันควรใช้สติปัญญาเพื่อติดตั้งข้อมูลโค้ดที่ขึ้นกับ jQuery หรือการอ้างอิงไฟล์ที่นั่นใน html นั้น

ไม่มีประสิทธิภาพในการโหลด jquery ที่ส่วนหัว เบราว์เซอร์ใดบนโลกที่ไม่มีไฟล์ jQuery CDN ในแคช

กังวลใจมากเกี่ยวกับสิ่งใดติด jQuery ในหัวและปล่อยให้ js อิสระของคุณครอง


1
เบราว์เซอร์จำนวนมากไม่; ประมาณ 2% เป็นตัวเลขที่สูงที่สุดที่ฉันเคยอ่านเมื่อคุณพิจารณาเวอร์ชันและการแคชจริงขึ้นอยู่กับชื่อทรัพยากรที่แน่นอนดังนั้น jquery1.4.2 จึงไม่เหมือนกับ jquery1.7 หรือ 1.9.1 หรือ .. .
Toni Leigh

ในบรรดาที่2%กล่าวว่าครึ่งหนึ่งจะออกไปก่อนที่หน้าโหลดเป็นครั้งแรก วิธีนี้ทำให้คุณสูญเสีย1%ผู้เข้าชม แต่อาจช่วยคุณประหยัดเวลาและปัญหาในการพัฒนาตัวเอง ดูว่านี้ทำให้รู้สึกกับรูปแบบธุรกิจของคุณ ...
OSA

13

Nimbuzให้คำอธิบายที่ดีมากเกี่ยวกับปัญหาที่เกี่ยวข้อง แต่ฉันคิดว่าคำตอบสุดท้ายขึ้นอยู่กับหน้าของคุณ: สิ่งที่สำคัญกว่าสำหรับผู้ใช้ที่จะมีเร็ว - สคริปต์หรือภาพ?

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

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

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


คุณมีฉันจนกว่าคุณจะลากออกอาร์กิวเมนต์การเพิ่มประสิทธิภาพก่อนวัยอันควร นั่นเป็นเพียงกฎอีกข้อหนึ่งที่ผู้คนปฏิบัติตามอย่างไร้เหตุผลโดยไม่เข้าใจนัยยะของมัน
Robert Harvey

6
โอ้ไม่ชนะเลย! ฉันเชื่อว่าฉันเข้าใจความหมายของมัน :)
EMP

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

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

@ ดันแคนใช่นั่นเป็นแนวทางของฉัน ฉันวางปลั๊กอินที่ด้านล่างและเมื่อฉันมีปัญหาฉันวางมันไว้ที่ด้านบนและนั่นก็แก้ไขปัญหาได้
Robert Harvey

6

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


5

การปฏิบัติมาตรฐานคือการวางสคริปต์ทั้งหมดของคุณไว้ที่ด้านล่างของหน้า แต่ฉันใช้ ASP.NET MVC กับปลั๊กอิน jQuery จำนวนหนึ่งและฉันพบว่ามันทำงานได้ดีขึ้นถ้าฉันวางสคริปต์ jQuery ของฉันไว้ใน<head>ส่วนของต้นแบบ หน้า.

ในกรณีของฉันมีสิ่งประดิษฐ์ที่เกิดขึ้นเมื่อโหลดหน้าเว็บหากสคริปต์อยู่ที่ด้านล่างของหน้า ฉันใช้ปลั๊กอิน jQuery TreeView และหากสคริปต์ไม่โหลดตอนต้นแผนผังจะแสดงผลโดยไม่มีคลาส CSS ที่จำเป็นซึ่งปลั๊กอินกำหนดไว้ ดังนั้นคุณจะได้รับสิ่งที่ดูตลกนี้เมื่อเพจโหลดครั้งแรกตามด้วยการเรนเดอร์ที่เหมาะสมของ TreeView ดูไม่ดีมาก การวางปลั๊กอิน jQuery ใน<head>ส่วนของหน้าต้นแบบจะช่วยขจัดปัญหานี้


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

ไม่การใส่ตัวระบุ / สไตล์ CSS ในมาร์กอัป (แทนที่จะรอให้ jQuery ทำบน DOM พร้อม) แก้ปัญหาได้
Dan Beam

1
@Dan Beam: Treeview บรรจุจากตารางฐานข้อมูลและสไตล์ของ Treeview ถูกกำหนดโดยปลั๊กอิน Treeview ตามเนื้อหาของตารางดังนั้นไม่ว่าจะไม่ได้ผล
Robert Harvey

1
ทำไมฉันถึงต้องทำอย่างนั้นเมื่อฉันสามารถวางสคริปต์ Treeview Plugin ที่ไม่ได้แก้ไขที่ด้านบนของหน้าและมันจะใช้ได้ดี? นั่นไม่สมเหตุสมผลเลย Dan
Robert Harvey

1
ไชโยโรเบิร์ตฉันยังใช้ ASP.NETMVC กับฟอร์มใน partials เหมาะสมที่จะเก็บจาวาสคริปต์ไว้ในบางส่วนเนื่องจากมีการกำหนดฟิลด์ใหม่อีกครั้งในแต่ละครั้งที่มีการประมวลผลบางส่วน (พูดเพื่อตรวจสอบความถูกต้อง) ฉันประสบปัญหานี้เมื่อพยายามใช้@Html.Actionซึ่งเขียนผลลัพธ์ไปยังเอาต์พุตแบบไดนามิกเนื่องจากบางส่วนของฉันให้$ is undefinedความหมายฉันต้องใช้. load ('@ Url.Action') เพื่อโหลดบางส่วน แต่สิ่งนี้ให้ fouc เนื่องจากการร้องขอพิเศษ จากข้อมูลที่คุณป้อนฉันจะย้าย jQuery เหนือ RenderBody () ในหน้าหลักของฉัน
Malkin

4

แม้ว่าเว็บไซต์เกือบทั้งหมดจะยังคงวาง Jquery และ javascript อื่น ๆ ไว้ที่ส่วนหัว: D แม้ตรวจสอบ stackoverflow.com

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

และหลังจากวางจาวาสคริปต์ไว้ที่ส่วนท้ายคุณอาจมีลักษณะผิดปกติของหน้าเว็บของคุณจนกว่าจะโหลดจาวาสคริปต์ดังนั้นจึงวาง css ไว้ในส่วนหัวของคุณ


2
แต่คุณสามารถบรรลุสิ่งเดียวกันโดยใช้การเลื่อนสคริปต์ w3schools.com/tags/att_script_defer.asp
Jack Tuck

2

ก่อนหน้า</body>นี้เป็นสถานที่ที่ดีที่สุดตามแนวทางปฏิบัติที่ดีที่สุดของYahoo Developer Network สำหรับการเพิ่มความเร็วเว็บไซต์ของคุณ ลิงค์นี้เหมาะสม

สิ่งที่ดีที่สุดที่จะทำคือการทดสอบด้วยตัวเอง


0

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

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