Chrome đã từ chối thực thi tệp JavaScript này


32

Trong phần đầu trang HTML của tôi, tôi có:

<script src="https://raw.github.com/cloudhead/less.js/master/dist/less-1.3.3.js"></script>

Khi tôi tải trang trong trình duyệt của mình (Google Chrome v 27.0.1453.116) và bật các công cụ dành cho nhà phát triển, nó nói:

Từ chối thực thi tập lệnh từ ' https://raw.github.com/cloudhead/less.js/master/dist/less-1.3.3.js ' vì loại MIME của nó ('text / plain') không thể thực thi được và kiểm tra loại MIME nghiêm ngặt được kích hoạt.

Thật vậy, kịch bản sẽ không chạy. Tại sao Chrome nghĩ rằng đây là một tệp văn bản thuần túy? Nó rõ ràng có một .jsphần mở rộng tập tin.

Vì tôi đang sử dụng HTML5, tôi đã bỏ qua typethuộc tính, vì vậy tôi nghĩ rằng điều đó có thể gây ra sự cố. Vì vậy, tôi đã thêm type="text/javascript"vào <script>thẻ, và nhận được kết quả tương tự. Tôi thậm chí đã thử type="application/javascript"và vẫn nhận được lỗi tương tự.

Sau đó, tôi đã cố gắng thay đổi nó để type="text/plain"chỉ tò mò. Trình duyệt không trả về lỗi, nhưng tất nhiên JavaScript cũng không chạy.

Cuối cùng tôi nghĩ rằng các khoảng thời gian trong tên tệp có thể làm mất trình duyệt. Vì vậy, trong mã HTML của mình, tôi đã thay đổi tất cả các dấu chấm thành ký tự thoát URL %2E:

<script src="https://raw.github.com/cloudhead/less%2Ejs/master/dist/less-1%2E3%2E3.js"></script>

Điều này vẫn không hoạt động. Điều duy nhất thực sự hoạt động (tức là trình duyệt không báo lỗi và JS chạy thành công) là nếu tôi tải tệp xuống, tải tệp lên thư mục cục bộ, sau đó thay đổi srcgiá trị thành tệp cục bộ. Tôi không muốn làm điều này vì tôi đang cố gắng tiết kiệm không gian trên trang web của riêng tôi.

Làm cách nào để Chrome nhận ra rằng tệp được liên kết thực sự là một loại JavaScript?

Câu trả lời:


16

Vấn đề bạn gặp phải nằm ngoài tầm kiểm soát của bạn vì đây là cách lưu trữ được thiết lập tại Github trên đường dẫn mà bạn đã đề cập, Loại tiện ích mở rộng không chỉ là yếu tố khi thực hiện các tệp vì lưu trữ web có thể vượt quá quy định trình duyệt kết xuất một tập tin.

Bạn có thể có tệp .zip hiển thị dưới dạng tệp .html nếu máy chủ được thiết lập để làm như vậy, bạn có thể tự kiểm tra điều này bằng cách sử dụng fireorms và xem phản hồi tiêu đề đối với đó là những gì đang được yêu cầu .... vì vậy nếu bạn yêu cầu một tệp JS nhưng phản hồi tiêu đề trả về một giá trị mong đợi khác thì các trình duyệt sẽ tôn trọng phản hồi tiêu đề và không phải là những gì được yêu cầu ...

Lưu trữ github trên tên miền phụ thô đang trở lại Content-Type text/plain; charset=utf-8là loại MIME có nghĩa là nó sẽ không hoạt động như JS mà là văn bản thô, dưới đây là một ví dụ về những gì bạn sẽ cần máy chủ quay lại để hiển thị tệp và tiếp tục xuống là mã đang được trả về bởi github.

Một máy chủ hỗ trợ loại MIME JS sẽ trông giống như:

Accept-Ranges   bytes
Connection  Keep-Alive
Content-Encoding    gzip
Content-Length  31097
Content-Type    application/javascript
Vary    Accept-Encoding
Request Headersview source
Accept  text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Và đây là những gì https://raw.github.com/cloudhead/less.js/master/dist/less-1.3.3.jstiêu đề đang phản hồi là (RAW XEM).

Accept-Ranges   bytes
Connection  Keep-Alive
Content-Disposition inline
Content-Encoding    gzip
Content-Length  41354
Content-Transfer-Encoding   binary
Content-Type    text/plain; charset=utf-8

Ơ, cái gì? Vậy cách khắc phục là gì?
pabram

2
@pabrams sử dụng máy chủ phù hợp trong tầm kiểm soát của bạn là cách khắc phục hoặc sử dụng rawgit
Simon Hayter

25

Chỉnh sửa tháng 12 năm 2018

RawGit hiện đang bị say nắng do sử dụng độc hại, vì vậy họ khuyên bạn nên sử dụng một trong các dịch vụ sau:


Bài gốc

Rawgithub.com cho phép người dùng lấy các phiên bản "Nguyên" của Git và biến nó thành một URL có thể sử dụng trong <script>các thẻ. Nó khá dễ sử dụng, chỉ cần xóa cái đầu tiên .khỏi URL thô. Ví dụ : cái này:

https://raw.github.com/joelambert/CSS-Animation-Store/master/cssanimationstore.js

sẽ biến thành thế này

https://rawgithub.com/joelambert/CSS-Animation-Store/master/cssanimationstore.js

và sau đó bạn đặt nó vào một <script>thẻ với loại thích hợp. Thật đơn giản!

Họ giới hạn số lượng yêu cầu vì nó chỉ dành cho mục đích phát triển, không phải sản xuất.

Chỉnh sửa 2014

Như Reinderien đã đề cập, rawgithub bây giờ chỉ là rawgit, vì vậy liên kết tập lệnh mới sẽ là

https://rawgit.com/joelambert/CSS-Animation-Store/master/cssanimationstore.js

6
Nó nói ngay trên trang chủ rawgithub, không sử dụng nó cho các trang web sản xuất . Ngoài ra, nó dường như không phải là một trang web chính thức của Github.
DisgruntledGoat

1
Tôi chưa bao giờ nói rằng nó không ...
Zach Saucier

1
Lưu ý - điều này bây giờ chuyển hướng đến rawgit.com. Và nó hoạt động!
Reinderien

1
Trang web này hiện cung cấp 403 giây cho các yêu cầu và các tiêu đề cho bạn biết đó là ánh nắng mặt trời.
Michael

@Michael Sad :( May mắn thay rawgit cung cấp một số lựa chọn thay thế trên trang web của nó, vì vậy tôi đã cập nhật câu trả lời của mình với những người được cung cấp.
Zach Saucier

6

Phần mở rộng tệp không liên quan, đó là tiêu đề Kiểu nội dung quan trọng và tệp đó được cung cấp với text/plainloại nội dung (mục đích của chế độ xem "thô" của Github).

Bạn thực sự nên tải một bản sao của tệp cục bộ vào trang web của bạn và bao gồm nó từ đó. Ngay cả khi nó hoạt động từ Github, vì bạn không tải tệp JS không đồng bộ, việc đặt <script>thẻ đó vào tiêu đề trang của bạn khiến trang web của bạn phụ thuộc vào tính khả dụng của Github.


8
"Bạn thực sự nên tải xuống một bản sao của tệp cục bộ vào trang web của bạn và bao gồm nó từ đó", đó là chìa khóa. Nó không có nghĩa là được lưu trữ từ GitHub.
Bạch tuộc

@Octopus chúng ta có thể định cấu hình để tải xuống và lưu trữ một bản sao cục bộ của nó và sau đó trỏ tập lệnh vào nó theo chương trình ..
Sudip Bhandari


1

Như bằng cách chỉ ra vấn đề là hầu như tất cả nội dung được cung cấp bởi raw.github.com được gửi xuống dưới dạng tệp văn bản - theo cách đó, nội dung được hiển thị dưới dạng văn bản thuần trong trình duyệt của bạn mà không có bất kỳ ứng dụng hoặc sự cố nào khác cản trở. Nếu không, bạn sẽ gặp phải trường hợp cố gắng xem tệp .js có thể khiến trình duyệt cố chạy nó thay vì hiển thị cho bạn.

Trên hết, cả github và Pages.github đều không cố gắng trở thành CDN. Bạn thực sự nên:

  1. Tự lưu trữ tệp, nó không lớn.
  2. Sử dụng CDN chuyên dụng cho điều này và các tệp tĩnh khác trên trang web của bạn.
  3. Sử dụng một cái gì đó như cdnjs.com có ​​sẵn các phiên bản khác nhau của lessjs .
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.