我应该使用RequireJS还是ASP.NET绑定,或者两者兼而有之



我有点困惑我应该使用什么,或者两者是否可以/应该组合在一起。我使用的一些库(如jQuery)是AMD模块,而其他库(如bootstrap)则不是,因此我必须使用shim-config来声明对jQuery的依赖关系。

现在,在开始学习RequireJS之前,我正在捆绑jQuery、bootstrap和其他一些非常常用的库,并将它们加载到布局中。这为我提供了一个必须下载的文件。

由于我现在使用RequireJS,所有这些脚本都是根据每个页面的需要单独提取的。我喜欢模块化代码,但即使是RequireJS异步加载,也必须单独加载所有这些代码,这难道不会对性能产生影响吗?

我应该以某种方式使用这两种技术的组合吗?如果是,我该如何做到这一点?

编辑:我发现这篇文章是一个例子(http://therealmofcode.com/posts/2014/03/aspnet-mvc-bundling-minification-requirejs.html),但是ScriptBundle中的所有脚本都是模块,这允许RequireJS查找该bundle中所有的模块。然而,我希望能够捆绑其他不是AMD模块的脚本。

要回答问题的第一部分

理想情况下两者都有。

单独加载脚本(异步或其他方式)会对性能产生影响(更多的HTTP连接),但下载更大的捆绑文件也是如此。

一般来说,向捆绑包中添加更多的KB比发出额外的HTTP请求要好。向站点范围的捆绑包添加更多的KB比为仅在少数页面上使用的脚本发出新的HTTP请求更糟糕。

因此,根据脚本的数量、大小以及在整个网站中的分布情况,每个网站的确切公式会有所不同。

考虑到这一点,我倾向于创建几个捆绑包,其中一个包含任何站点范围的脚本,还有几个实际上是整个站点各个页面使用的脚本的组合。

bundles.Add(new ScriptBundle("~/bundles/mainjs").Include(
      "~/Scripts/jquery-{version}.js",
      "~/Scripts/bootstrap.js",
      "~/Scripts/respond.js",
      "~/Scripts/site.js"));
        
bundles.Add(new ScriptBundle("~/bundles/forms").Include(
       "~/Scripts/jquery.validate*",
       "~/Scripts/dropzone.js",
       "~/Scripts/bootstrap-datetimepicker.min.js",
       "~/Scripts/trumbowyg.min.js",
       "~/Scripts/select2.min.js",
       "~/Scripts/autosize.min.js",
       "~/Scripts/forms.js"));

然后用RequireJS加载这些捆绑文件。

这种方法的问题是…

它打破了RequireJS的模块化

正如您所指出的,除非每个脚本都是AMD,否则您不能使用RequireJS的绑定功能。

因此,您必须将每个捆绑包视为一个模块(而不是模块的集合),并使用填充程序使它们相互依赖(对RequireJS不太熟悉,因此没有代码示例)。

这种方法失去了RequireJS的许多最佳功能。。。因此,尽管它通常会表现得更好,但它仍然不是理想的解决方案。

不幸的是,我们将陷入这种困境,直到所有有用的库都是AMD/UMD模块(Bootstrap 4支持AMD/UMD)。

相关内容

最新更新