<!DOCTYPE html><html><head></head><body><script data-main="test.js" src="lib/require.js"></script></body></html>主方法:
requirejs.config({baseUrl: "./"});requirejs(["js/a"],function (a){console.log("in test");a.testfromb();});a.js模块中,atest()方法提供b调用、testfromb()方法调用b的方法define(function(require){var b = require("js/b");console.log("in a");return {atest:function(){console.log("test in a");},testfromb:function(){console.log("testfromb in a");b.btest();}}});b模块中,调用了a的方法。define(function(require){var a = require("js/a");console.log("in b");return {btest:function(){console.log("test in b");a.atest();}}});这样相当于a调用了b的方法,但是b的方法依赖于a的方法,这就造成了循环依赖。浏览器会提示错误:Uncaught Error: Module name "js/a" has not been loaded yet for context: _按照官方文档的说法,这种属于设计的问题,应该尽量避免。那么如果避免不了该怎么办呢?可以这样修改b模块:
define(function(require){// var a = require("js/a");console.log("in b");return {btest:function(){console.log("test in b");require("js/a").atest();}}});这里是等到执行atest()方法时,才加载a模块。这时,a模块很显然已经加载完了 。可以看到输出的信息:in ba.js:3 in atest.js:6 in testa.js:9 testfromb in ab.js:6 test in ba.js:6 test in a

同样的方式,修改a可能就不好使了。这时因为模块加载的顺序是从b开始的。
关于循环依赖的源码可以参考云盘
如何在requirejs中使用jquery
如果想要使用jquery比较简单,直接在main.js中添加对应的依赖即可:
requirejs.config({baseUrl: "./",paths:{"jquery":"lib/jquery"}});requirejs(["jquery"],function ($){$("#test").html("test");});如何在requirejs中使用jquery插件requirejs.config({baseUrl: "./",paths:{"jquery":"lib/jquery","jquery-ui":"lib/jquery-ui","jquery-dataTables":"lib/jquery.dataTables"},shim:{"jquery-ui":["jquery"],"jquery-dataTables":["jquery"]}});requirejs(["jquery","jquery-ui","jquery-dataTables"],function ($){....});由于jquery插件都需要依赖于jquery,因此可以在shim中指定依赖关系。define(function(require){var $ = require("jquery");require("jquery-ui");require("jquery-dataTables");//下面都是测试,可以忽略var _test = $("#test");_test.selectmenu({width : 180,change : function(event, ui) {console.log("change");}});return {test:function(){//测试jquery-ui_test.append($("<option>test1</option><option>test1</option>"));_test.selectmenu("refresh");//测试jquery-datatablesvar _table = $("table");_table.dataTable();}}});不过,执行上面的代码,会报一个异常:Uncaught TypeError: _table.dataTable is not a function这是因为,dataTables并不是一个require风格的模块,因此直接这样引入,并不会执行它内部的匿名函数。可以修改它的匿名函数,传入$对象,在最后一行:
*/return $.fn.dataTable;//}));原来是这样}($)));//这里增加执行这个匿名函数,并且传入$对象。}(window, document));这也是在网上搜的方法,原理奈何经验不足....