Bagaimana cara secara otomatis menambahkan nomor versi hash md5 ke file javascript dan css di Visual Studio atau menggunakan cara lain untuk memaksa penyegaran cache browser?

Setiap kali saya mengeluarkan file CSS atau javascript versi baru untuk aplikasi web mana pun, saya secara manual menambahkan ?v=# ke URL di bagian atas HTML (# adalah nomor versi, seperti 3 atau 10) untuk memastikan pengguna cache browser tidak menghalangi perubahan.

Tetapi beberapa aplikasi memiliki banyak file CSS dan beberapa JS di kepalanya dan sulit untuk melacak semua file yang diubah.

Kami menggunakan platform ASP.NET pada server IIS, jadi gunakan jawaban untuk Apa cara elegan untuk memaksa browser memuat ulang file CSS/JS yang di-cache? tidak mungkin tetapi saya mencari yang serupa. Sebaiknya semua javascript.

Saya suka saran di posting itu untuk menggunakan hash md5 tetapi sepertinya saya tidak dapat menemukan cara untuk menghitung checksum file CSS atau JS.

Kodenya akan terlihat seperti ini (menggunakan jQuery):

$.each($("script[type='text\javascript']"),function(){
    $(this).attr("src",$(this).attr("src") + "?v=" + checkMD5Sum($(this).attr("src")) );
});

function checkMD5Sum(url){
    //get the hash or something to auto version the file
    //I could send the url or filename to a webmethod to get the MD5 check sum, but doing this after page load is not usefull, so what to do?
}

Atau mungkin menggunakan proses postbuild di Visual Studio, namun saya belum pernah melakukannya sehingga enggan mencobanya.


Edit

Akan mencobanya di web.config sesuai Menambahkan Profil Caching

<configuration>
   <system.webServer>
      <caching enabled="true">
         <profiles>
            <add extension=".js" policy="CacheUntilChange" />
            <add extension=".css" policy="CacheUntilChange" />
         </profiles>
      </caching>
   </system.webServer>
</configuration>

person Daniël Tulp    schedule 14.09.2015    source sumber


Jawaban (2)


Solusi Anda tampaknya mengharuskan browser mengambil file dua kali, dan Anda tidak diberikan jaminan atas status pengambilan pertama. Jadi itu tidak berhasil.

Caching diarahkan oleh server. Tidak mungkin memutuskan kapan versi baru tersedia di klien - kecuali Anda mengabaikan cache dan selalu mengambil salinan baru.

Ada banyak cara untuk menerapkan kebijakan caching. Sidik jari dengan nomor versi adalah salah satunya.

Saya lebih suka menggunakan ETag. Jadikan ETag sebagai waktu file dan Anda baik-baik saja.

person Halcyon    schedule 14.09.2015
comment
Bagaimana cara menerapkan ETag pada file di IIS? - person Daniël Tulp; 14.09.2015
comment
Saya tidak tahu cara kerjanya di IIS tetapi di Apache Anda dapat mengkonfigurasi header ETag di .htacess. Saya berharap Anda dapat melakukan hal serupa untuk IIS. - person Halcyon; 14.09.2015
comment
Anda dapat melakukannya di web.config. Saya yakin, telah melakukannya di proyek lain, tetapi saya tidak mengetahuinya opsi filemtime tersedia - person Daniël Tulp; 14.09.2015
comment
technet.microsoft.com/en-us/ library/ee619764(v=ws.10).aspx Untuk semua versi IIS, nilai ETag untuk objek yang dikembalikan didasarkan pada waktu file terakhir diubah. - person Halcyon; 14.09.2015
comment
Saya menggunakan server bersama, jadi mengonfigurasi IIS tidak dapat dilakukan, tetapi saya mungkin dapat menggunakan iis.net/configreference/system.webserver/caching/profiles/add, coba saja - person Daniël Tulp; 14.09.2015

  VersionNumber = System.Configuration.ConfigurationManager.AppSettings["Version"];

    //Caching Issues For JS
    public static string JSVersionUpdate(string JsFile)
    {
        StringBuilder str = new StringBuilder();
        str.Append(GetQualifiedPath(JsFile));
        str.Append("?Version=");
        str.Append(VersionNumber);
        return str.ToString();
    }

    public static void DiscardVersion()
    {
        VersionNumber = null;
    }

    //get Full Path for JS File
    private static string GetQualifiedPath(string path)
    {
        var httpRequestBase = new System.Web.HttpContextWrapper(System.Web.HttpContext.Current);

        path = path.Replace("~", string.Empty);

        string appPath = string.Empty;
        if (httpRequestBase != null)
        {
            //Formatting the fully qualified website url/name
            appPath = string.Format("{0}://{1}{2}{3}{4}",
                        httpRequestBase.Request.Url.Scheme,
                        httpRequestBase.Request.Url.Host,
                        httpRequestBase.Request.Url.Port == 80 ? string.Empty : ":" + httpRequestBase.Request.Url.Port,
                        httpRequestBase.Request.ApplicationPath,
                        path);
        }
        appPath = appPath.TrimEnd('/');

        return appPath;
    } 
}

Di Halaman UI : script src="JSVersionUpdate("~/Scripts/Application/Abc.js")"

O/p : ~/Scripts/Application/Abc.js/version=1.0

Permintaan browser untuk File JS dari server hanya jika Versinya Berbeda, maka itu akan di-cache. Sekarang saya tidak perlu memberitahu seseorang untuk menghapus cache lagi dan lagi setelah penerapan. Satu-satunya hal yang saya lakukan adalah mengubah Nomor Versi di Web Config

person Pankaj    schedule 11.07.2017