Mã Jquery nên đi trong tiêu đề hoặc chân trang?


Câu trả lời:


189

Tất cả các tập lệnh nên được tải sau cùng

Trong mọi trường hợp, tốt nhất là đặt tất cả các tham chiếu tập lệnh của bạn ở cuối trang, ngay trước đó </body>.

Nếu bạn không thể làm như vậy do các vấn đề về khuôn mẫu và không có gì, hãy trang trí các thẻ script của bạn bằng deferthuộc tính để trình duyệt biết để tải xuống các tập lệnh của bạn sau khi HTML đã được tải xuống:

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

Trường hợp cạnh

Có một số trường hợp cạnh, tuy nhiên, nơi bạn có thể gặp nhấp nháy trang hoặc hiện vật khác trong quá trình tải trang mà thường có thể được giải quyết bằng cách đơn giản là đặt tài liệu tham khảo kịch bản jQuery của bạn vào <head>thẻ mà không cần các deferthuộc tính. Các trường hợp này bao gồm Giao diện người dùng jQuery và các addon khác như jCarousel hoặc Treeview sửa đổi DOM như một phần chức năng của chúng.


Hãy cẩn thận hơn nữa

Có một số thư viện phải được tải trước DOM hoặc CSS, chẳng hạn như polyfill. Modernizr là một trong những thư viện như vậy phải được đặt trong thẻ head .


5
Vâng, hãy xem xét điều này: themeforest.net/item/portfolious-professional-business-template/... . Đây là một chủ đề trang web tôi mới mua gần đây trên trang chủ của nó, sử dụng jQuery với jCarousel. Khi tôi di chuyển các khối tập lệnh từ đầu đến cuối tập tin, tôi nhận thấy các hình ảnh được sử dụng trong băng chuyền sẽ được hiển thị cùng một lúc trong khi tải trang, trong khi đó khi tập tin tập lệnh nằm trong đầu, trang sẽ tải mượt mà hơn.
Chad Levy

5
Sử dụng CSS để đặt trạng thái ban đầu của nội dung. CSS nên đi vào đầu. Phá vỡ một cái gì đó để làm cho một cái gì đó khác làm việc không phải là giải pháp. Nếu khách truy cập phải đợi jQuery và tất cả các plugin được liên kết tải trước khi bất kỳ nội dung nào được hiển thị, cô ấy có thể không ở lại đủ lâu để xem nội dung.
Duncan

9
ChadLevy đã đúng: có một số điều kiện theo đó các plugin jQuery hoạt động tốt hơn nếu chúng được tham chiếu trong <head>. Nếu đánh dấu của bạn phụ thuộc vào plugin jQuery sắp xếp nội dung cho bạn, sẽ không có ý nghĩa gì khi đặt tham chiếu plugin ở cuối trang, vì bạn sẽ nhận được đánh dấu thú vị trong trang web của mình cho đến khi plugin tải. Các quy tắc có nghĩa là phải được tuân theo cho đến khi chúng không hoạt động nữa, tại thời điểm đó các quy tắc nên được phá vỡ.
Robert Harvey

2
@Duncan: Lý tưởng nhất sẽ là trường hợp bạn có thể kiểm soát tất cả các phụ thuộc. Vấn đề về jQuery (cụ thể hơn là những thứ như jQuery UI và các addon khác) là do thiết kế bạn không thể kiểm soát hoàn toàn chức năng của chúng, do đó, việc thêm một cái gì đó như thuộc tính khả năng hiển thị vào một phần tử DOM để nó có thể tải một cách duyên dáng hơn nếu không thể một addon sử dụng phần tử đó sẽ không tính đến thuộc tính đã nói. Đôi khi, tốt hơn là bất chấp một quy ước đơn giản hơn là cố gắng có được sự phụ thuộc để làm việc theo cách bạn muốn.
Chad Levy

2
@Stefan: Nếu các plugin jQuery của bạn không được phép thao túng DOM, vậy thì vấn đề là gì?
Robert Harvey

229

Đặt tập lệnh ở dưới cùng

Vấn đề gây ra bởi các tập lệnh là chúng chặn tải xuống song song. Đặc tả HTTP / 1.1 cho thấy các trình duyệt tải xuống không quá hai thành phần song song trên mỗi tên máy chủ. Nếu bạn phục vụ hình ảnh của mình từ nhiều tên máy chủ, bạn có thể nhận được nhiều hơn hai lần tải xuống song song. Tuy nhiên, trong khi tập lệnh đang tải xuống, trình duyệt sẽ không bắt đầu bất kỳ tải xuống nào khác, ngay cả trên các tên máy chủ khác nhau. Trong một số tình huống, không dễ để di chuyển các tập lệnh xuống dưới cùng. Ví dụ, nếu tập lệnh sử dụng document.write để chèn một phần nội dung của trang, nó không thể được chuyển xuống thấp hơn trong trang. Cũng có thể có vấn đề phạm vi. Trong nhiều trường hợp, có nhiều cách để khắc phục những tình huống này.

Một đề xuất thay thế thường được đưa ra là sử dụng các tập lệnh bị trì hoãn. Thuộc tính DEFER chỉ ra rằng tập lệnh không chứa document.write và là đầu mối cho các trình duyệt mà chúng có thể tiếp tục hiển thị. Thật không may, Firefox không hỗ trợ thuộc tính DEAX. Trong Internet Explorer, tập lệnh có thể được hoãn lại, nhưng không nhiều như mong muốn. Nếu một tập lệnh có thể được hoãn lại, nó cũng có thể được chuyển xuống cuối trang. Điều đó sẽ làm cho các trang web của bạn tải nhanh hơn.

EDIT: Firefox không hỗ trợ thuộc tính DEFER kể từ phiên bản 3.6.

Nguồn:


4
Tôi đã thấy một số lời khuyên hiện đại rằng các kịch bản nên được đặt lên hàng đầu. Đặt các tập lệnh ở dưới cùng cho phép các hình ảnh và nội dung khác trong phần thân của trang được tải song song, nhưng có hiệu quả khiến các tập lệnh trong trang được tải sau - toàn bộ phần thân HTML cần được tải xuống trước khi trình duyệt biết về các URL script để tải. Hầu hết mọi người tham khảo hướng dẫn của Yahoo, điều này không còn chính xác nữa - Firefox thực sự tôn vinh các thuộc tính bị trì hoãn trên các tập lệnh. Trì hoãn ở đầu sẽ dẫn đến tải trang nhanh hơn nếu bạn đo nó.
ShadowChaser

Tôi có thể xem một số thống kê về tốc độ tải trang bằng phương pháp này không?
Gabriel Alack

1
Firefox không hỗ trợ tính năng DEAX kể từ phiên bản 3.6. Nguồn: w3schools.com/tags/att_script_defer.asp
Nikita

1
Cập nhật: kể từ đầu / giữa năm 2016, tất cả các trình duyệt hiện đại đã tăng số lượng kết nối trên mỗi tên máy chủ lên ít nhất là 6.
Night Owl

32

Tất nhiên chỉ tải jQuery vào đầu, thông qua CDN.

Tại sao? Trong một số trường hợp, bạn có thể bao gồm một phần mẫu (ví dụ đoạn trích mẫu đăng nhập ajax) với mã phụ thuộc jQuery được nhúng; nếu jQuery được tải ở cuối trang, bạn sẽ gặp lỗi "$ không được xác định", thật tuyệt.

Tất nhiên, có nhiều cách để khắc phục điều này (chẳng hạn như không nhúng bất kỳ mã JS nào và gắn vào gói js tải ở dưới cùng), nhưng tại sao bạn lại mất tự do của js được tải một cách lười biếng, vì có thể đặt mã phụ thuộc jQuery vào bất cứ nơi nào bạn muốn ? Công cụ Javascript không quan tâm nơi mã sống trong DOM miễn là các phụ thuộc (như jQuery được tải) được thỏa mãn.

Đối với các tệp js chung / chung của bạn, vâng, hãy đặt chúng trước </body>, nhưng đối với các trường hợp ngoại lệ, trong đó thực sự hợp lý để duy trì ứng dụng khôn ngoan để gắn đoạn mã phụ thuộc jQuery hoặc tham chiếu tệp ngay tại điểm đó trong html, hãy làm như vậy.

Không có hiệu suất hit jquery trong đầu; trình duyệt nào trên hành tinh này chưa có tệp CDN jQuery trong bộ đệm?

Phần lớn là không có gì, hãy gắn jQuery vào đầu và để cho tự do js của bạn ngự trị.


1
nhiều, nhiều trình duyệt thì không; khoảng 2% là con số cao nhất tôi đã đọc, khi bạn đưa phiên bản vào tài khoản và bộ nhớ đệm thực tế dựa trên tên tài nguyên chính xác, vì vậy jquery1.4.2 không giống như jquery1.7 hoặc 1.9.1 hoặc .. .
Toni Leigh

Trong số đó 2%, một nửa sẽ rời đi trước khi tải trang lần đầu tiên. Bằng cách này, bạn đang mất 1%khách truy cập, nhưng có khả năng tiết kiệm cho mình rất nhiều thời gian phát triển và rắc rối. Xem điều này có hợp lý với mô hình kinh doanh của bạn không ...
osa

13

Nimbuz cung cấp một lời giải thích rất tốt về vấn đề liên quan, nhưng tôi nghĩ câu trả lời cuối cùng phụ thuộc vào trang của bạn: điều gì quan trọng hơn để người dùng có sớm hơn - kịch bản hoặc hình ảnh?

Có một số trang không có ý nghĩa nếu không có hình ảnh, nhưng chỉ có kịch bản nhỏ, không cần thiết. Trong trường hợp đó, việc đặt các tập lệnh ở phía dưới sẽ hợp lý hơn, vì vậy người dùng có thể xem hình ảnh sớm hơn và bắt đầu hiểu ý nghĩa của trang. Các trang khác dựa trên kịch bản để làm việc. Trong trường hợp đó, tốt hơn là có một trang làm việc không có hình ảnh hơn một trang không hoạt động có hình ảnh, vì vậy sẽ rất hợp lý khi đặt các tập lệnh lên hàng đầu.

Một điều khác cần xem xét là các tập lệnh thường nhỏ hơn hình ảnh. Tất nhiên, đây là một khái quát và bạn phải xem liệu nó có áp dụng cho trang của bạn hay không. Nếu đúng như vậy, với tôi, đó là một lập luận cho việc đặt chúng lên hàng đầu như một quy tắc ngón tay cái (nghĩa là trừ khi có lý do chính đáng để làm khác), bởi vì chúng sẽ không trì hoãn hình ảnh nhiều như hình ảnh sẽ trì hoãn các tập lệnh. Cuối cùng, việc có tập lệnh ở trên cùng dễ dàng hơn nhiều, bởi vì bạn không phải lo lắng về việc liệu chúng đã được tải chưa khi bạn cần sử dụng chúng.

Tóm lại, tôi có xu hướng đặt các tập lệnh ở trên cùng theo mặc định và chỉ xem xét liệu có đáng để di chuyển chúng xuống dưới cùng sau khi trang hoàn thành hay không. Đó là một sự tối ưu hóa - và tôi không muốn thực hiện sớm.


Bạn đã có tôi cho đến khi bạn kéo ra đối số tối ưu hóa sớm. Đó chỉ là một quy tắc khác mà mọi người theo giáo điều mà không hiểu đầy đủ ý nghĩa của nó.
Robert Harvey

6
Oh tốt, không thể chiến thắng tất cả! Tôi tin rằng tôi hiểu ý nghĩa của nó. :)
EMP

Tôi không chắc bạn cần phải lo lắng nếu tập lệnh của bạn đã được tải. Kết xuất các khối cho đến khi tập lệnh được tải, đó là phần lớn của cuộc thảo luận này. Vì vậy, miễn là bạn không gọi bất cứ thứ gì trước khi tải, bạn vẫn ổn. Và bên cạnh đó, đó là những gì cuộc gọi lại dành cho và bạn thực sự không nên nhúng nhiều thứ khác vào trang của mình. Theo tôi hiểu, hình ảnh không chặn (chúng tải song song) và trên thực tế DOM có thể sẵn sàng và tập lệnh của bạn chạy trước khi hình ảnh được tải hoàn toàn. Không có nghĩa gì khi đặt các tập lệnh đầu tiên chỉ để tránh chúng bị chặn.
Duncan

4
Cho rằng sự đồng thuận chung là đặt các tập lệnh ở dưới cùng, sẽ tốt hơn nếu làm điều đó theo mặc định và chỉ di chuyển chúng lên đầu nếu bạn gặp vấn đề? Có vẻ lạ để làm những điều ngược. Đôi khi, tốt hơn là làm điều tối ưu nếu không có sự khác biệt trong nỗ lực đã bỏ ra :)
Duncan

@Duncan, Vâng, đó là cách tiếp cận của tôi. Tôi đặt các plugin ở dưới cùng và khi tôi gặp vấn đề, tôi đặt chúng ở trên cùng và điều đó đã khắc phục vấn đề.
Robert Harvey

6

Hầu hết các mã jquery thực thi trên tài liệu đã sẵn sàng, điều này không xảy ra cho đến cuối trang. Hơn nữa, kết xuất trang có thể bị trì hoãn bằng cách phân tích / thực thi javascript, vì vậy cách tốt nhất là đặt tất cả javascript ở cuối trang.


5

Thực hành tiêu chuẩn là đặt tất cả các tập lệnh của bạn ở cuối trang, nhưng tôi sử dụng ASP.NET MVC với một số bổ trợ jQuery và tôi thấy rằng tất cả đều hoạt động tốt hơn nếu tôi đặt các tập lệnh jQuery của mình vào <head>phần chính trang.

Trong trường hợp của tôi, có những tạo tác xảy ra khi trang được tải, nếu các tập lệnh nằm ở cuối trang. Tôi đang sử dụng plugin jQuery TreeView và nếu các tập lệnh không được tải ngay từ đầu, cây sẽ kết xuất mà không có các lớp CSS cần thiết được áp dụng bởi plugin. Vì vậy, bạn nhận được mớ hỗn độn trông buồn cười này khi trang tải lần đầu tiên, tiếp theo là kết xuất TreeView đúng cách. Nhìn rất xấu. Đặt các trình cắm jQuery trong <head>phần của trang chính sẽ loại bỏ vấn đề này.


Mạng nội bộ không phải chịu các điều kiện giống như internet, do đó độ trễ tải có lẽ ít được nhận biết hơn. Mặc dù vậy, vẫn nên tuân theo các quy tắc.
Duncan

không, việc đặt các định danh / kiểu CSS trong đánh dấu (thay vì chờ jQuery thực hiện trên DOM sẵn sàng) giải quyết vấn đề.
Dan Beam

1
@Dan Beam: Treeview được điền từ bảng cơ sở dữ liệu và các kiểu của Treeview được cài đặt bởi plugin Treeview dựa trên nội dung của bảng, vì vậy, sẽ không hoạt động.
Robert Harvey

1
Tại sao tôi phải làm điều đó khi tôi chỉ có thể đặt tập lệnh Treeview Plugin chưa sửa đổi ở đầu trang và nó sẽ hoạt động tốt? Điều đó không có nghĩa gì cả, Dan.
Robert Harvey

1
Chúc mừng Robert, tôi cũng đang sử dụng ASP.NETMVC với các hình thức trong các phần. Sẽ tốt hơn nếu giữ javascript trong một phần vì các trường mới được gán lại chức năng của chúng mỗi khi phần đó được thực thi (nói để xác thực). Tôi chỉ gặp phải vấn đề với điều này khi cố gắng sử dụng @Html.Action, nó tự động ghi kết quả vào đầu ra, vì một phần của tôi $ is undefinedcó nghĩa là thay vào đó tôi phải sử dụng .load ('@ Url.Action') để tải một phần. Nhưng điều này mang lại một focc do yêu cầu thêm. Dựa trên đầu vào của bạn, tôi sẽ chỉ di chuyển jquery phía trên RenderBody () trong trang chính của mình
Malkin

4

Mặc dù hầu hết tất cả các trang web vẫn đặt Jquery và các javascript khác trên tiêu đề: D, thậm chí kiểm tra stackoverflow.com.

Tôi cũng đề nghị bạn đeo vào trước thẻ kết thúc của cơ thể. Bạn có thể kiểm tra thời gian tải sau khi đặt vào một trong hai nơi. Thẻ script sẽ tạm dừng trang web của bạn để tải thêm.

và sau khi đặt javascript trên chân trang, bạn có thể nhận được giao diện khác thường của trang web cho đến khi nó tải javascript, vì vậy hãy đặt css trên phần tiêu đề của bạn.


2
Nhưng, bạn có thể đạt được điều tương tự bằng cách sử dụng defer trên script. w3schools.com/tags/att_script_defer.asp
Jack Tuck

2

Ngay trước đây </body>là nơi tốt nhất theo Thực tiễn tốt nhất của Yahoo Developer Network để tăng tốc trang web của bạn liên kết này , nó có ý nghĩa.

Điều tốt nhất để làm là tự kiểm tra.


0

Đối với tôi jQuery là một chút đặc biệt. Có thể là một ngoại lệ cho các tiêu chuẩn. Có rất nhiều tập lệnh khác dựa vào nó, vì vậy nó khá quan trọng là nó tải sớm để các tập lệnh khác đến sau sẽ hoạt động như dự định. Như một người khác đã chỉ ra, ngay cả trang này cũng tải jQuery trong phần đầu.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.