JS模块化-requireJS

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JS模块化-requireJS相关的知识,希望对你有一定的参考价值。

1. 为什么要使用require.js

 

刚开始的时候,网页需要用到很多不同的插件,都是依次加载,需要注意其中的加载顺序即依赖关系。

   <script src="1.js"></script>
  <script src="2.js"></script>
  <script src="3.js"></script>
  <script src="4.js"></script>
  <script src="5.js"></script>
  <script src="6.js"></script>

这种写法有很大缺点。首先,加载的时候,浏览器会停止网页渲染,加载文件越多,网页失去响应的时间就会越长;

其次,由于js文件之间存在依赖关系,因此必须严格保证加载顺序(比如上例的1.js要在2.js的前面),依赖性最大的

模块一定要放到最后加载,当依赖关系很复杂的时候,代码的编写和维护都会变得困难。

 

1.1require.js的作用

① 实现js文件的异步加载,避免网页失去响应;

② 管理模块之间的依赖性,便于代码的编写和维护。

 

 

2. require.js的使用

 

2.1require.js的加载

2.1.1 使用require.js的第一步,是先去官方网站下载最新版本。

    下载后,假定把它放在js子目录下面,就可以加载了。

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

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

     也可以将这行代码放在网页底部加载。

 

2.1.2  加载require.js以后,下一步就要加载我们自己的代码了。假定我们自己的代码文件是main.js,也放在js目录下面。那么,只需要写成下面这样就行了:

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

   data-main属性的作用是,指定网页程序的主模块。在上例中,就是js目录下面的main.js,这个文件会第一个被require.js加载。

   由于require.js默认的文件后缀名是js,所以可以把main.js简写成main。

   这是我的JS目录。

 

2.2主模块的写法

 通过require方法,实现代码的模块加载,require()函数接受两个参数:

 ① 第一个参数是一个数组,表示所依赖的模块,例如["JQuery","underscore", “backbone”],即主模块依赖这两个模块;

 ② 第二个参数是一个回调函数,当前面指定的模块都加载成功后,它将被调用。加载的模块会以参数形式传入该函数,

     从而在回调函数内部就可以使用这些模块。回调函数就是整个页面的JS代码。

  require([\'jquery\', \'underscore\', \'backbone\'], function ($, _, Backbone){
    
  });

 

2.3模块的加载

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

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

     require.config是用来配置模块加载位置,简单点说就是给模块起一个更短更好记的名字。

  require.config({
     paths: {
       "jquery":  ["http://libs.baidu.com/jquery/2.0.3/jquery", "jquery-3.1.1.min"],
       "underscore": "underscore"
     }
  });

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

    paths还有一个重要的功能,就是可以配置多个路径,如果远程cdn库没有加载成功,可以加载本地的库。

 

2、上面的代码给出了三个模块的文件名,路径默认与main.js在同一个目录(js子目录)。如果这些模块在其他目录,

      比如js/lib目录,则有两种写法。一种是逐一指定路径。

  require.config({
      paths: {
       "jquery": "lib/jquery",
       "underscore": "lib/underscore"
     }
  });

      另一种则是直接改变基目录baseUrl:

  require.config({
     baseUrl: "js/lib",
     paths: {
       "jquery": "jquery",
       "underscore": "underscore"
     }
  });

 

3、加载非规范化模块

   shim属性,专门用来配置不兼容的模块。具体来说,每个模块要定义

     ① exports值(输出的变量名),表明这个模块外部调用时的名称;

     ② deps数组,表明该模块的依赖性。

     比如,jQuery的插件可以这样定义:

  require.config({
      baseUrl: "js/lib",
    shim: {
      \'underscore\':{
        exports: \'_\'
      },
      \'backbone\': {
        deps: [\'underscore\', \'jquery\'],
        exports: \'Backbone\'
      }
    }
    paths: {
      "jquery": "jquery",
      "underscore": "underscore"
    }
  });

 

2.4AMD模块的写法

 

①  模块必须采用特定的define()函数来定义。如果一个模块不依赖其他模块,那么可以直接定义在define()函数之中。

     define(function (){});

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

     define([\'jquery\'], function(jquery){});

 

3. 例子

1、student.js文件:

define(function() {
    return {
        createStudent: function(name, gender) {
            return {
                name: name,
                gender: gender
            };
        }
    };
});

 

2、class.js文件:

define(function() {
        var allStudents = [];
        return {
            classID: "001",
            department: "computer",
            addToClass: function(student) {
                allStudents.push(student);
            },
            getClassSize: function() {
                return allStudents;
            }
        };
    }
);

 

3、manager.js文件:

define(["student", "class"], function(student, clz) {
    return {
        addNewStudent: function(name, gender) {
            clz.addToClass(student.creatStudent(name, gender));
        },
        getMyClassSize: function() {
            return clz.getClassSize();
        }
    };
});

 

4、main.js文件:

require(["manager"], function(manager) {  
    manager.addNewStudent("Jack", "男");  
    manager.addNewStudent("Rose", "女");  
    console.log(manager.getMyClassSize()); 
}); 

 

以上是关于JS模块化-requireJS的主要内容,如果未能解决你的问题,请参考以下文章

JS模块化规范AMD之RequireJS

了解requirejs

requirejs - 将多个文件组合成一个不依赖于 requirejs 的 js 文件

使用requirejs实现模块化编程

require.js实现js模块化编程

模块化开发------requireJS的基本使用------凡尘