2013-08-17 33 views
5

Tôi đọc High Performance Web Sites: Essential Knowledge for Front-End Engineers và trong đó tác giả đề nghị rằng tất cả mã JavaScript phải được đặt ở bên ngoài và đặt ở cuối trang thay vì đặt nó vào đầu.Tại sao các tập lệnh nội tuyến chặn hiển thị khi đặt ở cuối trang?

Điều này được minh họa trong this example. Các mã bên ngoài chặn tập lệnh cả hai tải xuốnghiển thị tiến trình của một trang, do đó, giải pháp là đặt nó ở cuối trang.

Tuy nhiên, trong cuốn sách thứ hai của mình Even Faster Web Sites: Performance Best Practices for Web Developers anh ấy nói về Inline Thẻ JavaScript.

Tập lệnh nội tuyến cũng chặn tải xuống và hiển thị trang, do đó, anh đề xuất chuyển chúng cũng xuống cuối trang. Tuy nhiên, các hành vi này vẫn chặn hoàn toàn việc hiển thị trang như minh họa trong this example

Tại sao các tập lệnh bên ngoài di chuyển xuống cuối trang cho phép trang hiển thị hoàn toàn cho đến khi tập lệnh được thực thi?


PS:

Câu hỏi đặt ra không phải là về việc tại sao thêm hoạt Javascript để dưới cùng của trang thay vì đặt chúng trong đầu. Đó là lý do tại sao các tập lệnh nội tuyến phía dưới chặn hiển thị trong khi các tập lệnh bên ngoài phía dưới thì không.

Trả lời

5

Trong tập lệnh nội tuyến, thời gian được thực hiện khi chạy tập lệnh, điều này có thể thay đổi DOM. Cố gắng làm cho DOM trong khi nó đang biến đổi là một công thức cho một mớ hỗn độn. Vì vậy, việc hiển thị chỉ xảy ra tại các điểm khi JS bị ngừng hoạt động và do đó DOM ổn định.

Trong khi chờ đợi tập lệnh bên ngoài tải xuống, việc chạy tập lệnh bị ngừng hoạt động, vì vậy DOM có thể được hiển thị an toàn. JS đã tải xuống sẽ không chạy cho đến khi quá trình kết xuất hoàn tất.

+0

Thú vị, vì vậy nếu tôi có một kịch bản bên ngoài theo sau là một tập lệnh nội tuyến và cả hai được đặt ở dưới cùng của cơ thể, kịch bản nội tuyến sẽ phải đợi cho kịch bản bên ngoài được tải xuống và thực hiện đầu tiên. Bằng cách đó, trang sẽ không hiển thị cho đến khi cả hai tập lệnh đã được thực thi, đúng không? – Songo

+2

Không. Trình duyệt có thể hiển thị DOM trong khi bị trì hoãn khi chờ tập lệnh bên ngoài tải xuống. Tại thời điểm đó, nó sẽ không ngay cả (hợp lý) được nhận thức của sự hiện diện của kịch bản nội tuyến trong đánh dấu bởi vì các phân tích cú pháp đã không đạt được nó được nêu ra. Lưu ý rằng kịch bản bên ngoài có thể bao gồm một cuộc gọi 'document.write()' có thể ngăn chặn tập lệnh nội tuyến được hiểu như là một kịch bản. – Alohci

+0

Tôi đã thử nghiệm những gì bạn đã nói và đó là sự thật, nhưng trong trường hợp các tệp bên ngoài không được lưu trong bộ nhớ cache. Trang được hiển thị và không đợi tập lệnh nội tuyến lần đầu tiên tôi mở tệp đó, nhưng trên các yêu cầu tiếp theo, tệp bên ngoài đã được lưu vào bộ nhớ cache để việc hiển thị bị tạm dừng cho đến khi tập lệnh nội tuyến hoàn tất. BTW Tôi đang sử dụng một kịch bản nội tuyến tùy chỉnh mất 6 phút để hoàn thành cho mục đích thử nghiệm. – Songo

Các vấn đề liên quan