当前位置: 移动技术网 > IT编程>开发语言>JavaScript > require.js的模块化知识整理

require.js的模块化知识整理

2019年01月13日  | 移动技术网IT编程  | 我要评论

本文是对自己js学习的一个总结和一些碎片化学习的整理,主要是关于模块化的以及require.js。

javascript模块化(三):require.js的用法

(注:原著真的很清楚详细,如果你看不懂有两种可能:zs不够或层次未到。我也是时隔了很久再看才觉有味的。)

模块化:

1. 原始表达方式:

function  m1(){

}
function m2(){

}
m1()
m2()

上面定义了两个模块,m1和m2,写法很直接,但是缺陷在于模块间的依耐关系不明确,也容易造成全局变量的污染问题。

2.对象表达方式:

var moudle=new object({
    xx:21,
    m1: function () {

    },
    m2: function () {

    }
})

把模块封在对象中,缺陷在于内部属性的暴露问题,例如更改内部属性xx的值问题。

3.立即执行方式:

;(function () {

})()

这种方式经常见,它解决了对象表达方式的缺陷。

模块化规范问题:

如上述所列,定义模块化的方式很多,为了开发的统一性,产生模块化开发的规范:commonjs(node的模块化依次实施),amd,cmd。

为什么会有三种模块化规范?不同的模块化规范针对两端(服务器端和端),即服务器端和浏览器端的特性不一,例浏览器端的模块化加载需要异步加载。

amd:”异步模块定义”。它采用异步方式加载模块,模块的加载不影响它后面语句的运行。所有依赖这个模块的语句,都定义在一个回调函数中,等到加载完成之后,这个回调函数才会运行。

amd的模块加载方式:

require([module], callback);

第一个参数为需要加载的模块数组,第二个是回调函数。

而博客标题的require.js是依amd规范实施的一个库。

个人理解require.js的意义:

网站大了需要加载的模块数量变多,模块之间的依赖关系变得复杂,如何正确加载?如何不影响网站的加载(减缓响应时间)?

注意:异步加载

require.js的使用:

1:引入

用script标签引入,但是require.js引入发生错误呢?

所以==》

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

说明:defer和 async:强调异步加载方式引入,defer是ie专用(浏览器有两种,一种叫ie,一种叫其它)。

2:主模块的引入

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

说明:data-main用来强调主模块是main(或者你写成js/main.js)。主模块就是整个主体的入口,与其它模块相依。相当于我们c的main函数这种。

3.主模块的书写

例子的前提是main模块现在依赖于’jquery’, ‘underscore’, ‘backbone’这三个模块。

 require(['jquery', 'underscore', 'backbone'], function ($, _, backbone){
    // some code here
  });

4.require.config()方法(写在主模块的最上面)

require.config({
    paths: {
      "jquery": "jquery.min",
      "underscore": "underscore.min",
      "backbone": "backbone.min"
    }
  });

这里需要记录的是,paths的意义就是指各个模块的加载路径。上面的写法默认各模块和主模块在同一级目录下。你也可以用下面的方式替代

require.config({
    //baseurl指定模块目录
    baseurl: "js/lib",
    paths: {
      "jquery": "jquery.min",
      "underscore": "underscore.min",
      "backbone": "backbone.min"
    }
  });

5.define()定义模块
require.js加载的模块,采用amd规范。也就是说,模块必须按照amd的规定来写

define(['mylib'], function(mylib){
    function foo(){
      mylib.dosomething();
    }
    return {
      foo : foo
    };
  });

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

6.加载非规范的模块

不是所有的模块都是amd规范,require,js依旧可以加载

require.config({
    shim: {
      'underscore':{
        exports: '_'
      },
      'backbone': {
        deps: ['underscore', 'jquery'],
        exports: 'backbone'
      }
    }
  });

shim参数用来配置不符amd规范的模块,underscore和backbone是两个模块,其中的参数属性exports表示该模块向外暴露的引用方式,例如jquery的$

deps表示该模块的依赖。

6.其它

require.js还提供一系列插件,实现一些特定的功能。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网