2019独角兽企业重金招聘Python工程师标准>>>

Require.JS解决的问题:

RequireJS的基本思想:通过define方法,将代码定义为模块;通过require方法,实现代码的模块加载。

一 采用AMD规范编写模块

1.采用define()函数来定义模块

@1.模块不依赖其他模块,直接定义在define()函数之中

简写:生成一个拥有method1method2两个方法的模块

define({

method1: function(){},

method2:function(){},

})

另一种等价的写法是,把对象写成一个函数,该函数的返回值就是输出的模块

define(function(){

return{

method1:function(){},

method2:function(){},

};

})

后一种写法的自由度更高一点,可以在函数体内写一些模块初始化代码

字面量写法:

define(function (){

    var add = function (x,y){

      return x+y;

    };

    return {

add: add  前面的add对应外部调用名 后面的add对应模块里的实现函数名
    };

  });

@2.非独立模块:模块还依赖其他模块

如果这个模块还依赖其他模块,那么define()函数的第一个参数,必须是一个数组,指明该模块的依赖性。

define(['module1','module2'],function(m1,m2)){

.......doSomething

}

define方法的第一个参数是一个数组,它的成员是当前模块所依赖的模块。比如,['module1', 'module2']表示我们定义的这个新模块依赖于module1模块和module2模块,只有先加载这两个模块,新模块才能正常运行。一般情况下,module1模块和module2模块指的是,当前目录下的module1.js文件和module2.js文件,等同于写成['./module1', './module2']。

define方法的第二个参数是一个函数,当前面数组的所有成员加载成功后,它将被调用。它的参数与数组的成员一一对应,比如function(m1, m2)就表示,这个函数的第一个参数m1对应module1模块,第二个参数m2对应module2模块。

这个函数必须返回一个对象,供其他模块调用。

define(['module1', 'module2'], function(m1, m2) {

 

    return {

        method: function() {

                               m1.methodA();

                               m2.methodB();

        }

    }; 

});

上面代码表示新模块返回一个对象,该对象的method方法就是外部调用的接口,menthod方法内部调用了m1模块的methodA方法和m2模块的methodB方法。

需要注意的是,回调函数必须返回一个对象,这个对象就是你定义的模块。

define(['myLib'], function(myLib){

    function foo(){

      myLib.doSomething();

    }

    return {

      foo : foo

    };

  });

当require()函数加载上面这个模块的时候,就会先加载myLib.js文件

‍‍二 模块调用‍‍

1. 加载require.js将require.js嵌入网页

<script src="js/require.js"  defer async="true" ></script>

async属性表明这个文件需要异步加载,避免网页失去响应。IE不支持这个属性,只支持defer,所以把defer也写上

2. 加载主模块:整个网页的入口代码

加载require.js以后,下一步就要加载我们自己的代码了。假定我们自己的代码文件是main.js,也放在js目录下面。

<script data-main="scripts/main"  src=" js /require.js"></script>

data-main属性不可省略,用于指定网页程序的主模块,在上例中为js子目录下的main.js文件,这个文件会第一个被require.js加载。由于require.js默认的文件后缀名是js,所以可以把main.js简写成main。

3. 编写主模块

常见的情况是,主模块依赖于其他模块,这时就要使用AMD规范定义的的require()函数。

require(['moduleA', 'moduleB', 'moduleC'], function (moduleA, moduleB, moduleC){

    // some code here

  });

require()函数接受两个参数。

第一个参数是一个数组,表示所依赖的模块,上例就是['moduleA', 'moduleB', 'moduleC'],即主模块依赖这三个模块;

第二个参数是一个回调函数,当前面指定的模块都加载成功后,它将被调用。加载的模块会以参数形式传入该函数,从而在回调函数内部就可以使用这些模块。

require()异步加载moduleA,moduleB和moduleC,浏览器不会失去响应;它指定的回调函数,只有前面的模块都加载成功后,才会运行,解决了依赖性的问题。

默认情况下,require.js假定这三个模块与main.js在同一个目录,文件名分别为jquery.js,underscore.js和backbone.js,然后自动加载。

require(['foo', 'bar'], function ( foo, bar ) {

        foo.doSomething();

});

上面方法表示加载foo和bar两个模块,当这两个模块都加载成功后,执行一个回调函数。该回调函数就用来完成具体的任务。

require方法的第一个参数,是一个表示依赖关系的数组。这个数组可以写得很灵活,请看下面的例子。

require( [ window.JSON ? undefined : 'util/json2' ], function ( JSON ) {

  JSON = JSON || window.JSON;

 

  console.log( JSON.parse( '{ "JSON" : "HERE" }' ) );

});

上面代码加载JSON模块时,首先判断浏览器是否原生支持JSON对象。如果是的,则将undefined传入回调函数,否则加载util目录下的json2模块。

如何动态加载模块

define(function ( require ) {

var isReady = false, foobar;

require(['foo', 'bar'], function (foo, bar) {

isReady = true;

foobar = foo() + bar();

});

4.模块加载 require.config()方法

require.config()方法,我们可以对模块的加载行为进行自定义。

require.config()就写在主模块(main.js)的头部。参数就是一个对象,这个对象的paths属性指定各个模块的加载路径。

@1.路径默认与main.js在同一个目录

require.config({

    paths: {

      "jquery": "jquery.min",
      "underscore": "underscore.min",
      "backbone": "backbone.min"

    }

  });

@2.逐一指定路径 (js/lib)

require.config({

    paths: {

      "jquery": "lib/jquery.min",
      "underscore": "lib/underscore.min",
      "backbone": "lib/backbone.min"

    }

  });

@3.设置基路径 baseUrl

require.config({

    baseUrl: "js/lib",

    paths: {

      "jquery": "jquery.min",
      "underscore": "underscore.min",
      "backbone": "backbone.min"

    }

  });

require.js要求,每个模块是一个单独的js文件。这样的话,如果加载多个模块,就会发出多次HTTP请求,会影响网页的加载速度。因此,require.js提供了一个优化工具,当模块部署完毕以后,可以用这个工具将多个模块合并在一个文件中,减少HTTP请求数。

return {

isReady: isReady,

foobar: foobar

};

});

上面代码所定义的模块,内部加载了foo和bar两个模块,在没有加载完成前,isReady属性值为false,加载完成后就变成了true。因此,可以根据isReady属性的值,决定下一步的动作。

2.domready插件,可以让回调函数在页面DOM结构加载完成后再运行。

  require(['domready!'], function (doc){

    // called once the DOM is ready

  });


转载于:https://my.oschina.net/u/2299514/blog/363946

require.jsAMD模块化编程相关推荐

  1. Javascript模块化编程require.js的用法

    JS模块化工具requirejs教程(一):初识requirejs http://www.runoob.com/w3cnote/requirejs-tutorial-1.html JS模块化工具req ...

  2. (转)Javascript模块化编程(一):模块的写法

    转自 ruanyifeng 系列目录: Javascript模块化编程(一):模块的写法 Javascript模块化编程(二):AMD规范 Javascript模块化编程(三):Require.js的 ...

  3. Javascript模块化编程:AMD规范

    一.模块的规范 先想一想,为什么模块很重要? 因为有了模块,我们就可以更方便地使用别人的代码,想要什么功能,就加载什么模块. 但是,这样做有一个前提,那就是大家必须以同样的方式编写模块,否则你有你的写 ...

  4. 模块化编程AMDCommonJS

    为什么要模块化编程 如果JS也可以像类似python,Java使用import,引入我们想要的模块,想要什么模块,就加载什么模块,可以给前端编程带来更多的便捷,结构更加清晰明了.但是,这样做有一个前提 ...

  5. Web前端进阶之JavaScript模块化编程知识

    JavaScript是前端三要素之一,也是很多初学Web前端的人遭遇的第一条拦路虎.很多同学表示JavaScript涵盖的知识点太多太复杂.应用也是五花八门完全摸不着头脑.但只要我们一点一点由基础到进 ...

  6. JavaScript模块化编程知识分享!

    JavaScript是前端三要素之一,也是很多初学Web前端的人遭遇的第一条拦路虎.很多同学表示JavaScript涵盖的知识点太多太复杂.应用也是五花八门完全摸不着头脑.但只要我们一点一点由基础到进 ...

  7. 学习阮一峰Javascript模块化编程,requireJS使用

    使用背景NOW: 网站功能逐渐丰富,网页中的js也变得越来越复杂和臃肿,原有通过script标签来导入一个个的js文件这种方式已经不能满足现在互联网开发模式. 项目需要一个团队分工协作.进度管理.单元 ...

  8. js模块化编程之彻底弄懂CommonJS和AMD/CMD!

    为什么80%的码农都做不了架构师?>>>    先回答我:为什么模块很重要? 答:因为有了模块,我们就可以更方便地使用别人的代码,想要什么功能,就加载什么模块. 但是,这样做有一个前 ...

  9. js模块化编程之彻底弄懂CommonJS和AMD/CMD

    转载地址:http://www.cnblogs.com/chenguangliang/p/5856701.html 先回答我:为什么模块很重要? 答:因为有了模块,我们就可以更方便地使用别人的代码,想 ...

最新文章

  1. java查看对象锁级别_对象级别锁 vs 类级别锁(Java)
  2. 剑指offer:面试题41. 数据流中的中位数
  3. 字符串处理(POJ1782)
  4. 挺起你作为一个中国人的脊梁骨
  5. 各种排序算法比较--2015年7月23日22:33:43v1.0版
  6. 我参与的一个x86平台项目的经历
  7. C++作用域、局部变量、全局变量、传引用传值对比的一个例子
  8. SAP License:统驭科目的集成修改
  9. Axure 9.0.0.3704 授权码
  10. 【如何让代码变“高级”(二)】-这样操作值得一波666(Java Stream)(这么有趣)
  11. 10098 - Generating Fast
  12. Visual Studio(VS) 2019版本下载官方地址
  13. 免费下载《WindowsPE权威指南》百度云
  14. oracle从入门到精通视频教程下载,Oracle从入门到精通与实践视频教程
  15. 移动和嵌入式人体姿态估计(Mobile and Embedded Human Pose Estimation)
  16. “人活着是为了什么?”“生活的中心是什么?”
  17. 移动应用跨平台框架江湖将现终结者?速来参拜来自Facebook的React Native
  18. NC65单据节点开发
  19. iOS开发实战之手机号、座机号正则验证
  20. 关于SFM的材质vmt科普

热门文章

  1. mysql重新安装后之前表_关于重装mysql数据库之后.新的数据库引入旧数据的表结构和数据问题...
  2. WordPress主题 RiPro v5.0高级付费素材资源类主题
  3. Svcutil.exe详解
  4. 教程:VS2010 之TFS入门指南
  5. Magento: 设置产品列表默认排序方式 How to sort Magento products by date added as default
  6. jquery响应式内容滑动插件bxSlider
  7. 【必备】史上最全的浏览器 CSS JS Hack 手册
  8. Magento 产品推荐 extension Featured products 2.0 – revamped!
  9. python——socket实现简单C/S交互开发
  10. CMake和Make——简介和对比