代码之家  ›  专栏  ›  技术社区  ›  dreftymac

寻找一个实际上不存在的javascript文件是否有任何负面影响?

  •  7
  • dreftymac  · 技术社区  · 16 年前

    如果在HTML文件中执行script src=“/path/to/nonexistent/file.js”,并在浏览器中调用它,并且HTML文件中的任何其他地方都没有依赖项或资源,而这些依赖项或资源期望文件或其中的代码实际存在,那么执行此操作有什么固有的错误做法吗?

    是的,这是个奇怪的问题。其基本原理是开发人员正在处理CMS,该CMS允许在某些情况下提供自定义(自包含)的JavaScript文件。问题是CMS在为javascript创建条件include时不是很灵活。因此,只需引用自包含的JS文件就更容易了,不管它们是否实际位于指定的路径上。

    由于没有错误显示给用户,该实践是否应被视为一个可行的选项?

    6 回复  |  直到 16 年前
        1
  •  1
  •   Kent Fredric    16 年前

    如果您在 <head> 标记(不建议用于初学者),它也会使初始页面呈现时间稍微变慢。

    如果您的站点不快速返回404,而只是接受连接,然后从不响应,这可能会导致页面需要无限长的时间来加载,在某些情况下,会锁定整个用户界面。

    (至少有一个版本的火狐是这样的,我希望他们已经修复了它,因为我在两年前就看到了这一点。*)

    你至少应该把标签放在页面顺序中尽可能低的位置来解决这个问题。

    到目前为止,您最好的选择是拥有一个一致的no-op url,该url用作所有“不存在”的javascript文件的填充,它返回一个0字节的响应,其中包含HTTP头,告诉UA将其缓存到牛回家为止,这将抵消大多数服务器在第一次命中后的客户端加载惩罚(这几乎不会伤害人)即使是以前的拨号)

    *经验教训:不要把script-src引用放在头上,尤其是对于主机外托管的第三方脚本,因为这样您就可以享受让客户能够访问您的网站的乐趣,但会冒着由于一些互联网怪异而无法访问的广告JS导致页面无法操作的风险。即使他们是著名的第三方。

        2
  •  2
  •   Jakub Hampl    16 年前

    嗯,主要的缺点是性能,因为浏览器会尝试(很难)下载文件,而您的服务器会查找它。最后,浏览器可能会下载404页,从而降低页面加载速度。

        3
  •  1
  •   great_llama    16 年前

    如果您的Web服务器配置为处理404错误(“您可能正在查找此错误”等),那么您也会在服务器上造成不必要的负载。

        4
  •  1
  •   Neil McGuigan    16 年前
    1. 你应该问问自己,为什么你太懒了,不能自己去测试这个:)

    2. 我测试了1000个随机的javascript文件名,它需要几纳秒的时间来加载,所以不,这没有什么区别。例子:

    script src=“/7701992spolsky.js”

    然而,这是在我的本地机器上进行的,所以浏览器需要花费n*roundtrip时间来计算远程服务器,其中n是坏脚本的数量。

    1. 但是,如果您有不存在的随机域名,例如

    script src=“http://www.randomsite7701992.com/spolsky.js”

    那就需要很长的时间。

        5
  •  0
  •   sibidiba    16 年前

    如果您选择这样实现它,您可以调整Web服务器,如果没有找到引用的JS文件,而不是404,它可以返回重定向(301)到空的/默认的JS文件。

        6
  •  0
  •   ak    16 年前

    如果您使用的是ASP.NET,那么可以使用自定义处理程序(ashx文件)。 下面是一个例子:

    public class JavascriptHandler : IHttpHandler {
    
        public void ProcessRequest (HttpContext context) 
        {
          context.Response.ContentType = "text/plain";
          //Some code to check if javascript code exists
          string js = ""; 
    
          if(JavascriptExists())
          {
            js = GetJavascript();
          }
          context.Response.write(js);
        }
    }
    

    然后,在HTML头中,可以声明指向自定义处理程序的文件:

    src="/js/javascripthandler.ashx"