未捕获错误:在require.js加载非AMD脚本时没有定义调用

Not*_*ing 2 javascript jquery requirejs backbone.js

我有一个非AMD的JavaScript包含我的自定义函数,例如:

function getItemIndexById(items, id){
   for(var i = 0; i < items.length; i++){
       if(items[i].ID == id) return i;
   }
   return false;
}
//more than one define custom function here.
Run Code Online (Sandbox Code Playgroud)

这里是main.js文件:

requirejs.config({
 enforceDefine: true,
 paths: {
    "jquery": "libs/jquery/jquery-min",
    "underscore": "libs/underscore/underscore-min",
    "backbone": "libs/backbone/backbone-min",
    "custom" : "libs/scripts/customejs"
},
shim: {
    "underscore": {
        deps: [],
        exports: "_"
    },
    "backbone": {
        deps: ["jquery", "underscore"],
        exports: "Backbone"
    }
}
});
Run Code Online (Sandbox Code Playgroud)

然后我在我的视图中定义:

define(["jquery" ,
        "underscore" ,
        "backbone" ,
        "custom"
],function($ , _ , Backbone, Custom){
  //.....
}
Run Code Online (Sandbox Code Playgroud)

我收到了一个错误Uncaught Error: No define call for custom.

我是否必须将自定义js转换为AMD?请问有人能解释一下这个问题.谢谢.

pro*_*mac 7

Require文档中描述了此问题的一些常见原因.

在这种情况下,很可能是因为您正在使用enforceDefine: true并且"自定义"js文件不会调用define().

您需要enforceDefine: false为自定义代码设置或添加适当的垫片.

填充程序的目的是允许要求加载非AMD代码.它的工作原理是加载代码并验证脚本是否在属性定义的全局空间中创建了exports属性.

在你的情况,你可以使用getItemIndexByIdexports值:

shim: {
   "custom": {
      exports: "getItemIndexById"
   }
Run Code Online (Sandbox Code Playgroud)

当您使用它Custom作为exports值时它不起作用,因为您的脚本没有创建一个名为的变量Custom

了解更多关于shim 这里