require.js使用AMD体系,采用异步方式加载模块,即模块的加载不影响,加载代码后面语句的运行,采用回调函数方式在模块加载完毕后执行回调函数,语法如下示意:
require([module], callback);
该语法说明如下:
module代表需要加载的模块,多个模块采用数组方式表示,依次加载,实际加载的代码如下示意:
require(['math','Eng'], function (math) {
math.add(2, 3);
Eng.say('hello');
});
采用require.js语法更适合浏览器的运行环境,因为模块代码来自远端服务器,受网络运行环境影响,代码的下载即加载速度都可能比较缓慢,因此需要AMD方式,异步的进行代码的加载与运行;
node.js的模块加载代码:var math = require('math');采用CommonJS的方式,适合在服务器端环境运行,在浏览器环境中可能导致模块加载的卡顿。因此在浏览器环境中采用var math = require('math')加载模块是错误的方式;
二、采用require.js加载模块
理论上,require.js加载的模块,必须是按照AMD规范、用define()函数定义的模块。但是实际上,虽然已经有一部分流行的函数库(比如jQuery)符合AMD规范,更多的库并不符合。那么,require.js是否能够加载非规范的模块呢?
回答是可以的。
这样的模块在用require()加载之前,要先用require.config()方法,定义它们的一些特征。
举例来说,underscore和backbone这两个库,都没有采用AMD规范编写。如果要加载它们的话,必须先定义它们的特征。
非AMD模块加载语法示例:
require.config({
shim: {
'underscore':{
exports: '_'
},
'backbone': {
deps: ['underscore', 'jquery'],
exports: 'Backbone'
}
}
});
实际开发环境中,require加载示例:
//=====================模块加载配置======================
requirejs.config({
baseUrl: '/Scripts',
paths: {
app: '/Scripts/app',
jquery: '/Scripts/jquery-1.10.2.min',
'jquery.ui': '/Scripts/jquery-ui.min',
'jquery.validate.min': '/Scripts/jquery.validate.min',
'jsGrid': '/Scripts/jsgrid.min'
},
shim: {
'jsGrid': {
deps: ['jquery']
},
'jquery.validate.min': {
deps: ['jquery']
}
}
});
//==========================加载主模块====================
requirejs(['app/main']);
模块定义示例:
//======================定义应用层面的模块=====================
define(["jquery", "jquery.ui", "jsGrid", 'jquery.validate.min'], function ($,ju,jsGrid,jv) {
var formSubmitHandler = $.noop;
var datas = { "name": "test", "password": "test" };
var editItem = { Name: '', Age: '', Address: '', Country: '', Married: '' };
var oprResult = false;
var showDetailsDialog = function (dialogType, client) {
$("#name").val(client.Name);
$("#age").val(client.Age);
$("#address").val(client.Address);
$("#country").val(client.Country);
$("#married").prop("checked", client.Married);
$("#detailsDialog").dialog("option", "classes.ui-dialog", "highlight");
buttons = [{
text: "Ok",
icon: 'ui-icon-mail-open',
type: "submit",
value:"submit",
click: function () {
//$(this).dialog("close");
oprResult = true;
//$("form").validate().form();
if ($("#detailsForm").valid())
{
values = { Name: $("#name").val(), Age: $("#age").val(), Address: $("#address").val(), Country: $("#country").val(), Married: $("#married").prop("checked") };
editItem = $.extend(editItem, values);
submitData(editItem);
}
}
}];
var dl = $("#detailsDialog").dialog("option", "buttons", buttons);
dl.dialog("open");
};
var submitData = function (e) {
var i = $.Deferred();
updateData = { Name: e.Name, Age: e.Age, Country: e.Country, Address: e.Address, Married: e.Married };
$.ajax({
url: '/Grid/UpdateData',
type: 'put',
dataType: 'json',
contentType: 'application/json; charset=utf-8',
data: JSON.stringify(updateData)
}
).done(function (e) {
alert('update data successed');
i.resolve(e);
$("#detailsDialog").dialog("close");
}).fail(function (e) {
alert('update failed!');
});
return i.promise();
};
var saveClient = function (client, isNew) {
$.extend(client, {
Name: $("#name").val(),
Age: parseInt($("#age").val(), 10),
Address: $("#address").val(),
Country: parseInt($("#country").val(), 10),
Married: $("#married").is(":checked")
});
$("#jsGrid").jsGrid(isNew ? "insertItem" : "updateItem", client);
$("#detailsDialog").dialog("close");
};
var loadData = function (e) {
var d = $.Deferred();
//=================服务端分页需要将页面索引传递到服务端=======================
pageSize = e.pageSize;
pageIndex = e.pageIndex;
$.ajax({
url: '/Grid/IndexData',
type: 'post',
dataType: 'json',
contentType: 'application/json; charset=utf-8',
data: JSON.stringify(datas)
}
).done(function (e) {
alert('load data successed');
//===========================服务端分页的话就没必要取子集了=========================
subdata = e.slice(pageSize * (pageIndex - 1), pageSize * pageIndex);
pagingdata = { data: subdata, itemsCount: e.length };
d.resolve(pagingdata);
}).fail(function (e) {
alert('load failed!');
});
return d.promise();
};
var insertData = function (e) {
var d = $.Deferred();
$.ajax({
url: '/Grid/UpdateData',
type: 'put',
dataType: 'json',
contentType: 'application/json; charset=utf-8',
data: JSON.stringify(e)
}
).done(function (data) {
alert('load data successed');
d.resolve(data);
}).fail(function (msg) {
alert('load failed:' + msg + "!");
});
return d.promise();
};
var deleteData = function (e) {
var d = $.Deferred();
$.ajax({
url: '/Grid/DeleteData',
type: 'delete',
dataType: 'json',
contentType: 'application/json; charset=utf-8',
data: JSON.stringify(e)
}
).done(function (data) {
alert('delete data successed');
d.resolve(data);
}).fail(function (msg) {
alert('delete failed:' + msg + "!");
});
return d.promise();
}
return {
showDetailsDialog,
saveClient,
loadData,
submitData,
insertData,
deleteData
}
});