组织外部JavaScript文件的好方法是什么?

时间:2020-03-06 14:46:51  来源:igfitidea点击:

在具有大量HTML页面的ASP.NET Web应用程序中,许多内联JavaScript函数正在积累。将它们组织到外部文件中的好的计划是什么?大多数功能特定于要为其编写页面的功能,但有一些功能与整个应用程序有关。

单个文件可能会变得很大。使用C#等,我通常将文件至少分为一个包含通用函数和类的文件,以便可以将同一文件用于其他应用程序,并将一个文件用于此应用程序的特定功能和类。但是,我认为大文件不会提高Web应用程序的性能。

在这方面有什么想法?

解决方案

我们可能希望每个页面都将其特定页面的JavaScript放在一个位置,然后将所有共享的JavaScript放在一个大文件中。如果我们对大文件进行SRC处理,则用户的浏览器将在首次加载时缓存JavaScript代码,并且文件大小不会成为问题。如果我们特别担心它,可以将JavaScript源打包/最小化为"可分发"形式,并节省几千字节。

单个文件很大,但已缓存。小文件太多意味着向服务器发送更多请求。这是一种平衡的行为。使用Firebug和YSlow之类的工具来衡量性能,并找出最适合应用程序的性能。

每个请求都有一些开销,因此总的来说,将所有内容组合到一个文件中可以提高性能。但是,这可能会减慢用户访问的第一页上的加载时间,并且如果某些用户从不需要js的某些部分,则可能导致无用的流量。

但是,这些问题中的第一个并没有那么多问题。如果我们有一个诸如注册页面之类的东西,每个人都首先访问它并花一些时间(填写表格等),则在html加载完毕后,js便可以在后台加载,而用户在无论如何都忙于表格。

在开发过程中,我会将js组织到不同的文件中。 e。一个用于一般材料,每个用于模型,然后在构建过程中将它们组合成一个文件。我们还应该在此时进行压缩。

它还取决于用户会话的寿命。如果用户可能会转到多个页面并在网站上花费很长时间,那么单个大文件值得一看,因为它已经被缓存了。如果用户更有可能来自Google,并且只点击了一个页面,那么最好每页只包含单个文件。

更新:我在博客文章中对此进行了更深入的解释。

假设我们表示" HTML页面"时是指.aspx页面,这就是我要做的:

假设我有一个名为foo.aspx的页面,并且有特定于它的JavaScript。我将.js文件命名为foo.aspx.js。然后我在基本页面类中使用类似的东西(即我的所有页面都继承自该类):

protected override void OnLoad(EventArgs e)
{
   base.OnLoad(e);
   string possiblePageSpecificJavaScriptFile = string.Format("{0}.js", this.TemplateControl.AppRelativeVirtualPath);
   if (File.Exists(Server.MapPath(possiblePageSpecificJavaScriptFile)) == true)
   {
      string absolutePath = possiblePageSpecificJavaScriptFile.Replace("~", Request.ApplicationPath);
      absolutePath = string.Format("/{0}", absolutePath.TrimStart('/'));
      Page.ClientScript.RegisterClientScriptInclude(absolutePath, absolutePath);
   }
}

因此,对于我的应用程序中的每个页面,这将寻找一个* .aspx.js文件,该文件与该页面的名称(在我们的示例中为foo.aspx.js)匹配,并在呈现的页面中放置一个脚本标记引用。它。 (最好提取" base.OnLoad(e);"之后的代码,我只是想尽量使其简短!)

为了完成此操作,我有一个注册表hack,它将导致任何* .aspx.js文件在Visual Studio解决方案资源管理器的* .aspx页面下方折叠(即,它将像* .aspx一样隐藏在页面下方)。 cs文件)。根据我们使用的Visual Studio的版本,注册表黑客有所不同。这是我在Windows XP上使用的一对夫妇(我不知道它们在Vista中是否有所不同,因为我不使用Vista)将每个复制到一个文本文件中并使用.reg扩展名重命名,然后执行该文件:

Visual Studio 2005

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio.0\Projects\{E24C65DC-7377-472b-9ABA-BC803B73C61A}\RelatedFiles\.aspx\.js]
@=""

Visual Studio 2008年

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio.0\Projects\{E24C65DC-7377-472b-9ABA-BC803B73C61A}\RelatedFiles\.aspx\.js]
@=""

在这些生效之前,我们可能需要重新引导计算机。此外,嵌套只会发生在新添加的.js文件中,我们可以通过将它们重新添加到项目中或者手动修改.csproj文件的XML来嵌套任何已经命名为* .aspx.js的文件。

无论如何,这就是我做事的方式,确实有助于使事情井井有条。对于包含常用JavaScript的JavaScript文件,我将它们保存在名为JavaScript的根级文件夹中,并且在我的基础页类中也有一些代码添加了这些引用。那应该很简单就能弄清楚。希望这对某人有帮助。

将" namespacing"与文件夹结构一起使用:

替代文字http://www.roosteronacid.com/js.jpg

我们要做的就是包括Base.js,因为该文件设置了所有名称空间。以及要在给定页面上使用的.js文件(类)。

就特定于页面的脚本而言,我通常根据ASPX / HTML页面来命名该脚本:

Default.aspx
Default.aspx.js

我建议,如果将JS分成单独的文件,则不要使用很多标签来包含它们,这会降低页面加载性能。而是使用服务器端包含在它们离开服务器之前对其进行内联。