我正在研究 RequireJS ,但我不确定某些事情。
我理解如何使用main.js
加载所有依赖项。
但是,我是否需要在main.js
?
对我来说,main.js
似乎是一个document.ready状态,你在文档加载时输入逻辑,对吗?
对于其他页面和部分视图,我是否需要创建多个main.js
或者我是否可以仅从<script>
中的视图引用依赖项中的加载函数?
答案 0 :(得分:93)
更新 - 我添加了一个使用RequireJS和模块化HTML组件的示例。包含构建工具示例 - https://github.com/simonsmith/modular-html-requirejs
我还写了一篇博客文章 - http://simonsmith.io/modular-html-components-with-requirejs/
仅对main.js
使用main.js
的方法是probably more suited to a single page application。
我处理这种情况的方法是只在<script src="require.js" data-main="main"></script>
文件中包含常见的站点范围的JS:
在每个页面上:
require.config({
// config options
});
require(['jquery', 'common/ajaxLoader', 'common/someOtherModule'], function($, ajax, otherModule) {
// Modules that do stuff on every page are instantiated here
});
<强> main.js 强>
<script>
require(['scripts/page1']);
</script>
<强> page1.html 强>
require(['jquery', 'page1Module'], function($, module){
// page1 specific stuff here
});
<强> page1.js 强>
define
以上示例只是处理它的几种方法之一。注意the difference between loading a plain JavaScript file and a module。
我遵循的经验法则是在require
内部保留所有可重用的模块(或类,如果它更容易概念化),并使用{{1}}来获取这些模块,使用他们的方法或以某种方式与他们互动。
使用此模式几乎肯定需要使用domReady模块that is a separate plugin for RequireJS。例如,使用此instead of a ready function in jQuery,因为它允许模块在DOM准备就绪之前开始下载,这减少了代码执行的等待时间。
修改您可能希望在RequireJS回购中see another example of multi-page application
答案 1 :(得分:3)
我最近在ASP.NET MVC应用程序中完成了使用自动构建优化设置RequrieJS的练习。有许多有用的博客文章,如西蒙的,这是一个很好的参考。从ASP.NET的角度来看,我在为多页ASP.NET应用程序配置RequireJS优化器方面发现的最有用的是Making RequireJS play nice with ASP.NET MVC。
使用已经存在的重要信息,我已经建立了自己的ASP.NET MVC RequireJS example on GitHub。所包含的大部分内容与已经存在的示例类似,但是为了解决部分视图的问题,以及多页需要依赖性,我采取了稍微不同的方法。
<强> _Layout.cshtml 强>
与现有示例最显着的区别是创建了一个自定义RequireViewPage,它公开了将配置数据传递给RequrieJS的方法以及特定于引用页面的需要依赖项。
所以你的_Layout.cshtml看起来很像你期望的那样:
<head>
...
@RenderModuleConfig()
<script type="text/javascript" src="@Url.Script("vendor/require.js")" data-main="main"></script>
</head>
<body>
...
观点&amp;泛音强>
要连接视图(在我的情况下是淘汰视图模型),an additional script fragment已添加到_Layout.cshtml的底部,如下所示
...
@RenderSection("scripts", required: false)
<script type="text/javascript">require(['main'], function () { require(['lib/knockout/knockout.require']); });</script>
</body>
这将确保对于任何视图依赖项,已加载主模块(假设已在main.js
中定义main的依赖项,然后允许通过数据属性连接视图特定的依赖项。
<div data-require="@MainModule"> ... </div>
<div data-require="@Module("address")"> ... </div>
<div data-require="view\home\index\model"> ... </div>
有关设计和选择的完整说明,请参阅README on GitHub