【问题标题】:Should I embed CSS/JavaScript files in a web application?我应该在 Web 应用程序中嵌入 CSS/JavaScript 文件吗?
【发布时间】:2010-11-14 11:47:14
【问题描述】:

我最近开始将 JavaScript 和 CSS 文件嵌入到我们常用的库 DLL 中,以简化部署和版本控制。我只是想知道是否有任何理由想要对 Web 应用程序做同样的事情,或者是否最好将它们作为常规文件保留在 Web 应用程序中,并且只将嵌入式资源用于共享组件?

嵌入它们有什么好处吗?

【问题讨论】:

  • 请参阅here 以获取解决方案,我希望这个解决方案对您有所帮助

标签: asp.net projects-and-solutions embedded-resource


【解决方案1】:

我不得不做出同样的决定一次。我选择将我的 JavaScript/CSS 资源嵌入到我的 DLL 中的原因是为了防止在应用程序部署后篡改这些文件(被购买了我的 Web 应用程序的好奇的最终用户)。

我怀疑和质疑 Easement 关于浏览器如何下载 JavaScript 文件的评论的有效性。我很确定嵌入的 JavaScript/CSS 文件在页面发送到浏览器之前由 ASP.NET 临时重新创建,以便浏览器能够下载和使用它们。我对此很好奇,我将进行自己的测试。我会告诉你进展如何......

-弗林尼

【讨论】:

    【解决方案2】:

    当然,如果任何知道自己在做什么的人都可以使用程序集 Reflector 并提取 JS 或 CSS。但这比仅仅使用 FireBug 之类的东西来获取这些信息要多得多的工作。普通的最终用户不太可能会为了弄乱资源而遇到所有这些麻烦。任何对这类事情感兴趣的人都可能是恶意用户,而不是最终用户。如果用户能够在您的 DLL 上使用像程序集反射器这样的工具,您可能会遇到很多其他安全问题,因为此时您的服务器已经受到威胁。安全不是我决定嵌入资源的因素。

    关键是要防止用户对这些资源做一些愚蠢的事情,例如认为不需要它们而删除它们或以其他方式篡改它们。

    打包应用程序以进行部署也容易得多,因为涉及的文件更少。

    页面使用的 DLL(类库)确实更大,但这并不会使页面变得更大。 ASP.NET 生成需要向下发送到客户端(浏览器)的内容。发送给客户端的内容不会超过页面工作所需的内容。我看不出帮助为这些页面提供服务的类库对客户端和服务器之间发送的数据大小有何影响。

    但是,Rjlopes 有一个观点,浏览器可能无法缓存嵌入的 JavaScript/CSS 资源。我必须检查一下,但我怀疑 Rjlopes 是正确的:每次对服务器进行整页回发时,都必须下载 JavaScript/CSS 文件。如果这被证明是正确的,那么这种性能影响应该是您做出决定的一个因素。

    我仍然无法测试使用嵌入式资源、resex 和单个文件之间的性能差异,因为我一直忙于我的努力。希望我能在今天晚些时候讨论它,因为我对此非常好奇,而且浏览器缓存点 Rjlopes 已经提出。

    【讨论】:

    • 我对缓存问题很感兴趣。我无法想象他们不会使用一致的 URL 来允许浏览器缓存文件。
    • 通过 ScriptManager 渲染的嵌入式 JS 文件确实被缓存了,并且在整个应用程序中使用一致的 URL。我们在几个客户网站上使用它非常成功。
    • 感谢 Zhaph 的更新。您是否碰巧知道 Page.ClientScript.GetWebResourceUrl 方法是否同样适用?
    • 嵌入非常适合更新/版本控制 - 上传到客户端的次数更少。
    • 嵌入非常适合更新/版本控制,因为您需要上传到客户端的文件更少。不过也有一些问题。 * 您需要重新编译项目才能看到 css/javascript 的变化。这使得开发变得非常缓慢。 * 如果您支持主题并且有许多带有嵌入式资源的项目,那么事情就会变得难以维护,因为当您添加主题时,您需要将资源添加到每个项目并重新编译它们,而不是仅仅将所需的资源添加到单个项目中的 App_Themes 文件夹中并且编译/分发它。
    【解决方案3】:

    嵌入的原因:浏览器不会并行下载 JavaScript 文件。在文件下载之前,您有一个锁定条件。

    反对嵌入的原因:您可能不需要所有的 JavaScript 代码。因此,您可能会不必要地增加带宽/处理。

    【讨论】:

    • cuzillion (stevesouders.com/cuzillion) 可以向您展示页面上的每个内联/嵌入式选择和放置如何影响整个页面加载时间。
    • @easement,这是一个有趣的页面,但似乎有点做作。添加一个外部样式表,它会告诉您它将添加 2 秒的延迟,这似乎是任意的。而且它似乎没有解决嵌入式资源的想法。
    • 有些浏览器会并行检索,不是吗?或者至少我认为你可以告诉 Firefox 这样做。嵌入它们时,无论嵌入多少文件,它都只有一个链接吗?如果不是,我认为这不会有太大的不同。
    • @Robert Harvey- 是的,这有点做作,但原则是站得住脚的。 @Max Schmeling - FF 也是一个拦截器。您可以在 Firebug NET 面板中看到。话虽如此,我遇到了一些 JS,您可以添加它们以使它们并行运行。我没有测试过。 piecesofrakesh.blogspot.com/2009/03/…
    • 这是一段 Google 的 lsets 让网络更快的视频系列:code.google.com/speed/articles/include-scripts-properly.html
    【解决方案4】:

    关于浏览器缓存,据我所知,WebRecource.axd 上的响应显示“304 未修改”。所以,我猜,它们是从缓存中取出的。

    【讨论】:

      【解决方案5】:

      我不得不做出同样的决定一次。我选择将我的 JavaScript/CSS 资源嵌入到我的 DLL 中的原因是为了防止在应用程序部署后篡改这些文件(被购买了我的 Web 应用程序的好奇的最终用户)。 反对嵌入的原因:您可能不需要所有的 JavaScript 代码。因此,您可能会不必要地增加带宽/处理。

      【讨论】:

        【解决方案6】:

        您知道,如果有人想要篡改您的 JS 或 CSS,他们只需使用 Reflector 打开程序集,转到资源并编辑他们想要的内容(如果程序集已签名,可能需要做更多的工作)。

        如果您在页面上嵌入 js 和 css,则会使页面更大(每次请求下载更多 KB)并且浏览器无法缓存 JS 和 CSS 以供下一个请求。好消息是你的请求更少(如果你和我一样,至少有 2 个,并且结合了多个 js 和 css 和一个),而且 javascripts 存在连续下载的问题。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-05-29
          • 2012-11-16
          • 2017-11-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多