如何使RequireJS可靠?

时间:2012-08-09 07:21:09

标签: jquery asp.net-mvc requirejs

RequireJS大约一半的时间对我有用。如果我刷新页面,它会随机出现加载问题。

我正在调整一个小型MVC项目来使用它,并做这样的事情:How does RequireJS work with multiple pages and partial views?

我有一个常见的main.js,可以从我的主_layout.cshtml进行加载。以及使用上述技术的小部件和其他地方的其他部分视图。以下示例来自我的SignIn页面:

<script type="text/javascript">
    require(["jquery", "kendo", "domReady!"], function ($, kendo) {        

        $("#signInForm").kendoWindow({
            draggable: false,
            width: "500px",
            modal: true,
            title: "Sign In",
            resizable: false
         });        
    }); 
</script>

有时Chrome会加载&amp;在main.js之前处理内联脚本(其中定义了路径映射和其他配置)。要求“domReady”没有任何区别。

如何强制此脚本等到require.js&amp; main.js已经运行了吗?

不太理想的后备是将j​​Query返回到它的全局范围并使用某种自定义事件。你有更好的主意吗?或者是否有一种内置于RequireJS的方法?

更新:这是我现在在_layout.cshtml中使用的工作

<script src="@Url.Content("~/Scripts/jquery-1.7.2.min.js")" type="text/javascript"></script>
<script type="text/javascript">
    function requireIt(requirements, callback) {
        if ($(document).data("requireReady") === true) {
            require(requirements, callback);
        } else {
            $(document).bind("requireReady", null, function () {
                $(document).data("requireReady", true); 
                require(requirements, callback);
            });
        }
    }
</script> 
<script data-main="/scripts/main" src="@Url.Content("~/Scripts/require.js")" type="text/javascript"></script>

jQuery返回成为全局夹具,我的部分视图使用其内联脚本使用此requireIt包装器。并且main.js触发requireReady。

2 个答案:

答案 0 :(得分:1)

在require.js网站上找到了这个:

  

理想情况下,您加载的脚本将是通过调用define()定义的模块。但是,您可能需要使用一些传统/遗留的“浏览器全局”脚本,这些脚本不通过define()表达它们的依赖关系。对于那些,您可以使用shim配置。要正确表达他们的依赖关系。

Link到shim配置文档

如果不表达依赖关系,则可能会出现加载错误,因为RequireJS异步加载脚本并且速度不正常。

您可以在require.js documentation了解更多信息,点1:加载javascript文件。

我今晚会试验它,因为我现在没有时间。但我可以想象它会解​​决我的问题,所以可能也是你的问题。

答案 1 :(得分:1)

继乔纳斯的回答,并且乱了好几天后,我发现从_Layout.cshtml执行此操作的唯一方法如下(脚本标记位于标题中)。我还在各种教程中看到了主体中的脚本标签,这似乎不起作用。

<script type="text/javascript" src="~/js/lib/require.js"></script>
        <script type="text/javascript">
            require.config({
                baseUrl: 'js/lib',
                paths: {
                    jquery: 'jquery-1.8.2',
                    kendo: 'kendo.all-2012.2.913.min',
                    underscore: 'underscore.min',
                    backbone: 'backbone.min',
                    app: '../app'
                },
                shim: {
                    underscore: {
                        exports:'_'
                    },
                    Backbone: {
                        deps: ['jquery', 'underscore'],
                        exports: "Backbone"
                    }
                }
            });            
        </script>

我无法理解为什么对main.js的引用不起作用(所以我从_Layout.cshtml中删除了它)

<script data-main="js/main.js" src="~/js/lib/require.js" type="text/javascript"></script>

我还根据dox简化了js文件夹的布局:

website
.....js
.....js/lib
.....js/lib/jquery-1.8.2.js
.....js/lib/underscore.js
.....etc
.....js/app
.....js/app/myscript.js
.....etc

希望这有帮助

杰里米