RequireJS如何处理多个页面和部分视图?

我正在调查RequireJS,但我不确定一些事情。

我了解如何使用main.js加载所有的依赖关系。 但是,我是否需要添加任何逻辑来处理main.js依赖关系?

对我来说, main.js看起来像一个document.ready状态,你在文档加载时input逻辑,对吗?

而对于其他页面和部分视图,我是否需要创build多个main.js或者我可以从<script>的视图的依赖关系中引用加载的函数?

更新 – 我已经添加了一个使用RequireJS和模块化HTML组件的例子。 包含构build工具示例 – https://github.com/simonsmith/modular-html-requirejs

我也写了一篇关于这个的博客文章 – http://simonsmith.io/modular-html-components-with-requirejs/


只使用main.js的方法可能更适合于单页面应用程序 。

我处理这种情况的方式是在main.js文件中只包含常见的站点范围的JS:

在每一页上:

 <script src="require.js" data-main="main"></script> 

main.js

 require.config({ // config options }); require(['jquery', 'common/ajaxLoader', 'common/someOtherModule'], function($, ajax, otherModule) { // Modules that do stuff on every page are instantiated here }); 

page1.html

 <script> require(['scripts/page1']); </script> 

page1.js

 require(['jquery', 'page1Module'], function($, module){ // page1 specific stuff here }); 

上面的例子只是处理它的几个方法之一。 注意加载一个普通的JavaScript文件和一个模块的区别 。

我遵循的经验法则是保留所有可重用的模块(或类,如果它使得它更容易概念化)内define与他们自己的依赖等,然后使用require抓住这些模块,使用他们的方法或以某种方式与他们交互。

使用这种模式几乎肯定需要使用作为RequireJS的单独插件的domReady模块。 例如, 在jQuery中使用它而不是就绪函数 ,因为它允许模块在DOM准备就绪之前开始下载,从而减less了执行代码的等待时间。

编辑您可能希望在RequireJS库中看到另一个多页面应用程序的例子

我最近在ASP.NET MVC应用程序中完成了使用自动构build优化来设置RequrieJS的练习。 有很多有用的博客文章,如西蒙的,是一个很好的参考。 从ASP.NET的angular度来看,在为多页ASP.NET应用程序configurationRequireJS优化器方面,我发现最有用的方法之一就是让RequireJS和ASP.NET MVC一起玩 。

使用已经在那里的伟大的信息,我已经在GitHub上build立了自己的ASP.NET MVC RequireJS示例 。 大部分包含的内容与已经存在的示例类似,但是为了解决部分视图的问题,以及多页面需求依赖关系,我采取了稍微不同的方法。

_Layout.cshtml

与现有示例最显着的区别是创build了一个自定义RequireViewPage ,它公开了将configuration数据传递给RequrieJS的方法以及引用页面特定的需求依赖关系。

所以你的_Layout.cshtml看起来很像你期望的:

 <head> ... @RenderModuleConfig() <script type="text/javascript" src="@Url.Script("vendor/require.js")" data-main="main"></script> </head> <body> ... 

视图和部分

为了连接视图(在我的案例中敲击视图模型), 一个额外的脚本片段已经被添加到_Layout.cshtml的底部,如下所示

  ... @RenderSection("scripts", required: false) <script type="text/javascript">require(['main'], function () { require(['lib/knockout/knockout.require']); });</script> </body> 

这将确保对于任何视图依赖性,主模块已经被加载(假定main的依赖关系在main.js被定义,然后允许通过数据属性连接视图特定的依赖关系。

 <div data-require="@MainModule"> ... </div> <div data-require="@Module("address")"> ... </div> <div data-require="view\home\index\model"> ... </div> 

有关devise和select的完整说明,请参阅GitHub上的自述文件