在asp.net-mvc中引用特定于PartialView的javascript的最佳实践是什么?

6
我有一个asp.net-mvc网站,其中有一个部分视图在许多不同的视图中存在。
还有一个与该部分视图使用的功能相关联的.js文件。
现在我正在每个包含此部分视图的父视图中将js文件包含在头部部分中。
我现在考虑通过从每个父视图中删除对javascript文件的引用,并将该引用放置在部分视图的正文中来更轻松地维护它。 (因此,它只在一个地方列出)
有人看到这种变化的任何缺点吗? 这是仅由特定部分视图利用的javascript的推荐实践吗?

2
为什么不把所有的JS文件捆绑在一个单独的文件中,从而完全避免这个问题呢? - Evan Davis
我不理解你的评论。所有的js代码都在一个.js文件中。我只是试图确定引用该js文件的最佳实践(从每个父视图或内部局部视图)。 - leora
这就是你要找的:在局部视图中包含JavaScript文件 - Stanko
@leora,你是在询问特定的MVC框架版本吗? - Dave Alperovich
只需将其放入部分视图中。最好将变化一起的东西放在一起。 - Evan Larsen
7个回答

5
我会问自己几个问题:
1. js文件有多大?压缩后大小是多少? 2. 在你的应用程序中平均使用多少次?
如果它是一个很少被使用的大文件,我会将脚本包含在文件中,不会过多关注它。
需要记住的是,js文件是缓存的,如果普通用户进入部分视图,他将需要下载脚本。
至于处理脚本\样式的良好实践:
在生产中使用组合的js文件并对其进行压缩。这可以通过使用资产管理器或通过"分组"js文件来完成。
您还可以使用"require.js"来加载依赖脚本。我没有使用过它,但据我所知,您可以设置模块和依赖于其他模块和js文件的js函数。
链接: Bundles Cassette - For Assets RequireJS

3

在我看来,最好将它与其他脚本一起保留。

您应该对脚本进行捆绑、缩小和“永久缓存”。如果您这样做了,即使是对于站点的新用���,也只需要下载一个很小的文件。通过将其拆分成多个文件,您只会造成不便。最好让他们一次性下载您网站上所需的所有内容。

如果您有迥然不同的网站部分,且您不希望用户跨越这些部分,则可以考虑单独打包。例如,您的未经验证的部分和“仅限会员”的部分。即便如此,这也没有多大的区别,因此对于整个站点的结构而言,将它们捆绑起来可能更为合适(例如,“仅限会员”部分可能是一个不同的mvc区域)。

但是,仅仅因为并非每个页面都使用某个脚本而提取出局部脚本是徒劳无益的。

编辑:重新阅读后,我认为我更好地理解了。我之前说的话仍然适用,但要强调捆绑。不要仅为需要它的每个页面包含单个脚本引用。最好基本上将您网站所需的所有脚本捆绑在一起,并在每个页面上都包含它们。通过缓存,用户只需下载一次,然后在浏览您的网站时不再发出任何其他脚本请求,而不是每个页面都以需要下载的另一个独特脚本结束。


0

通过将引用放入局部视图的主体中,即可adhoc地加载JavaScript。这是一种正确的策略。您可以避免在所有其他页面上进行解析和解释的开销。即使您的JavaScript文件已缓存,仍然需要时间(尽管微不足道)来在包含它的每个页面上执行。如果其中有复杂的逻辑或迭代DOM,或者存在许多这样的文件怎么办?

实际上,这是成熟依赖性管理的第一步。如果您知道在哪个页面上使用了哪些功能,则以后的任何重构或维护工作都将更加廉价。

问题在于如何从局部视图中引用JavaScript资源。您不想只是在页面中间转储`


0

你的问题的答案可以从这个问题的答案中得出:

  • 你认为这个部分视图是整个 Web 应用程序的一部分还是一个独立的组件?

通常情况下,它是 Web 应用程序的一部分,因为你只会在这个 Web 应用程序中使用它。因此,从这个角度来看,没有必要将视图与其 JavaScript 捆绑在一起,因为 JavaScript 和视图都已经是 Web 应用程序的一部分。

  • 什么时候我们需要捆绑东西?

当它们彼此相关且与其整体之外的任何其他内容无关时。我怀疑你为这个视图编写的 JavaScript 不依赖于它之外的任何东西。甚至没有 jQuery?甚至没有任何框架,例如 knockout 或 bob.js 吗? 如果有,那么为什么不将你的视图与这些框架一起捆绑呢?

是的,答案就是——依赖关系。其中一些是实现,另一些则是依赖项。然而,在一个 Web 应用程序中使用部分视图时,实现和依赖项之间的边界变得模糊。原因是,部分视图是 Web 应用程序的一部分。这只是框架处理事物的一种方式,让您以可重用的方式分离部分视图。但是,部分视图仍然是整个 Web 应用程序的一部分,因此它的实现脚本也是如此。

如果您遵循了所有这些想法,那么您会同意在这种特殊情况下,无论您想要将代码与部分视图捆绑在一起,还是将其与 Web 应用程序的其他脚本捆绑在一起,都没有关系。 这只是同一件事

因此,决策必须由其他指标来决定,例如脚本加载性能等。这超出了问题的范围,但提供的描述应该足以作为答案。


0

0

0
我认为您应该使用RequireJS,因为:
在我的观点中,有三个相当重要的原因:
1. 您可以创建和重复使用模块而不会污染全局名称空间。您的全局名称空间越污染,函数/变量冲突的机会就越大。这意味着您定义了一个名为“foo”的函数,另一个开发人员定义了函数“foo”=其中一个函数被覆盖。
2. 您可以将代码结构化为单独的文件夹和文件,并在需要时异步加载requirejs,使一切正常工作。
3. 您可以构建用于生产。RequireJS附带了自己的构建工具,称为R.JS,它会将您的JavaScript模块串联和缩小成一个(或多个)包。这将提高您的页面速度,因为用户必须进行较少的脚本调用并加载较少的内容(因为您的JS已经被缩小)。
4. 您可以查看此简单的演示项目:http://bit.ly/requirejs(在cloud9ide中)。
5. 要将您的模块构建成单个应用程序,您只需安装requirejs npm软件包并运行命令:r.js -o build/build.properties.js。
在开发中,将所有模块放在单独的文件中只是一种良好的代码结构和管理方式。它还可以帮助您进行调试(例如,“Module.js第17行出错”而不是“scripts.js第5373行出错”)。
对于生产环境,您应该使用构建工具将JavaScript合并和压缩成一个文件。这将有助于页面更快地加载,因为您正在减少请求。每个加载请求都会减慢您的页面。页面越慢,Google给予您的分数就越少。页面越慢,用户就会越沮丧。页面越慢,销售额就会越少。
如果您想了解更多关于网页性能的信息,请查看http://developer.yahoo.com/performance/rules.html

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接