02nodeJS中使用的模块化规范commonJS

来源:互联网 发布:网络考试系统破解版 编辑:程序博客网 时间:2024/05/22 21:17

导航:

               1、模块化

               2、前端模块化AMD和CMD

               3、commonJS规范


内容:

               一、模块化

                           如果你了解AMD或者CMD,那就跳过这一部分,直接看第二部分commonJS

                    如果你学过java,那么JS中的模块化就跟定义的一个个*.java文件是一样的,使用时,用import即可;如果你学过c/c++,模块化就是一个个.cpp文件,使用时include就行。

                    目前通行的JavaScript模块规范主要有: AMD,CMD, CommonJS。其中,AMD,CMD专注于 Web 浏览器端,CommonJS 则专注于服务器端。 

                          1、为什么要使用模块化

                                   举例说明:假设在a.html中包含了若干了js文件,如:

    <script src="1.js"></script>

 <script src="2.js"></script>

 <script src="3.js"></script>

 这段代码依次加载多个js文件。

缺点:

     1)、js文件之间存在依赖关系,因此必须严格保证加载顺序。依赖性最大的模块一定要放到最后加载,当依赖关系很复杂的时候,代码的编写和维护都会变得困难。由模块化规范来完成。

     2)、a.html文件并不是直接使用所有的js文件。如:a.html直接需要的是3.js文件的代码。而3.js文件里需要2.js里的代码,2.js里需要1.js文件的代码。这样就会显得职责不够明确,应该是,自己对自己需要依赖的文件进行引入。即a.html中只引入3.js文件,而3.js中引入2.js,2.js中引入1.js,这样显得职责清晰分明,而以前JS语言本身和环境不具备js文件引入js文件的能力,所以就需要使用模块化规范完成这个功能。


                             2、使用模块化:

                                    模块化一般使用时,有两步:第一:定义模块(*.js文件),第二:使用模块,即引入*.js文件。如果你使用过java,c++或者c#的话,就非常好理解了。这个模块化,只是由于JS语言本身和执行环境以前不具备这样的能力。

                              类比java语言:

                                                 1)、定义模块:写一个 *.java文件

                                                 2)、使用模块:import  *.java;

                              类别C++语言:

                                                 1)、定义模块:写一个*.cpp文件

                                                 2)、使用模块:include “*.cpp”

           二、前端模块化(仅做回顾):AMD和CMD

                         1、AMD:
                                  AMD就是Asynchronous Module Definition,中文名是异步模块定义的意思。AMD 是 RequireJS 在推广过程中对模块定义的规范化的产出。即现有RequireJS,然后,根据RequireJS 制定出了AMD规范。所以,使用AMD,需要先下载require.js文件。
                                  1)、定义模块(使用define函数):
                                              格式: define([当前模块所依赖模块的列表],funciton(){
模块对应代码
        return {
对外公开的属性和方法
}
  });

                                                            第一个参数:是当前模块所依赖的模块列表,是数组类型
    第二个参数:是当前模块的代码
                2)、使用模块(require):
格式:require([加载模块名], function (模块的返回值){
加载完模块后,执行的代码。
});

                                 示例:
先下载require.js文件,
                                       1)、定义模块:
                                          新建person.js,如下代码(//因为person.js文件对其它模块没有依赖,所以,不用写第一个参数):
                                          define(function(){
    var name = 'Byron';
    var age = 100;
    function printName(){
        console.log(name);
    }
    function setAge(transAge){
age = transAge;
     }
     function getAge(transAge){
return age;
     }
    return {
                printName: printName,
setAge:setAge,
getAge:getAge
    };
});
                                     2)、使用模块:
                                             新建demo.html(当然,也可以写成js文件,然后在html文件中引入js文件),如下代码:

<script type="text/javascript">
// 加载模块
require([‘person’], function (my){  //模块加载完成后执行的函数
  my.printName();
   my.setAge(80);
   console.log(my.getAge());
});
</script>

    注意:以上引入js文件时,没有使用script标记的src属性,而是使用require函数(当然,需要下载require.js文件,然后在html中引入)。

                             2、CMD:
                                      就是Common Module Definition,中文名是 通用模块加载规范. SeaJS是一个遵循CMD规范的JavaScript模块加载框架,在使用CMD时,需要先下载seaJS。
                                     1)、定义模块(使用define):

                            define(function(require,exports,module){
    let t = require(“m01”);//相当于<script  src=“m01.js”></script>   
exports.sayHello = function(str) {      
  alert(“hi,亲!”);   
 };

              });

  • require:模块的依赖关系
                 require函数的参数m01是要引入的模块名(m01.js),赋给的变量t是个对象。
  • exports:模块的输出
                exports.sayHello是对外公开的函数。即如果需要对外公开函数,就用exports参数的属性方式。

2)、使用模块:

seajs.use(" sayHi ",function(say){
$("#btn01").click(function(){
say.sayHello("box","Hello SeaJS!");
});
});


表示加载模块sayHi(即引入sayHi.js文件),
  • function的参数say表示模块对应的对象,即say就代表sayHi。
  • sayHello函数,是定义时,用exports对象的属性输出的函数。


a模块依赖b模块,b模块依赖c模块的代码格式

a.js
define(function(require,exports,module){
var  b = require(“b");
………………
});

b.js
define(function(require,exports,module){
var  c = require(“c");
………………
});

c.js
define(function(require,exports,module){
………………
});


           三、后端模块化:commonJS规范

                           commonJS规范是应用于后端的一个模块化规范,而AMD和CMD是应用前端的模块化规范。
                           commonJS规范的实现有:nodeJS和webpack
                           因为nodeJS本来就是支持commonJS规范,所以,在nodeJS中可以直接使用commonJS规范进行编程,使用起来也比较简单。

                       1、模块定义:

                                 新建person.js文件,代码如下:
     //定义:
var p = { 
id : "007",
name :"张三丰",
work:function(str){
return this.name+"在努力地敲代码";
},
add:function(n1,n2){
return n1+n2;
}
}
//模块接口暴露(直接对外公开整个对象)
module.exports = p;

//如果只是公开某个函数:
//module.exports.work = p.work;


                        2、模块加载(使用require):
                                      新建test.js文件,如下代码。就表示在test.js文件中可以使用person.js文件的代码

     var  person = require("./person");//引入了同目录下的person.js文件,即person变量就是person.js文件中对外公开的对象或者函数。
                                      
                                     person.id = "008";
                                     person.work();                                      



阅读全文
0 0