JavaScript không phô trương: <script> ở đầu hay cuối mã HTML?


90

Gần đây, tôi đã đọc tuyên ngôn của Yahoo Các phương pháp hay nhất để tăng tốc trang web của bạn . Họ khuyên bạn nên đặt JavaScript ở cuối mã HTML khi chúng tôi có thể.

Nhưng chính xác ở đâu và khi nào?

Chúng ta nên đặt nó trước khi đóng </html>hay sau? Và trên hết, khi nào chúng ta vẫn nên đặt nó trong <head>phần?


Câu trả lời:


87

Có hai khả năng cho các tập lệnh thực sự không phô trương:

  • bao gồm tệp tập lệnh bên ngoài thông qua thẻ tập lệnh trong phần đầu
  • bao gồm tệp tập lệnh bên ngoài thông qua thẻ tập lệnh ở cuối nội dung (trước </body></html>)

Cách thứ hai có thể nhanh hơn vì nghiên cứu ban đầu của Yahoo cho thấy một số trình duyệt cố gắng tải các tệp script khi chúng nhấn thẻ script và do đó không tải phần còn lại của trang cho đến khi chúng hoàn thành. Tuy nhiên, nếu tập lệnh của bạn có phần 'sẵn sàng', phần này phải thực thi ngay sau khi DOM sẵn sàng, bạn có thể cần phải có nó trong đầu. Một vấn đề khác là bố cục - nếu tập lệnh của bạn thay đổi bố cục trang mà bạn muốn nó tải càng sớm càng tốt để trang của bạn không mất nhiều thời gian để tự vẽ lại trước mặt người dùng.

Nếu trang web script bên ngoài nằm trên một tên miền khác (như các widget bên ngoài) thì có thể nên đặt nó ở cuối để tránh làm chậm quá trình tải trang.

Và đối với bất kỳ vấn đề hiệu suất nào, hãy thực hiện các điểm chuẩn của riêng bạn - điều có thể đúng tại một thời điểm khi một nghiên cứu được thực hiện có thể thay đổi với thiết lập cục bộ của riêng bạn hoặc các thay đổi trong trình duyệt.


13
Về kịch bản có một phần 'sẵn sàng'. Đưa kịch bản mà ở dưới cùng của cơ thể đảm bảo DOM được sẵn sàng để được thao tác, nếu bạn đặt nó trong đầu, bạn phải quấn nó để nó chờ đợi cho DOMReady (hoặc tương tự) sự kiện
Juan Mendes

4
@Juan Có thì có, nhưng bằng cách đặt tập lệnh ở dưới cùng, bạn đang trì hoãn sự kiện DOMReady trong khoảng thời gian cần thiết để trình duyệt phân tích cú pháp tài liệu và xử lý các phần tử head (200-500ms), trước khi nó yêu cầu tập lệnh đó . Chủ yếu ở lần tải trang đầu tiên (giả sử nó có thể được lưu vào bộ nhớ đệm từ đó). Trong khi nếu bạn đặt nó vào đầu. Nó có thể sẵn sàng nhanh hơn nhiều. Vì vậy, với HTML5, nếu tập lệnh phải sửa đổi bố cục khi DOM đã sẵn sàng, thì tốt hơn hết bạn nên sử dụng tập lệnh "không đồng bộ" hoặc "trì hoãn" trong đầu.
hexalys

31

Nó không bao giờ cắt và khô như vậy - Yahoo khuyên bạn nên đặt các tập lệnh ngay trước </body>thẻ đóng , điều này sẽ tạo ra ảo tưởng rằng trang tải nhanh hơn trên bộ nhớ đệm trống (vì các tập lệnh sẽ không chặn tải phần còn lại của tài liệu). Tuy nhiên, nếu bạn có một số mã bạn muốn chạy khi tải trang, nó sẽ chỉ bắt đầu thực thi sau khi toàn bộ trang được tải. Nếu bạn đặt các tập lệnh vào <head>thẻ, chúng sẽ bắt đầu thực thi trước đó - vì vậy, trên một bộ đệm lót có sẵn, trang sẽ thực sự tải nhanh hơn.

Ngoài ra, đặc quyền đặt tập lệnh ở cuối trang không phải lúc nào cũng có sẵn. Nếu bạn cần bao gồm các tập lệnh nội tuyến trong các chế độ xem của mình phụ thuộc vào thư viện hoặc một số mã JavaScript khác đang được tải trước đó, bạn phải tải các phần phụ thuộc đó trong <head>thẻ.

Tất cả trong tất cả các khuyến nghị của Yahoo đều thú vị nhưng không phải lúc nào cũng có thể áp dụng được và cần được xem xét trong từng trường hợp cụ thể.


1
Nếu bạn có javscript không phô trương, bạn sẽ không có đoạn nội tuyến, câu hỏi được đề cập cụ thể là không phô trương.
Juan Mendes

1
<script>thẻ nội tuyến không ngụ ý javascript gây khó chịu.
Eran Galperin

@Eric Galperin: Cách sử dụng tốt các thẻ tập lệnh nội tuyến mà không gây khó chịu là gì?
Juan Mendes

4
@Juan cản trở Javascript có nghĩa là giao diện người dùng bị hỏng nếu không có nó hoặc nó được nhúng vào đánh dấu. <script>các thẻ tách biệt với phần đánh dấu và có thể được sử dụng với mã nâng cao giao diện nhưng không bắt buộc. Vì vậy, không có gì khó chịu về các <script>thẻ nội tuyến .
Eran Galperin

4
1. Tên tôi là Eran không phải Eric, 2. Khi bạn muốn truyền dữ liệu sang Javascript từ ngôn ngữ phía máy chủ, trong vòng lặp if các mục chẳng hạn, bạn có thể sử dụng <script>các thẻ để mã hóa các giá trị đó thành các biến javascript, để sử dụng có lẽ với chỉnh sửa nội tuyến hoặc hành vi tương tự khác.
Eran Galperin

22

Như những người khác đã nói, hãy đặt nó trước các thẻ html thân đóng .

Ngày hôm trước, chúng tôi đã nhận được nhiều cuộc gọi từ khách hàng phàn nàn rằng trang web của họ rất chậm. Chúng tôi đã đến thăm họ tại địa phương và nhận thấy họ mất 20-30 giây để tải một trang. Nghĩ rằng đó là do các máy chủ hoạt động không tốt, chúng tôi đã đăng nhập - nhưng cả máy chủ web và sql đều hoạt động ~ 0%.

Sau một vài phút, chúng tôi nhận ra rằng một trang web bên ngoài đã ngừng hoạt động mà chúng tôi đang liên kết đến cho các thẻ theo dõi Javascript. Điều này có nghĩa là các trình duyệt đang nhấn thẻ tập lệnh trong phần đầu của trang web và chờ tải xuống tệp tập lệnh.

Vì vậy, ít nhất đối với các tập lệnh bên thứ 3 / bên ngoài, tôi khuyên bạn nên đặt chúng là thứ cuối cùng trên trang. Sau đó, nếu chúng không khả dụng, trình duyệt ít nhất sẽ tải trang cho đến thời điểm đó - và người dùng sẽ không biết gì về nó.


10
Câu chuyện hay đấy anh bạn :) Nhưng nghiêm túc mà nói, đây là lập luận thuyết phục nhất mà tôi đã thấy để đặt các thẻ script ở cuối trang.
user271608

16

Tóm lại, dựa trên các gợi ý ở trên:

  1. Đối với các tập lệnh bên ngoài (Google analytics, trình theo dõi tiếp thị của bên thứ 3, v.v.), hãy đặt chúng trước </body>thẻ.
  2. Đối với các tập lệnh ảnh hưởng đến bố cục trang, hãy đặt trong đầu.
  3. Đối với các tập lệnh dựa trên 'dom sẵn sàng' (như jquery), hãy cân nhắc đặt trước </body>trừ khi bạn có lý do chính đáng để đặt các tập lệnh vào đầu.
  4. Nếu có các tập lệnh nội tuyến với các phần phụ thuộc, hãy đặt các tập lệnh bắt buộc vào đầu.

6

Nếu bạn muốn điều chỉnh vị trí của các tập lệnh của mình, YSlow là một công cụ tuyệt vời để cung cấp cho bạn hương vị nếu nó sẽ cải thiện hoặc làm giảm hiệu suất. Đặt javascript vào các vị trí tài liệu nhất định thực sự có thể giết thời gian tải trang.

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


5

Không, nó không nên sau </html>vì điều đó sẽ không hợp lệ. Nơi tốt nhất để đặt tập lệnh là ngay trước</body>

Điều này về cơ bản là do hầu hết các trình duyệt ngừng hiển thị trang trong khi họ đánh giá tập lệnh mà bạn cung cấp. Vì vậy, có thể đặt mã không chặn ở bất kỳ đâu trong trang (tôi chủ yếu nghĩ đến những thứ gắn các chức năng vào onLoadsự kiện, vì ràng buộc sự kiện nhanh đến mức miễn phí một cách hiệu quả). Một kẻ giết người lớn ở đây là ở đầu trang đặt một số tập lệnh máy chủ quảng cáo, điều này có thể ngăn bất kỳ trang nào tải trước khi quảng cáo được tải xuống hoàn toàn, khiến thời gian tải trang của bạn tăng vọt


Bạn biết đấy, nếu bạn thực sự quan tâm đến tốc độ thì sẽ không có </body> hoặc </html> - các thẻ đóng cho các loại phần tử này là tùy chọn. Đặt <script> ở cuối và quên sử dụng </body> và </html> hoàn toàn.
Jim

9
Hy vọng rằng Jim đang bị mỉa mai - bằng mọi giá, đừng nghe theo lời khuyên của anh ấy. XHTML được định dạng tốt yêu cầu các thẻ đóng cho mọi phần tử, bao gồm cả phần thân và thẻ html. Nếu mã của bạn không phải là XML hợp lệ, bạn đang làm sai.
matt lohkamp

6
Không, tôi không mỉa mai. Hãy xem câu hỏi. Nó chỉ định HTML, không phải XHTML. Đúng là XHTML hợp lệ yêu cầu những thứ này, nhưng HTML hợp lệ thì không. Hoàn toàn không có gì sai khi chọn HTML và bỏ qua các thẻ đóng cho các loại phần tử này.
Jim

2

Nếu bạn đặt nó ở dưới cùng, nó sẽ tải sau cùng, do đó tăng tốc độ mà người dùng có thể xem trang. Nó cần phải có trước trận chung kết, </html>nếu không nó sẽ không phải là một phần của DOM.

Tuy nhiên, nếu mã là cần thiết ngay lập tức, thì hãy đặt nó vào đầu.

Tốt nhất bạn nên đặt những thứ như widget blog ở dưới cùng để nếu chúng không tải thì cũng không ảnh hưởng đến khả năng sử dụng của trang.

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.