[javascript] 브라우저가 asp.net 응용 프로그램에서 최신 js 및 css 파일을 가져 오도록 강제
일부 브라우저는 js 및 css 파일을 캐시하여 강제하지 않으면 새로 고치지 못합니다. 가장 쉬운 방법은 무엇입니까?
방금 작동하는 것처럼 보이는이 솔루션을 구현했습니다.
페이지에서 버전 변수 선언
public string version { get; set; }
web.config 키에서 버전 번호 가져 오기
version = ConfigurationManager.AppSettings["versionNumber"];
aspx 페이지에서 자바 스크립트와 스타일 시트를 이렇게 호출하십시오.
<script src="scripts/myjavascript.js?v=<%=version %>" type="text/javascript"></script>
<link href="styles/mystyle.css?v=<%=version %>" rel="stylesheet" type="text/css" />
따라서 web.config에서 버전을 1.0에서 1.1로 설정하면 브라우저가 최신 파일을 다운로드하여 사용자와 사용자의 불만을 덜어줍니다.
더 잘 작동하는 다른 솔루션이 있습니까? 아니면 웹 사이트에 예기치 않은 문제가 발생합니까?
답변
마지막으로 수정 된 타임 스탬프를 스크립트에 대한 쿼리 매개 변수로 지정하여이 문제를 해결했습니다.
확장 방법을 사용하여이를 CSHTML 파일에서 사용했습니다. 참고 : 이 구현은 1 분 동안 타임 스탬프를 캐시하므로 디스크를 너무 많이 쓰지 않습니다.
확장 방법은 다음과 같습니다.
public static class JavascriptExtension {
public static MvcHtmlString IncludeVersionedJs(this HtmlHelper helper, string filename) {
string version = GetVersion(helper, filename);
return MvcHtmlString.Create("<script type='text/javascript' src='" + filename + version + "'></script>");
}
private static string GetVersion(this HtmlHelper helper, string filename)
{
var context = helper.ViewContext.RequestContext.HttpContext;
if (context.Cache[filename] == null)
{
var physicalPath = context.Server.MapPath(filename);
var version = $"?v={new System.IO.FileInfo(physicalPath).LastWriteTime.ToString("MMddHHmmss")}";
context.Cache.Add(filename, version, null,
DateTime.Now.AddMinutes(5), TimeSpan.Zero,
CacheItemPriority.Normal, null);
return version;
}
else
{
return context.Cache[filename] as string;
}
}
}
그리고 CSHTML 페이지에서 :
@Html.IncludeVersionedJs("/MyJavascriptFile.js")
렌더링 된 HTML에서는 다음과 같이 나타납니다.
<script type='text/javascript' src='/MyJavascriptFile.js?20111129120000'></script>
답변
솔루션이 작동합니다. 사실 꽤 인기가 있습니다.
Stack Overflow도 비슷한 방법을 사용합니다.
<link rel="stylesheet" href="http://sstatic.net/so/all.css?v=6184">
v=6184
SVN 개정 번호는 어디에 있습니까 ?
답변
에서 ASP.NET 코어 (MVC 6)이은을 통해 상자 밖으로 작동하는 asp-append-version
태그 도우미 :
<script src="scripts/myjavascript.js" asp-append-version="true"></script>
<link href="styles/mystyle.css rel="stylesheet" asp-append-version="true" />
답변
JS / CSS에 번들을 사용하는 경우 ASP.NET MVC가이를 처리합니다. 번들에 GUID 형식으로 버전 번호를 자동으로 추가하고 번들이 업데이트 될 때만이 GUID를 업데이트합니다 (일명 소스 파일에 변경 사항이 있음).
컨텐츠로드 시간을 크게 향상시킬 수 있으므로 JS / CSS 파일이 많은 경우에도 도움이됩니다.
답변
이를 위해 asp.net에 내장 된 방법이 있습니다 : 번들링 . 그냥 사용하세요. 각 새 버전에는 고유 한 접미사 “? v = XXXXXXX”가 있습니다. 디버그 모드에서는 번들링이 꺼져 있으며 web.config에서 make 설정을 켜는 경우 :
<system.web>
<compilation debug="false" />
</system.web>
또는 RegisterBundles (BundleCollection bundles) 메서드에 추가합니다.
BundleTable.EnableOptimizations = true;
예를 들면 :
BundleConfig.cs :
bundles.Add(new ScriptBundle("~/Scripts/myjavascript.js")
.Include("~/Scripts/myjavascript.js"));
bundles.Add(new StyleBundle("~/Content/mystyle.css")
.Include("~/Content/mystyle.css"));
_Layout.cshtml :
@Scripts.Render("~/Scripts/myjavascript.js")
@Styles.Render("~/Content/mystyle.css")
답변
질문에서 op에 의해 제공된 대답보다 더 간단한 대답이 있습니다 (접근 방식은 동일 함).
web.config에서 키를 정의하십시오.
<add key="VersionNumber" value="06032014"/>
aspx 페이지에서 직접 appsettings를 호출합니다.
<link href="styles/navigation.css?v=<%=ConfigurationManager.AppSettings["VersionNumber"]%>" rel="stylesheet" type="text/css" />
답변
Adam Tegan의 답변을 기반으로 웹 양식 응용 프로그램에서 사용하도록 수정되었습니다.
.cs 클래스 코드에서 :
public static class FileUtility
{
public static string SetJsVersion(HttpContext context, string filename) {
string version = GetJsFileVersion(context, filename);
return filename + version;
}
private static string GetJsFileVersion(HttpContext context, string filename)
{
if (context.Cache[filename] == null)
{
string filePhysicalPath = context.Server.MapPath(filename);
string version = "?v=" + GetFileLastModifiedDateTime(context, filePhysicalPath, "yyyyMMddhhmmss");
return version;
}
else
{
return string.Empty;
}
}
public static string GetFileLastModifiedDateTime(HttpContext context, string filePath, string dateFormat)
{
return new System.IO.FileInfo(filePath).LastWriteTime.ToString(dateFormat);
}
}
aspx 마크 업에서 :
<script type="text/javascript" src='<%= FileUtility.SetJsVersion(Context,"/js/exampleJavaScriptFile.js") %>'></script>
렌더링 된 HTML에서는 다음과 같이 나타납니다.
<script type="text/javascript" src='/js/exampleJavaScriptFile.js?v=20150402021544'></script>