require.js 入门讲解(二)

本文介绍Require.js的基本使用方法,包括AMD模块加载方式、非AMD模块的兼容处理及实际开发中的配置与应用实例。

require.js使用AMD体系,采用异步方式加载模块,即模块的加载不影响,加载代码后面语句的运行,采用回调函数方式在模块加载完毕后执行回调函数,语法如下示意:

require([module], callback);

该语法说明如下:

module代表需要加载的模块,多个模块采用数组方式表示,依次加载,实际加载的代码如下示意:


 
  1. require(['math','Eng'], function (math) {

  2.  
  3.     math.add(2, 3);

  4. Eng.say('hello');

  5.  
  6.   });

采用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模块加载语法示例:


 
  1. require.config({

  2.  
  3.     shim: {

  4.  
  5.       'underscore':{

  6.         exports: '_'

  7.       },

  8.  
  9.       'backbone': {

  10.         deps: ['underscore', 'jquery'],

  11.         exports: 'Backbone'

  12.       }

  13.  
  14.     }

  15.  
  16.   });

实际开发环境中,require加载示例:


 
  1. //=====================模块加载配置======================

  2. requirejs.config({

  3. baseUrl: '/Scripts',

  4. paths: {

  5. app: '/Scripts/app',

  6. jquery: '/Scripts/jquery-1.10.2.min',

  7. 'jquery.ui': '/Scripts/jquery-ui.min',

  8. 'jquery.validate.min': '/Scripts/jquery.validate.min',

  9. 'jsGrid': '/Scripts/jsgrid.min'

  10. },

  11. shim: {

  12. 'jsGrid': {

  13. deps: ['jquery']

  14. },

  15. 'jquery.validate.min': {

  16. deps: ['jquery']

  17. }

  18. }

  19. });

  20.  
  21. //==========================加载主模块====================

  22. requirejs(['app/main']);

模块定义示例:


 
  1. //======================定义应用层面的模块=====================

  2. define(["jquery", "jquery.ui", "jsGrid", 'jquery.validate.min'], function ($,ju,jsGrid,jv) {

  3. var formSubmitHandler = $.noop;

  4. var datas = { "name": "test", "password": "test" };

  5. var editItem = { Name: '', Age: '', Address: '', Country: '', Married: '' };

  6. var oprResult = false;

  7. var showDetailsDialog = function (dialogType, client) {

  8.  
  9. $("#name").val(client.Name);

  10. $("#age").val(client.Age);

  11. $("#address").val(client.Address);

  12. $("#country").val(client.Country);

  13. $("#married").prop("checked", client.Married);

  14.  
  15.  
  16.  
  17. $("#detailsDialog").dialog("option", "classes.ui-dialog", "highlight");

  18. buttons = [{

  19. text: "Ok",

  20. icon: 'ui-icon-mail-open',

  21. type: "submit",

  22. value:"submit",

  23. click: function () {

  24. //$(this).dialog("close");

  25. oprResult = true;

  26. //$("form").validate().form();

  27. if ($("#detailsForm").valid())

  28. {

  29. values = { Name: $("#name").val(), Age: $("#age").val(), Address: $("#address").val(), Country: $("#country").val(), Married: $("#married").prop("checked") };

  30. editItem = $.extend(editItem, values);

  31. submitData(editItem);

  32.  
  33. }

  34.  
  35.  
  36. }

  37. }];

  38. var dl = $("#detailsDialog").dialog("option", "buttons", buttons);

  39.  
  40. dl.dialog("open");

  41. };

  42.  
  43.  
  44.  
  45. var submitData = function (e) {

  46. var i = $.Deferred();

  47.  
  48. updateData = { Name: e.Name, Age: e.Age, Country: e.Country, Address: e.Address, Married: e.Married };

  49. $.ajax({

  50. url: '/Grid/UpdateData',

  51. type: 'put',

  52. dataType: 'json',

  53. contentType: 'application/json; charset=utf-8',

  54. data: JSON.stringify(updateData)

  55. }

  56. ).done(function (e) {

  57. alert('update data successed');

  58. i.resolve(e);

  59. $("#detailsDialog").dialog("close");

  60.  
  61. }).fail(function (e) {

  62. alert('update failed!');

  63. });

  64. return i.promise();

  65. };

  66.  
  67. var saveClient = function (client, isNew) {

  68. $.extend(client, {

  69. Name: $("#name").val(),

  70. Age: parseInt($("#age").val(), 10),

  71. Address: $("#address").val(),

  72. Country: parseInt($("#country").val(), 10),

  73. Married: $("#married").is(":checked")

  74. });

  75.  
  76. $("#jsGrid").jsGrid(isNew ? "insertItem" : "updateItem", client);

  77.  
  78. $("#detailsDialog").dialog("close");

  79. };

  80.  
  81. var loadData = function (e) {

  82. var d = $.Deferred();

  83. //=================服务端分页需要将页面索引传递到服务端=======================

  84. pageSize = e.pageSize;

  85. pageIndex = e.pageIndex;

  86. $.ajax({

  87. url: '/Grid/IndexData',

  88. type: 'post',

  89. dataType: 'json',

  90. contentType: 'application/json; charset=utf-8',

  91. data: JSON.stringify(datas)

  92. }

  93. ).done(function (e) {

  94. alert('load data successed');

  95. //===========================服务端分页的话就没必要取子集了=========================

  96. subdata = e.slice(pageSize * (pageIndex - 1), pageSize * pageIndex);

  97. pagingdata = { data: subdata, itemsCount: e.length };

  98. d.resolve(pagingdata);

  99. }).fail(function (e) {

  100. alert('load failed!');

  101. });

  102. return d.promise();

  103. };

  104.  
  105. var insertData = function (e) {

  106. var d = $.Deferred();

  107. $.ajax({

  108. url: '/Grid/UpdateData',

  109. type: 'put',

  110. dataType: 'json',

  111. contentType: 'application/json; charset=utf-8',

  112. data: JSON.stringify(e)

  113. }

  114. ).done(function (data) {

  115. alert('load data successed');

  116. d.resolve(data);

  117. }).fail(function (msg) {

  118. alert('load failed:' + msg + "!");

  119. });

  120. return d.promise();

  121. };

  122.  
  123. var deleteData = function (e) {

  124. var d = $.Deferred();

  125. $.ajax({

  126. url: '/Grid/DeleteData',

  127. type: 'delete',

  128. dataType: 'json',

  129. contentType: 'application/json; charset=utf-8',

  130. data: JSON.stringify(e)

  131. }

  132. ).done(function (data) {

  133. alert('delete data successed');

  134. d.resolve(data);

  135. }).fail(function (msg) {

  136. alert('delete failed:' + msg + "!");

  137. });

  138. return d.promise();

  139. }

  140.  
  141. return {

  142. showDetailsDialog,

  143. saveClient,

  144. loadData,

  145. submitData,

  146. insertData,

  147. deleteData

  148. }

  149.  
  150. });

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值