Làm cách nào tôi có thể buộc khách hàng làm mới tệp JavaScript?


595

Chúng tôi hiện đang làm việc trong một phiên bản beta riêng tư và vì vậy vẫn đang trong quá trình thực hiện các thay đổi khá nhanh, mặc dù rõ ràng khi việc sử dụng đang bắt đầu tăng lên, chúng tôi sẽ làm chậm quá trình này. Điều đó đang được nói, một vấn đề chúng tôi đang gặp phải là sau khi chúng tôi đưa ra bản cập nhật với các tệp JavaScript mới, các trình duyệt máy khách vẫn sử dụng phiên bản được lưu trong bộ nhớ cache của tệp và họ không thấy bản cập nhật. Rõ ràng, trong một cuộc gọi hỗ trợ, chúng tôi chỉ cần thông báo cho họ để làm ctrlF5mới để đảm bảo rằng họ nhận được các tệp cập nhật từ máy chủ, nhưng tốt hơn là nên xử lý việc này trước thời điểm đó.

Suy nghĩ hiện tại của chúng tôi là chỉ cần đính kèm một số phiên bản vào tên của các tệp JavaScript và sau đó khi các thay đổi được thực hiện, hãy tăng phiên bản trên tập lệnh và cập nhật tất cả các tham chiếu. Điều này chắc chắn hoàn thành công việc, nhưng cập nhật các tài liệu tham khảo trên mỗi bản phát hành có thể trở nên cồng kềnh.

Vì tôi chắc chắn rằng chúng tôi không phải là người đầu tiên giải quyết vấn đề này, tôi đoán rằng tôi sẽ ném nó ra cộng đồng. Làm thế nào để bạn đảm bảo khách hàng cập nhật bộ đệm của họ khi bạn cập nhật mã của mình? Nếu bạn đang sử dụng phương pháp được mô tả ở trên, bạn có đang sử dụng quy trình đơn giản hóa thay đổi không?


Câu trả lời:


529

Theo tôi biết một giải pháp phổ biến là thêm một ?<version>liên kết src của tập lệnh.

Ví dụ:

<script type="text/javascript" src="myfile.js?1500"></script>

Tôi cho rằng tại thời điểm này không có cách nào tốt hơn tìm kiếm thay thế để tăng các "số phiên bản" này trong tất cả các thẻ script?

Bạn có thể có một hệ thống kiểm soát phiên bản làm điều đó cho bạn? Hầu hết các hệ thống kiểm soát phiên bản đều có cách tự động chèn số sửa đổi khi đăng ký.

Nó sẽ trông giống như thế này:

<script type="text/javascript" src="myfile.js?$$REVISION$$"></script>

Tất nhiên, luôn có những giải pháp tốt hơn như thế này .


5
Có ai biết nếu IE7 bỏ qua điều này? Có vẻ như đang bỏ qua dữ liệu được nối thêm và sử dụng tệp được lưu trong bộ nhớ cache khi tôi kiểm tra trong chế độ xem so sánh IE8.
Shane Reustle

4
Tôi luôn biết các chuỗi truy vấn là cặp khóa-giá trị như trong? Ver = 123. Cảm ơn! :)
Ankur-m

6
Tôi nghĩ rằng đó không phải là về số phiên bản cao hơn hoặc thấp hơn mà là về việc thay đổi giá trị biến được nối thêm vào thứ gì đó mà trình duyệt chưa thể lưu vào bộ nhớ cache.
Max Girkens

2
Gần đây chúng tôi đã gặp phải vấn đề tương tự và điều tốt nhất tôi có thể đưa ra là một chức năng đơn giản có đính kèm "? Mod = 123456" trong đó 123456 là dấu thời gian unix của ngày sửa đổi trên tệp. Điều đó dường như để khắc phục các vấn đề trong khi vẫn cho phép lưu vào bộ nhớ cache khi thích hợp. Tuy nhiên, tôi vẫn thấy các trình duyệt thẳng thừng bỏ qua chỉ thị này và sử dụng JS cũ, nhưng tôi không biết rằng có một "sửa chữa đầy đủ" thanh lịch.
VPel

31
Đối với nhận thức: đây được coi là một hack. Phương pháp này khiến trình duyệt nghĩ rằng một tệp mới đang được chỉ định, vì nó chỉ nhìn vào tên tệp đầy đủ mà không giải thích nó. foo.js?1không cùng tên với foo.js?2, vì vậy trình duyệt sẽ nghĩ rằng chúng là hai tệp khác nhau. Một nhược điểm là cả hai tệp sẽ tồn tại đồng thời trong bộ đệm của người dùng, chiếm dung lượng không cần thiết.
Lee White

88

Áp dụng thời gian hiện tại vào URL thực sự là một giải pháp phổ biến. Tuy nhiên, bạn cũng có thể quản lý việc này ở cấp máy chủ web, nếu bạn muốn. Máy chủ có thể được cấu hình để gửi các tiêu đề HTTP khác nhau cho các tệp javascript.

Ví dụ: để buộc tệp được lưu trong bộ nhớ cache không quá 1 ngày, bạn sẽ gửi:

Cache-Control: max-age=86400, must-revalidate

Đối với phiên bản beta, nếu bạn muốn buộc người dùng luôn nhận được bản mới nhất, bạn sẽ sử dụng:

Cache-Control: no-cache, must-revalidate

3
Anh lam ơn cụ thể chut hơn được không?
Kreker

6
Anh ta đang nói về các tiêu đề được gửi bởi máy chủ web cho mỗi tệp. Nên được cấu hình trong Apache chẳng hạn. Tôi nghĩ rằng đây sẽ là sự chấp thuận tốt nhất
Pierre de LESPINAY

1
Bạn cấu hình cái này ở đâu?
Diego

2
Đối với một ứng dụng web phát triển, nó có thể là một giải pháp tốt. Đối với một trang web sản xuất, nơi bạn không muốn vô hiệu hóa bộ đệm vĩnh viễn, đó không phải là một giải pháp tốt trừ khi bạn biết rằng mỗi và mọi trình duyệt máy khách mục tiêu đã đến trang web. Nó làm tôi nghĩ đến một tính năng máy chủ web tiềm năng: điều chỉnh tham số tuổi tối đa theo ngày triển khai được định cấu hình. Điêu đo thật tuyệt vơi.
Claude Brisson

Chrome YÊU CẦU các cài đặt này để lưu trữ đúng cách. Không có chúng, Chrome sẽ lưu trữ tệp vĩnh viễn. Mozilla sử dụng một mặc định hợp lý hơn nhiều. Xem thêm tại: agiletribe.wordpress.com/2018/01/29/caching-for-chrom
AgilePro

42

Tốc độ trang của Google: Không bao gồm chuỗi truy vấn trong URL cho tài nguyên tĩnh. Hầu hết các proxy, đáng chú ý nhất là Squid lên đến phiên bản 3.0, không lưu trữ tài nguyên với dấu "?" trong URL của họ ngay cả khi kiểm soát bộ đệm: tiêu đề công khai có mặt trong phản hồi. Để bật bộ đệm ẩn proxy cho các tài nguyên này, hãy xóa các chuỗi truy vấn khỏi tham chiếu đến tài nguyên tĩnh và thay vào đó mã hóa các tham số vào chính tên tệp.

Trong trường hợp này, bạn có thể đưa phiên bản vào URL ex: http://abc.com/ v1.2 /script.js và sử dụng apache mod_rewrite để chuyển hướng liên kết đến http://abc.com/script.js . Khi bạn thay đổi phiên bản, trình duyệt máy khách sẽ cập nhật tệp mới.


Tôi đã thử? giải pháp và trong IE8 và tôi gặp lỗi javascript. Mod viết lại là một tùy chọn nhưng trong hầu hết các trường hợp, chúng tôi sẽ không có nhiều quyền kiểm soát máy chủ. Tôi muốn nối thêm phiên bản trong tệp js hoặc có một thư mục cho mỗi phiên bản
Karthik Sankar

@ Hắc Huyền Minh: Nhưng khi tập lệnh sẽ được tải lại, nó không nên được tải lại từ bộ đệm proxy ...
Stefan Steiger

34

Việc sử dụng này đã bị hủy bỏ: https://developer.mozilla.org/en-US/docs/Web/HTML/Using_the_application_cache

Câu trả lời này chỉ trễ 6 năm, nhưng tôi không thấy câu trả lời này ở nhiều nơi ... HTML5 đã giới thiệu Cache ứng dụng được sử dụng để giải quyết vấn đề này. Tôi đã tìm thấy mã máy chủ mới mà tôi đang viết đang làm hỏng javascript cũ được lưu trữ trong trình duyệt của mọi người, vì vậy tôi muốn tìm cách hết hạn javascript của họ. Sử dụng tệp kê khai trông như thế này:

CACHE MANIFEST
# Aug 14, 2014
/mycode.js

NETWORK:
*

và tạo tệp này với dấu thời gian mới mỗi lần bạn muốn người dùng cập nhật bộ đệm của họ. Là một lưu ý phụ, nếu bạn thêm phần này, trình duyệt sẽ không tải lại (ngay cả khi người dùng làm mới trang) cho đến khi bảng kê khai cho biết.


Giải pháp này thực sự tốt, miễn là bạn nhớ cập nhật tệp kê khai :)
Mattis

24
Vui lòng đọc tài liệu này vì tính năng này đã bị xóa khỏi nhà phát triển
Web.mozilla.org/en-US/docs/Web/HTML/ợi

1
FWIW, tôi đã không sử dụng giải pháp này. Nó dễ dàng hơn nhiều để sử dụng / duy trì ?<version> cách tiếp cận.
amos

28

Làm thế nào về việc thêm các kích thước tập tin như là một tham số tải?

<script type='text/javascript' src='path/to/file/mylibrary.js?filever=<?=filesize('path/to/file/mylibrary.js')?>'></script>

Vì vậy, mỗi khi bạn cập nhật tệp, tham số "filever" sẽ thay đổi.

Làm thế nào về khi bạn cập nhật tệp và kết quả cập nhật của bạn trong cùng kích thước tệp? tỷ lệ cược là gì?


4
Điều này sử dụng các thẻ PHP và nếu một người sử dụng PHP, đó thực sự là một ý tưởng tốt.
Jerther

1
Tôi nghĩ rằng việc thay đổi sẽ tốt hơn kích thước tệp :)
Mazz

2
Suy nghĩ ban đầu của tôi là thêm một tệp băm thay vì phiên bản.
Mike Cheel

Tôi giả sử rằng nó cũng hoạt động nếu thêm dấu thời gian Unix, phải không? ví dụ '... file.js? filever = <? = time ()?>
garanda

3
sử dụng filemtime ($ file) nó xuất ra dấu thời gian của tệp, với thời gian () bạn không thể sử dụng bộ đệm khi nó thay đổi mỗi giây.
neoteknic

19

Không phải tất cả các tệp bộ nhớ cache của trình duyệt với '?'trong đó. Những gì tôi đã làm để đảm bảo nó được lưu trữ càng nhiều càng tốt, tôi đã đưa phiên bản vào tên tệp.

Vì vậy, thay vì stuff.js?123, tôi đã làmstuff_123.js

Tôi đã sử dụng mod_redirect(tôi nghĩ) trong apache have stuff_*.jsđể đistuff.js


Bạn có thể giải thích rõ hơn về những gì bạn đã làm trong .htaccess với mod_redirect không?
Venkat D.

3
Một lời giải thích chi tiết về phương pháp này có thể được tìm thấy tại particletree.com/notebook/
Kẻ

3
Sẽ thật tuyệt nếu bạn có thể bao gồm .htaccessmã của mình trong câu trả lời của bạn để tham khảo trong tương lai.
Fizzix

1
Những trình duyệt nào không lưu trữ tệp với "?" trong đó?
rosell.dk

13

Đối với các trang ASP.NET tôi đang sử dụng như sau

TRƯỚC

<script src="/Scripts/pages/common.js" type="text/javascript"></script>

SAU (tải lại lực lượng)

<script src="/Scripts/pages/common.js?ver<%=DateTime.Now.Ticks.ToString()%>" type="text/javascript"></script>

Thêm DateTime.Now.Ticks hoạt động rất tốt.


31
Điều này đi ngược lại với tất cả các cơ chế bộ nhớ đệm ở phía khách hàng. tham số giả nên được thay thế bằng một cái gì đó như "{phiên bản chính} _ {junior_version} _ {build_number} _ {Revision} sẽ là duy nhất cho mỗi bản phát hành.
Tohid

14
Mặc dù đây có lẽ là một giải pháp thần thánh trong môi trường phát triển, nhưng nó không phù hợp cho sản xuất. Điều này sẽ hoàn toàn vô hiệu hóa bộ đệm mỗi lần trang được tải cho tệp. Hãy tưởng tượng tải trang 10k mỗi ngày với một tệp 50Kb, nó đại diện cho 500Mb tệp Javascript trên cơ sở hàng ngày.
PhilDulac

@PhilDulac bạn có thể thay đổi nó từ Ticks để trả về giá trị chuỗi của ngày chẳng hạn, hoặc tháng hoặc tuần trong tháng. Cuối cùng, nó chỉ cho bạn thấy cách sử dụng phương pháp? V
alex

3
@alex Thật vậy. Tôi chỉ muốn cảnh báo rằng nếu việc sử dụng được thể hiện trong câu trả lời được đưa vào sản xuất, nó có thể có những tác động không thể hiện trong quá trình phát triển.
PhilDulac

2
Một cách có thể để đảm bảo rằng các bản sao mới được tải mỗi ngày một lần có thể là sử dụng loại '<script src = "/ ScScript / page / common.js? Ver <% = DateTime.Now.ToString (" yyyyMMdd ")%>" = "văn bản / javascript"> </ script> '. Vì vậy, nó tải một lần vào đầu ngày, sau đó được lưu trữ.
Robb Sadler

7

Đối với ASP.NET tôi cho rằng giải pháp tiếp theo với các tùy chọn nâng cao (chế độ gỡ lỗi / phát hành, phiên bản):

Các tệp Js hoặc Css được bao gồm theo cách đó:

<script type="text/javascript" src="Scripts/exampleScript<%=Global.JsPostfix%>" />
<link rel="stylesheet" type="text/css" href="Css/exampleCss<%=Global.CssPostfix%>" />

Global.JsPostfix và Global.CssPostfix được tính theo cách sau trong Global.asax:

protected void Application_Start(object sender, EventArgs e)
{
    ...
    string jsVersion = ConfigurationManager.AppSettings["JsVersion"];
    bool updateEveryAppStart = Convert.ToBoolean(ConfigurationManager.AppSettings["UpdateJsEveryAppStart"]);
    int buildNumber = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.Revision;
    JsPostfix = "";
#if !DEBUG
    JsPostfix += ".min";
#endif      
    JsPostfix += ".js?" + jsVersion + "_" + buildNumber;
    if (updateEveryAppStart)
    {
        Random rand = new Random();
        JsPosfix += "_" + rand.Next();
    }
    ...
}

Tôi đang sử dụng .Ticks (xem câu trả lời của tôi trên trang này)
Ravi Ram

5

Thực tế phổ biến hiện nay là tạo mã băm nội dung như một phần của tên tệp để buộc trình duyệt, đặc biệt là IE tải lại các tệp javascript hoặc tệp css.

Ví dụ,

nhà cung cấp. a7561fb0e9a071baadb9 .js
chính. b746e3eb72875af2caa9 .js

Nó thường là công việc cho các công cụ xây dựng như webpack. Dưới đây là chi tiết hơn nếu bất cứ ai muốn dùng thử nếu bạn đang sử dụng webpack.


4

Nếu bạn đang tạo trang liên kết đến các tệp JS, một giải pháp đơn giản là nối thêm dấu thời gian sửa đổi cuối cùng của tệp vào các liên kết được tạo.

Điều này rất giống với câu trả lời của Huppin, nhưng hoạt động trong các hệ thống kiểm soát phiên bản mà không cần thay thế từ khóa. Nó cũng tốt hơn so với thời gian hiện tại, vì điều đó sẽ ngăn bộ nhớ đệm ngay cả khi tập tin không thay đổi.


Tôi thích giải pháp này, vì nó dễ bảo trì nhất. Nếu bạn cập nhật tệp .js, đó là tất cả những gì bạn cần làm. Không cần cập nhật bất kỳ tham chiếu nào đến tệp, vì mã của bạn sẽ tự động thêm dấu thời gian được cập nhật mới nhất.
NL3294

3

Hàm getScript cũng có thể được sử dụng để đảm bảo rằng tệp js thực sự được tải mỗi khi trang được tải.

Đây là cách tôi đã làm nó:

$(document).ready(function(){
    $.getScript("../data/playlist.js", function(data, textStatus, jqxhr){
         startProgram();
    });
});

Kiểm tra chức năng tại http://api.jquery.com/jQuery.getScript/

Theo mặc định, $ .getScript () đặt cài đặt bộ đệm thành false. Điều này sẽ nối một tham số truy vấn được đánh dấu thời gian vào URL yêu cầu để đảm bảo rằng trình duyệt tải xuống tập lệnh mỗi khi được yêu cầu.


8
Chúng tôi cần lưu trữ các tập tin bộ đệm nếu không có thay đổi xảy ra.
Leo Lee

3

Trong PHP :

function latest_version($file_name){
    echo $file_name."?".filemtime($_SERVER['DOCUMENT_ROOT'] .$file_name);
}

Trong HTML :

<script type="text/javascript" src="<?php latest_version('/a-o/javascript/almanacka.js'); ?>">< /script>

Làm thế nào nó hoạt động:

Trong HTML, hãy viết filepathvà tên như bạn đã làm, nhưng chỉ trong hàm. PHP lấy filetimetệp và trả về filepath+name+"?"+timethay đổi mới nhất


3

Chúng tôi đã tạo SaaS cho người dùng và cung cấp cho họ tập lệnh để đính kèm trong trang web của họ và không thể đính kèm phiên bản với tập lệnh vì người dùng sẽ đính kèm tập lệnh vào trang web của họ cho các chức năng và tôi không thể ép buộc họ để thay đổi phiên bản mỗi lần chúng tôi cập nhật tập lệnh

Vì vậy, chúng tôi đã tìm ra cách tải phiên bản mới hơn của tập lệnh mỗi lần người dùng gọi tập lệnh gốc

liên kết tập lệnh được cung cấp cho người dùng

<script src="https://thesaasdomain.com/somejsfile.js" data-ut="user_token"></script>

tập tin kịch bản

if($('script[src^="https://thesaasdomain.com/somejsfile.js?"]').length !== 0) {
   init();
} else {
   loadScript("https://thesaasdomain.com/somejsfile.js?" + guid());
}

var loadscript = function(scriptURL) {
   var head = document.getElementsByTagName('head')[0];
   var script = document.createElement('script');
   script.type = 'text/javascript';
   script.src = scriptURL;
   head.appendChild(script);
}

var guid = function() {
    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
        var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
        return v.toString(16);
    });
}

var init = function() {
    // our main code
}

Giải trình:

Người dùng đã đính kèm tập lệnh được cung cấp cho họ trong trang web của họ và chúng tôi đã kiểm tra mã thông báo duy nhất được đính kèm với tập lệnh có tồn tại hay không sử dụng bộ chọn jQuery và nếu không thì tải nó một cách linh hoạt bằng mã thông báo mới hơn (hoặc phiên bản)

Đây là cuộc gọi cùng một kịch bản hai lần có thể là một vấn đề về hiệu năng, nhưng nó thực sự giải quyết được vấn đề buộc tập lệnh không tải từ bộ đệm mà không đưa phiên bản vào liên kết tập lệnh thực tế được cung cấp cho người dùng hoặc máy khách

Tuyên bố miễn trừ trách nhiệm: Không sử dụng nếu hiệu suất là một vấn đề lớn trong trường hợp của bạn.


2

Trong asp.net mvc, bạn có thể sử dụng @ DateTime.UtcNow.ToString () cho số phiên bản tệp js. Số phiên bản tự động thay đổi theo ngày và bạn buộc trình duyệt máy khách tự động làm mới tệp js. Tôi sử dụng phương pháp này và điều này là hoạt động tốt.

<script src="~/JsFilePath/JsFile.js?v=@DateTime.UtcNow.ToString()"></script>

Cũng như các giải pháp được đề xuất khác, điều này sẽ khiến tệp không bao giờ được lưu vào bộ đệm, điều này thường không mong muốn. Miễn là không có thay đổi nào được thực hiện đối với tệp, bạn có thể muốn máy khách sử dụng phiên bản được lưu trong bộ nhớ cache thay vì tải xuống tệp không thay đổi mỗi lần.
Philip Stratford

Bạn có thể sử dụng mã bên dưới vì lý do của mình, tệp bộ đệm có số phiên bản <script src = "~/JsFilePath/JsFile.js?v=@GetAppVersionNumber ()"> </ script>
dragonal

2

location.reload (đúng);

xem https://www.w3schools.com/jsref/met_loc_reload.asp

Tôi tự động gọi dòng mã này để đảm bảo rằng javascript đã được truy xuất lại từ máy chủ web thay vì từ bộ đệm của trình duyệt để thoát khỏi vấn đề này.


Thêm onload="location.reload();"vào biểu mẫu của tôi cho phép tôi có được JS mới sau khi làm mới thay vì khởi chạy lại trang của mình. Đây là một giải pháp thanh lịch hơn nhiều. Cảm ơn!
ZX9

Cảm ơn, có thể sử dụng điều này với một kiểm tra nếu ip được nhận ra nhưng chưa được sử dụng để đăng nhập vì bản cập nhật cuối cùng thực hiện điều này trên trang chỉ mục sau khi người dùng đăng nhập lần đầu.
Fi Horan

onload = "location.reload (đúng);" Những điều trên cũng không hiệu quả với tôi (sử dụng bình và phiên bản hiện tại của Chrome): w3schools.com/jsref/met_loc_reload.asp
aspiresGuru

1

Một giải pháp là nối một chuỗi truy vấn có dấu thời gian trong đó vào URL khi tìm nạp tài nguyên. Điều này lợi dụng thực tế là một trình duyệt sẽ không lưu trữ tài nguyên bộ đệm từ các URL có chuỗi truy vấn trong đó.

Có lẽ bạn không muốn trình duyệt không lưu trữ các tài nguyên này; nhiều khả năng là bạn muốn chúng được lưu trong bộ nhớ cache, nhưng bạn muốn trình duyệt tìm nạp phiên bản mới của tệp khi nó được cung cấp.

Giải pháp phổ biến nhất dường như là nhúng dấu thời gian hoặc số sửa đổi vào chính tên tệp. Đây là một công việc nhiều hơn một chút, bởi vì mã của bạn cần được sửa đổi để yêu cầu các tệp chính xác, nhưng điều đó có nghĩa là, ví dụ, phiên bản 7 của snazzy_javascript_file.js(tức là snazzy_javascript_file_7.js) của bạn được lưu trữ trên trình duyệt cho đến khi bạn phát hành phiên bản 8, và sau đó mã của bạn thay đổi thành lấy snazzy_javascript_file_8.jsđể thay thế.


1

Ưu điểm của việc sử dụng file.js?V=1hơn mộtfileV1.js là bạn không cần lưu trữ nhiều phiên bản tệp JavaScript trên máy chủ.

Những rắc rối tôi gặp phải với file.js?V=1 là bạn có thể có mã phụ thuộc trong một tệp JavaScript khác bị hỏng khi sử dụng phiên bản mới của tiện ích thư viện.

Vì mục đích tương thích ngược, tôi nghĩ sẽ tốt hơn nếu sử dụng jQuery.1.3.jscho các trang mới của bạn và để các trang hiện có sử dụng jQuery.1.1.js, cho đến khi bạn sẵn sàng nâng cấp các trang cũ hơn, nếu cần.


1

Sử dụng một GETbiến phiên bản để ngăn bộ nhớ đệm trình duyệt.

Việc thêm ?v=AUTO_INCREMENT_VERSIONvào cuối url của bạn sẽ ngăn bộ nhớ đệm của trình duyệt - tránh bất kỳ và tất cả các tập lệnh được lưu trong bộ nhớ cache.


1

Đồng nghiệp của tôi vừa tìm thấy một tài liệu tham khảo về phương pháp đó ngay sau khi tôi đăng (tham khảo css) tại http://www.stefanhayden.com/blog/2006/04/03/css-caching-hack/ . Thật tốt khi thấy những người khác đang sử dụng nó và nó dường như hoạt động. Tôi cho rằng tại thời điểm này không có cách nào tốt hơn tìm kiếm thay thế để tăng các "số phiên bản" này trong tất cả các thẻ script?



1

Cache Busting trong ASP.NET Core thông qua trình trợ giúp thẻ sẽ xử lý việc này cho bạn và cho phép trình duyệt của bạn giữ các tập lệnh / css được lưu trong bộ đệm cho đến khi tệp thay đổi. Chỉ cần thêm thẻ helper asp-append-version = "true" vào thẻ script (js) hoặc thẻ liên kết (css) của bạn:

<link rel="stylesheet" href="~/css/site.min.css" asp-append-version="true"/>

Dave Paquette có một ví dụ điển hình và giải thích về bộ nhớ cache busting đây (cuối trang) chặn truy xuất cache


Điều này không hoạt động trong ASP.NET thông thường? Tôi đã thử thêm phiên bản asp-append vào thẻ script của mình và tất cả các trình duyệt thấy là thẻ script chính xác như nó xuất hiện trong nguồn, bao gồm cả thuộc tính phiên bản asp-append.
tolsen64

Đây là thuộc tính .NET Core được liên kết với Trình trợ giúp thẻ. Nó gắn tên tập lệnh với một phiên bản để máy chủ / trình duyệt luôn thấy phiên bản mới nhất và các bản tải xuống
ccherwin

0

Giải pháp đơn giản nhất? Đừng để bộ nhớ cache của trình duyệt cả. Nối thời gian hiện tại (tính bằng ms) dưới dạng truy vấn.

(Bạn vẫn đang trong giai đoạn thử nghiệm, vì vậy bạn có thể đưa ra một trường hợp hợp lý vì không tối ưu hóa hiệu suất. Nhưng YMMV ở đây.)


13
IMHO đây là một giải pháp kém. Điều gì nếu bạn không ở BETA và bạn đưa ra một bản cập nhật quan trọng?
d -_- b

0

Một cách đơn giản. Chỉnh sửa htaccess

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} \.(jpe?g|bmp|png|gif|css|js|mp3|ogg)$ [NC]
RewriteCond %{QUERY_STRING} !^(.+?&v33|)v=33[^&]*(?:&(.*)|)$ [NC]
RewriteRule ^ %{REQUEST_URI}?v=33 [R=301,L]

Điều này gây ra một chuyển hướng là một giải pháp tối ưu, nhưng hiệu quả tối ưu.
hai lần vào

0

Dưới đây làm việc cho tôi:

<head>
<meta charset="UTF-8">
<meta http-equiv="cache-control" content="no-cache, must-revalidate, post-check=0, pre-check=0" />
<meta http-equiv="cache-control" content="max-age=0" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="expires" content="Tue, 01 Jan 1980 1:00:00 GMT" />
<meta http-equiv="pragma" content="no-cache" />
</head>
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.