Là tốt hơn để đặt mã JS trên tệp html hoặc trong một tệp bên ngoài?


15

Nếu tôi đang thiết kế một trang web một trang, tốt hơn là tạo tệp bên ngoài cho mã JS của tôi hoặc chỉ đặt nó vào mã html? Là đặt nó trên trang nhanh hơn để tải? Tôi có thể thay đổi quyền để từ chối yêu cầu của người dùng về mã không, nhưng trang html vẫn có thể gọi mã?

Câu trả lời:


25

Bạn nên đặt mã JS của mình vào một tệp riêng vì điều này giúp kiểm tra và phát triển dễ dàng hơn. Câu hỏi về cách bạn phục vụ mã là một vấn đề khác.

  • Việc phân phát HTML và JS riêng biệt có một lợi thế là máy khách có thể lưu trữ bộ đệm. Điều này yêu cầu bạn gửi các tiêu đề phù hợp để khách hàng không đưa ra yêu cầu mới mỗi lần. Bộ nhớ đệm có vấn đề nếu bạn muốn thực hiện cập nhật và do đó muốn vô hiệu hóa bộ đệm của máy khách. Một phương pháp là bao gồm số phiên bản trong tên tệp, vd/static/mylibrary-1.12.2.js .

    Nếu JS nằm trong một tệp riêng biệt, bạn không thể hạn chế quyền truy cập vào nó: Rất khó (về mặt kỹ thuật: không thể) để biết liệu yêu cầu đối với tệp JS có được thực hiện hay không vì bạn đã tham chiếu nó trên trang HTML của mình hoặc vì ai đó muốn tải xuống trực tiếp Tuy nhiên, bạn có thể sử dụng cookie và từ chối phục vụ khách hàng không truyền tải một số cookie nhất định (nhưng điều đó thật ngớ ngẩn).

  • Việc phục vụ JS bên trong HTML làm tăng kích thước của mỗi trang - nhưng điều này là ổn nếu khách hàng không thể xem nhiều trang. Vì máy khách không đưa ra một yêu cầu riêng cho JS, nên chiến lược này tải trang nhanh hơn - ít nhất là lần đầu tiên, nhưng có một điểm hòa vốn trong đó bộ nhớ đệm tốt hơn. Bạn có thể bao gồm JS, ví dụ thông qua PHP.

    Ở đây, máy khách không cần quyền truy cập riêng vào tệp JS, có thể bị ẩn nếu bạn muốn. Nhưng bất cứ ai vẫn có thể xem mã JS bên trong HTML.

Các chiến lược khác để giảm thiểu thời gian tải bao gồm

  • JS việc rút gọn giúp giảm kích thước của tập tin JS bạn phục vụ. Vì việc thu nhỏ chỉ xảy ra một lần khi triển khai mã, đây là một phương pháp rất hiệu quả để lưu byte. OTOH điều này làm cho mã của bạn khó hiểu hơn đối với khách truy cập quan tâm.

    Liên quan đến việc thu nhỏ là thực hành kết hợp tất cả các tệp JS của bạn trong một tệp duy nhất. Điều này làm giảm số lượng yêu cầu cần thiết.

  • Nén, trong đó thêm một chi phí tính toán cho mỗi yêu cầu trên cả máy khách và máy chủ. Tuy nhiên, thời gian dành (nén) thường nhỏ hơn thời gian truyền dữ liệu không nén. Nén thường được xử lý trong suốt bởi phần mềm máy chủ.

Những kỹ thuật này cũng áp dụng cho các tài nguyên khác như hình ảnh.

  • Hình ảnh có thể được nội tuyến thành HTML hoặc CSS bằng URL dữ liệu. Điều này chỉ thực tế đối với các hình ảnh nhỏ, đơn giản vì mã hóa base64 làm tăng kích thước. Điều này vẫn có thể nhanh hơn yêu cầu khác.
  • Nhiều hình ảnh nhỏ (biểu tượng, nút) có thể được kết hợp thành một hình ảnh duy nhất và sau đó được trích xuất dưới dạng các họa tiết.
  • Hình ảnh có thể được giảm bởi máy chủ đến kích thước mà chúng thực sự được sử dụng trên trang web, giúp tiết kiệm băng thông. So sánh hình ảnh thu nhỏ.
  • Đối với một số đồ họa, hình ảnh dựa trên văn bản như SVG có thể nhỏ hơn rất nhiều.

"Kiểm tra và phát triển dễ dàng hơn", tôi không chắc chắn việc có JS trong tệp riêng của mình cho mục đích này luôn hữu ích. Trong một dự án tôi sử dụng các tệp HTML rất nhỏ và thực sự có tổ chức hơn để bao gồm chúng với HTML. Theo như bộ nhớ đệm, nó có thể cải thiện tốc độ qua nhiều lượt truy cập (có thể), nhưng với lần tải trang đầu tiên, sẽ luôn nhanh hơn để đưa javascript trực tiếp vào HTML.
YungGun

5

Tôi đang thiết kế một trang web

Nếu bạn thực sự chỉ có một trang thì có, tốt hơn là (theo quan điểm hiệu suất) để phục vụ mọi thứ trong một tệp ... bảng định kiểu, JavaScript và thậm chí cả hình ảnh (hình ảnh nhỏ được gắn với URI dữ liệu). Điều này giúp loại bỏ các yêu cầu HTTP bổ sung cần thiết để truy xuất tài nguyên bên ngoài tương đối chậm.

Các tập tin kết quả nên được nén lại trước khi phục vụ, điều này sẽ làm giảm ồ ạt kích thước của phản hồi tất cả văn bản.

Bạn vẫn nên xem xét việc có hình ảnh lớn bên ngoài trang, vì có giới hạn về kích thước của URI dữ liệu và khả năng tương thích trình duyệt. (ví dụ: IE8 có giới hạn 32KB, tương đương với kích thước tệp thực tế khoảng 23KB do bản chất của mã hóa base64.)

Tôi có thể thay đổi quyền để từ chối yêu cầu của người dùng về mã không, nhưng trang html vẫn có thể gọi mã?

Không. Tốt nhất là mã có thể bị xáo trộn để "ẩn" nó khỏi người quan sát thông thường, nhưng nó không cung cấp sự bảo vệ thực sự.


1
Tại sao bỏ phiếu phủ định? Mặc dù tốt hơn là các trang web phát triển và nhiều trang có các tệp riêng biệt / bên ngoài, OP trong trường hợp này đặc biệt hỏi về "trang web một trang" và liệu nó có "tải nhanh hơn" hay không. Tối thiểu hóa các yêu cầu HTTP phải là ưu tiên trong trường hợp này. Bạn có thể (và nên) vẫn phát triển với nhiều tệp, nhưng đó không phải là câu hỏi đang được hỏi.
MrWhite

Bằng cách đặt js, css và hình ảnh vào các tệp riêng biệt, bạn cho phép trình duyệt lưu các tệp. Vì vậy, nếu nội dung trang thay đổi, chỉ có html sẽ phải được tải lại.
Thierry J.

@ThierryJ. Được rồi, bạn có thể lưu trữ các tệp nhưng khi tải trang đầu tiên (Điều rất quan trọng để có được người dùng mới), việc bao gồm tất cả các tệp sẽ nhanh hơn nhiều vì bộ nhớ đệm không có hiệu lực. Ngoài ra, máy tính vẫn phải tải tệp đã lưu trong bộ nhớ cache, một bước được bỏ qua hoàn toàn nếu bạn đưa tệp vào HTML. Có lẽ sẽ nhanh hơn khi chỉ có tệp được bao gồm trong HTML ở vị trí đầu tiên trong hầu hết mọi trường hợp. Bạn sẽ phải tải lại dù sao HTML và phần javascript không thể hơn một trăm kB, điều đó không đáng kể.
YungGun

4

Trình duyệt mã phía máy khách phải được xem bởi trình duyệt (nghĩa là, nếu trang cần sử dụng trực tiếp JS) - điều đó có nghĩa là nó phải được trình duyệt tải xuống.

Bạn không thể có trình duyệt sử dụng JS trên trang nếu nó không thể tải xuống.

Về mặt đó, nó sẽ không tạo ra sự khác biệt nếu bạn đặt nội tuyến của JS hoặc đặt nó vào một tệp, mặc dù thực tế phổ biến là sử dụng tệp JS (tách các mối quan tâm cho một).

Nếu bạn có mã mà bạn không muốn hiển thị thông qua trình duyệt, bạn sẽ cần sử dụng mã phía máy chủ (giả sử node.js, php, perl, asp.net, jsp - có rất nhiều tùy chọn) và tương tác với nó từ trình duyệt - khi tải trang ban đầu hoặc sử dụng AJAX .


2

Vâng, nó phụ thuộc vào số lượng mã, và mức độ nghiêm trọng của bạn khi trở thành một lập trình viên / kỹ sư phần mềm so với chỉ là một lập trình viên. Tôi đã làm việc với một nhóm các nhà thiết kế đã đưa các đoạn mã ngắn trực tiếp vào HTML và trong khi tôi co rúm lại - nó thực sự hoạt động.

Mặc dù đó không phải là điều tôi sẽ tự làm, và nếu bạn muốn biết cách thực hành tốt nhất về phát triển phần mềm, tôi khuyên bạn nên làm mọi thứ trong *.jstệp bên ngoài và tải nó qua <script>thẻ.

Về điểm thứ hai của bạn, không bạn không thể từ chối người dùng hoặc trình duyệt để xem mã của mình, có một cái gì đó được gọi obfuscationsẽ làm cho mã của bạn khó đọc hơn, tuy nhiên hiệu suất sẽ giảm.


1

tốt hơn là tạo tệp bên ngoài cho mã JS của tôi hay chỉ đặt nó vào mã html?

Tốt hơn là tạo một tệp bên ngoài cho mã JS của bạn. Nó cũng tốt hơn để có một hoặc hai tệp mà bạn phục vụ cho khách hàng. Tuy nhiên, nó cũng tốt hơn để có mã chia JS của bạn trên các file bội cho vấn đề bảo trì. Để có thể làm điều này, bạn có thể sử dụng các bộ tiền xử lý như Gulp sẽ kết hợp các tệp JS khác nhau của bạn thành một tệp.

Phục vụ ít tệp hơn là tốt hơn vì máy khách sẽ có ít yêu cầu HTTP hơn để xử lý.

Là đặt nó trên trang nhanh hơn để tải?

Có, rõ ràng là nhanh hơn vì bạn chỉ thực hiện một yêu cầu cho HTML, trong khi bạn thực hiện nhiều yêu cầu (ít nhất là 2) với mã JS của bạn như một bên ngoài. Điều này chỉ xảy ra nếu mã JS của bạn không bị thu nhỏ ở cả hai bên và điều này không tính đến việc duy trì mã của bạn sẽ khó hơn thế nào nếu tất cả nằm trong một trang HTML.

Tôi có thể thay đổi quyền để từ chối yêu cầu của người dùng về mã không, nhưng trang html vẫn có thể gọi mã?

Không, bạn không thể. Mã JS, như mã CSS và mã HTML là nội dung tĩnh. Điều đó có nghĩa là một khi nó vào trình duyệt, khách hàng có thể tải xuống và nội dung của nó hoàn toàn. Mỗi tập tin, hình ảnh, tập lệnh được mở để được tải xuống. Tuy nhiên , bạn có thể thu nhỏ / làm xấu đi mã của mình để con người sử dụng nó khó hơn. Đó chỉ là hậu quả của sự xấu xí, được tạo ra cho hiệu suất đầu tiên.


0

Nhiều lợi ích của việc tách nội dung html và javascript thành các tệp riêng biệt:

  • tăng khả năng đọc của các tập tin cá nhân
  • do mã javascript không bị giới hạn trong một tệp html nữa, các thư viện hoặc tệp html và javascript khác có thể sử dụng mã javascript của bạn
  • tương tự mã javascript được đặt vào một tệp riêng biệt có thể dễ dàng sử dụng các tệp khác và thư viện nâng cao để thực hiện các phép tính phức tạp (máy học, đồ họa 3D, thư viện khung, v.v.)
  • javascript có thể được lưu trữ ở phía máy khách và thông qua đó chỉ cần tải lại nội dung html khi làm mới trang
  • thực hành kỹ thuật phần mềm tốt / hiện đại có thể được áp dụng dễ dàng hơn cho một tệp / mô-đun / thư viện javascript riêng biệt (mẫu thiết kế, đọc về bản thảo / babel, v.v.)
  • Mã javascript có thể dễ dàng bị xáo trộn hoặc 'ẩn' khỏi khách truy cập vào trang web bằng cách thu nhỏ / làm mờ
  • Các tệp javascript có thể được bó lại với nhau thành một tệp / mô-đun thông qua gulp, webpack, v.v.

1
điều này dường như không cung cấp bất cứ điều gì đáng kể qua các điểm được thực hiện và giải thích trong 6 câu trả lời trước
gnat
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.