在使用sea.js的如下寫法引用jQuery文件時,
//main.js
define(function(require,exports,module){ var $ = require('jquery-3.1.0.min'); $('#name').html('helloworld'); })
會報錯,提示$ is not a function;
原因在於jQuery是默認支持AMD規范的,而sea.js是遵循CMD規范進行加載;這兩種規范對外提供模塊時的定義方法不一樣:
// CMD define(function(require, exports, module) { var a = require('./a') a.doSomething() // 此處略去 100 行 var b = require('./b') // 依賴可以就近書寫 b.doSomething() // ... }) // AMD 默認推薦的是 define(['./a', './b'], function(a, b) { // 依賴必須一開始就寫好 a.doSomething() // 此處略去 100 行 b.doSomething() // ... })
jQuery對外提供模塊時默認支持的是AMD規范,其寫法為:
if ( typeof define === "function" && define.amd ) { define( "jquery", [], function() { return jQuery; } ); }
因此,如果想讓jQuery支持CMD規范,則將以上代碼修改為如下代碼即可:
if ( typeof define === "function") { define(function(require,exports,module){ return jQuery; }); }
其區別就在於define方法支持規范的判斷,以及參數類型的不同。