版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ouyang111222/article/details/51131690
今天在整合Sea.js和jquery出现了Uncaught TypeError: object is not a function,一下就懵逼了!
可能的原因:
百度一下网上说大概可以归为两个主要原因:
1、引用的第三方类库的路径不对。
2、没有将第三方非CMD规范的类库定义成CMD的模块
解决过程:
我使用的是jquery-1.12.3.js,其代码中有如下的一段:
if ( typeof define === "function" && define.amd ) {
define( "jquery", [], function() {
return jQuery;
} );
}
根据 ID 和路径匹配原则,我将文件的目录设置如下(具体原因参考http://blog.csdn.net/iamduoluo/article/details/46457685):
其配置文件如下:
/**
* Set configuration
*/
seajs.config({
//shim plugins
plugins: ['shim'],
base: "./js/", /*"./"表示当前路径*/
alias: {
"jquery": "jquery/jquery-1.12.3.js"
},
preload: ["jquery"],
});
seajs.use("./js/index/main");
运行项目,就出现Uncaught TypeError: object is not a function,仔细一看加载的文件发现jquery文件可以加载的:
在控制台中输入:
seajs.resolve('jquery')
‘jquery’为配置中alias里面写的别名,敲回车之后你会发现控制台会输出jQuery的路径,访问该路径发现代码确实已经加载。
也就说上面说的第一种情况排除!
再仔细思考一下第二条,发现jquery遵循是AMD规范,不遵守CMD规范,而seajs是CMD规范的。好的,问题应该在这里,把jquery-1.12.3.js修改为符合CMD规范即可,jquery-1.12.3.js中有一段代码:
if ( typeof define === "function" && define.amd ) {
define( "jquery", [], function() {
return jQuery;
} );
}
修改为:
if ( typeof define === "function") {
define( "jquery", [], function() {
return jQuery;
} );
}
关于AMD规范参考:https://github.com/amdjs/amdjs-api/wiki/AMD
seajs模块定义规范参考:https://github.com/seajs/seajs/issues/242