node.js 学习笔记(三)模块基础

Node Js采用模块方式来管理和组织代码,NodeJs的所有的功能都存在每个模块中

一、什么是模块?

简单说,一个具有特定功能的文件就是一个模块,模块之间可能存在一定的依赖关系,使用模块可以很好的把这些依赖关系整合起来。

二、为什么要使用模块

2.1 解决命名冲突

2.2 提高代码的复用性

2.3 避免依赖管理

2.4 可以实现代码的异步加载,提高页面的加载性能,避免网页失去响应

2.5 有利于团队分工

三、模块规范

目前有三种流行的模块规范:AMD,CMD,Common.js

先简单介绍下:

3.1,AMD:(Asynchronous Module Definition=异步模块定义),这种规范是异步的加载模块,requirejs应用了这一规范,适合客户端浏览器环境。主要解决js文件依赖问题还有js加载时浏览器会停止页面渲染,加载文件越多页面失去响应时间更长;

模块引用方式:

js代码:

define(id?,dependencies?,factory)
    第一个参数 id 为字符串类型,表示了模块标识,为可选参数。若不存在则模块标识应该默认定义为在加载器中被请求脚本的标识。如果存在,那么模块标识必须为顶层的或者一个绝对的标识。
    第二个参数,dependencies ,是一个当前模块依赖的,已被模块定义的模块标识的数组字面量。
    第三个参数,factory,是一个需要进行实例化的函数或者一个对象.

创建模块标识为 alpha 的模块,依赖于 require, export,和标识为 beta 的模块  

define("alpha", [ "require", "exports", "beta" ], function( require, exports, beta ){
    export.verb = function(){
        return beta.verb();
        // or:
        return require("beta").verb();
    }
});

类似与 CommonJS 方式定义

define(function(){
var exports = {};
exports.say = function(){
alert('hello');
};
return exports;
});

 

3.2,CMD:(Common Module Definition), 是seajs推崇的规范,国内大牛玉伯之作。

主要控制JS文件加载时机,当我们需要的时候再加载

 define( factory );
 define( id?, deps?, factory );
全局函数define,用来定义模块。
字符串id为模块标识,数组deps为模块依赖
    参数 factory  可以是一个函数,也可以为对象或者字符串。
    当 factory 为对象、字符串时,表示模块的接口就是该对象、字符串。

 factory 为函数的时候,表示模块的构造方法,执行构造方法便可以得到模块向外提供的接口。

define( function(require, exports, module) { 
    // 模块代码
});

 

3.3,Common.Js:采用的是同步加载文件方式,只适用于服务端(NodeJs平台)

demo:model.js

    var name = "Array"
    function printName(){  
      console.log(name);
    }    
    function printFullName(firstName){ 
       console.log(firstName + name)
    }   
    module.exports = {      
       printName:  printName,      
       printFullName:  printFullName
    }
    var nameModule = require("./model.js")
    nameModule.printName()  //  "Array"
    nameModule.printFullName("Bob")  //  "Bob Array"

运行:

注:

  • 一个单独的文件就是一个模块,每个模块都是一个单独的作用域,在模块内部定义的变量,无法被其他模块读取,除非定义为global对象的属性

  • 模块输出:模块只有一个出口,module.exports对象,我们需要把模块输出的内容放入该对象

  • 加载模块:加载模块使用require方法,该方法读取一个文件并执行,返回文件内部的module.exports对象,如果请求的模块不能返回,那么"require"必须抛出一个错误

四、模块特点

4.1 独立性。模块的功能代码都是写在一个函数里,模块与模块互不影响

4.2 模块中使用的var 定义变量都是局部变量

4.3 模块有一个模块对象,包含moduleId(模块名),esports(导出对象)

4.4 如果模块中需要暴露方法或属性给外部使用,那么就执行往exports对象上面添加。

4.5 使用一个模块用require(“moduleId”),该方法返回的是模块对象的exports对象。

五,自定义模块

从模块的定义我们知道,一个JS文件就是一个模块,所以定义一个模块,我们只要新建一个JS文件就好

a.js文件

function tellMe(){

 console.log(“this is a.js”);

}

在a.js文件中我们简单定义了个方法,根据模块的独立性(内部的变量和函数只能在该模块使用)我们只能在当前模块中使用,所以我们可以使用模块内的exports对象(导出对象)输出模块中功能供外部使用。

function sayHi(){

 console.log(“hi”);

}
//非常重要,导出模块功能(供外部使用)

exports.tellMe = tellMe;

模块定义完毕,下面就是要使用了,我们在b.js文件中使用a.js模块

b.js

var aa=require("./a.js");//引入模块
aa.tellMe();//使用模块中的功能

注:在文件里面引入模块的话,相对路径必须添加  . / ,不可以省略 . /   ,否则会报错  ;可以省略后缀名

运行

 

posted @ 2019-09-30 00:54  smile小吴  阅读(253)  评论(0编辑  收藏  举报