2015-04-08 21 views
6

Khá thẳng về phía trước, tôi đang phát triển một ứng dụng MVC5 và đã nhận thấy (gần đây) rằng Trình duyệt của tôi dường như đang lưu vào bộ nhớ mã JavaScript mà tôi có trên chế độ xem trong phạm vi @section Scripts { }.Buộc trình duyệt làm mới mã javascript trong khi phát triển Chế độ xem MVC?

Hiện nay tôi đang phát triển với Chrome và tôi đã cố gắng CTRL+F5 & CTRL+SHFT+R đó tải lại trang, nhưng alert() tôi uncomment trong mã javascript vẫn Rendering Nhờ việc nhận xét. Tôi cũng đã cố gắng truy cập vào localhost của mình thông qua chế độ Incognito cũng như các trình duyệt khác (Firefox, IE) và đang nhận được cùng một hành vi. Đây là Chế độ xem /Home/Index.cshtml của tôi, đây là Chế độ xem mặc định sẽ tải khi ứng dụng bắt đầu. Tôi cũng đã thử thêm một số văn bản HTML bổ sung vào trang và một lần nữa mã mới không có hiệu lực/hiển thị.

Phiên bản Chrome hiện tại của tôi là Version 41.0.2272.118 m nếu có ai có ý tưởng gì có thể xảy ra?


CẬP NHẬT:

Tôi cũng đã từng qua Developer Tools => Cài đặt chung trong Chrome và kiểm tra [X] Disable cache (while DevTools is open) và sau đó lặp đi lặp lại (với DevTools vẫn mở) cố gắng CTRL+SHFT+RCTRL+F5 với kết quả tương tự của trước nơi thay đổi của tôi không có hiệu lực.

UPDATE 2:

Với DevTools mở Tôi cũng đã tổ chức các nút Refresh xuống và cố gắng Thường/cứng/và Empty Cache & tùy chọn tải lại cứng tất cả với cùng một kết quả. Để đơn giản thử nghiệm tôi đã thêm một cảnh báo ở dưới đây để dispaly càng sớm càng tải trang (và hiện nay không có cảnh báo đi lên):

$(document).ready(function() { 
      alert("Test"); 
      // Other Code/Functions -- No Error showing in Console 
}); 
+0

Bạn có thể tắt bộ nhớ cache của Chrome khi Công cụ dành cho nhà phát triển mở: http://stackoverflow.com/a/7000899/1710624 –

+0

Bạn có thể đăng nội dung của chế độ xem để chúng tôi xem bằng Tập lệnh @section {} không ?? Có thể dễ dàng hơn nếu chúng ta có thể thấy những gì bạn đã làm. Ngoài ra với các công cụ phát triển mở chrome (F12) và nhấp vào cog để mở cài đặt, có hộp kiểm 'Vô hiệu hóa bộ nhớ cache', chọn nó và bây giờ nếu bạn làm mới trang bằng công cụ nhà phát triển mở nó sẽ không sử dụng bộ nhớ cache –

+0

Ngoài ra , điều này có thể không hữu ích, nhưng khi bảng gỡ lỗi chrome mở, bạn có thể nhấn và giữ nút tải lại trang để tải lại các tùy chọn. Chọn bộ nhớ cache trống và tải lại cứng cũng để xóa mọi phần tải tiếp theo khỏi bộ nhớ cache. Xem http://stackoverflow.com/questions/14969315/whats-the-difference-between-normal-reload-hard-reload-and-empty-cache-a để biết thêm thông tin. – Radio

Trả lời

5

Bạn có thể muốn thêm một biến no_cache sau url kịch bản của bạn như:

<script src="js/stg/[email protected]_number"></script> 

Nếu bạn quản lý để đưa một số ngẫu nhiên đến nơi tôi chỉ định, trình duyệt sẽ tự động tải về phiên bản mới nhất của kịch bản sau F5

22

Nếu bạn đang sử dụng Bundling from MVC, bạn có hai tùy chọn để vô hiệu hóa bộ nhớ đệm:

  1. Sử dụng BundleTable.EnableOptimizations. Điều này sẽ hướng dẫn việc nhóm nhỏ gọn và tối ưu hóa gói của bạn ngay cả khi gỡ lỗi. Nó tạo ra một băm trong quá trình, dựa trên nội dung của kịch bản, do đó, các trình duyệt của khách hàng của bạn có thể lưu trữ tệp này trong một thời gian dài. Nó sẽ tạo ra một băm hoàn toàn khác vào lần tiếp theo tệp của bạn thay đổi, vì vậy khách hàng của bạn có thể thấy các thay đổi của bạn. Nhược điểm là kịch bản của bạn sẽ trở thành không thể đọc được và bạn sẽ không thể gỡ lỗi nó, vì vậy đây có thể không phải là lựa chọn tốt nhất của bạn.
  2. Sử dụng System.Web.Optimization.BundleTable.Bundles.ResolveBundleUrl("url", true) để giải quyết URL của tập lệnh, thông số thứ hai (true) là requiring một băm được tạo bằng URL, do đó ngăn không cho lưu vào bộ nhớ cache từ trình duyệt của bạn khi bạn thay đổi tệp. Đây chính xác là cùng một băm được tạo ra trong tùy chọn đầu tiên, nhưng không giảm thiểu.

Tôi tạo ra một bản demo nhỏ cho thấy các tùy chọn thứ hai ngăn cản bộ nhớ đệm xảy ra, các trick là nhận được băm được tạo ra từ nội dung của kịch bản của bạn mà không cần rút gọn kịch bản của bạn.

Tôi tạo ra một tập tin script gọi myscript.js với nội dung này:

$(document).ready(function() { 
    alert('a'); 
}); 

Sau đó, tôi thêm này để BundleConfig.cs tôi:

// PLEASE NOTE this is **NOT** a ScriptBundle 
bundles.Add(new Bundle("~/bundles/myscripts").Include(
    "~/Scripts/myscript*")); 

Nếu bạn thêm một ScriptBundle, bạn sẽ nhận được một phản ứng được rút gọn lại , kể từ ScriptBundle chỉ là một Bundle sử dụng chuyển đổi JsMinify (source). Đó là lý do tại sao chúng tôi chỉ sử dụng Bundle.

Bây giờ bạn chỉ có thể thêm tập lệnh của mình bằng cách sử dụng phương pháp này để giải quyết URL tập lệnh với phụ lục băm. Bạn có thể sử dụng Script.Render

@Scripts.Render(System.Web.Optimization.BundleTable.Bundles.ResolveBundleUrl("~/bundles/myscripts", true)) 

Hoặc script tag:

<script src="@System.Web.Optimization.BundleTable.Bundles.ResolveBundleUrl("~/bundles/myscripts", true)"></script> 

Dù bằng cách nào sẽ tạo ra một URL với một băm để ngăn chặn bộ nhớ đệm:

enter image description here

Sau khi chỉnh sửa tập tin của tôi :

enter image description here

+3

Đôi khi nó là một sự xấu hổ hoàn toàn bạn không thể upvote n^n lần trả lời ... Một tuyệt vời! – Shockwaver

+0

câu trả lời tuyệt vời, nó hoạt động như một sự quyến rũ đối với tôi! Cảm ơn bạn – Robouste

+0

Đẹp nhất! Làm việc hoàn hảo. Cảm ơn – CodeHacker

2

Thủ thuật nhanh chóng giải quyết vấn đề này bao gồm mở tệp tập lệnh trong tab mới, sau đó làm mới tệp trên trang này. Nếu bạn có các công cụ phát triển Chrome, nó sẽ làm mới nó ở đó.

Từ công cụ dành cho nhà phát triển, bạn thậm chí có thể dễ dàng nhấp chuột phải vào tab mới trong tập lệnh.

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