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

Uncaught Error: No define call for when loading non AMD script by require.js

本文关键字:脚本 AMD 调用 定义 加载 错误 js require      更新时间:2023-09-26

我有一个非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.

这里主.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"
    }
}
});

然后我在我的观点中定义:

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

我在Uncaught Error: No define call for custom中遇到错误.

我必须将我的自定义 js 转换为 AMD 吗?谁能解释一下这个问题。谢谢。

此问题的常见原因在"需要"文档中进行了说明。

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

您需要为自定义代码设置enforceDefine: false或添加适当的填充程序。

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

在您的情况下,您可以使用 getItemIndexById 作为exports值:

shim: {
   "custom": {
      exports: "getItemIndexById"
   }

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

在此处阅读有关shim的更多信息