在node.js里,以模块为单位划分所有功能,并且提供了一个完整的模块加载机制,我们可以将应用程序划分为各个不同的部分,并且对这些部分进行很好地协同管理。

1 Node.js框架中的核心模块与文件模块

  • 每一个模块都是一个javascript脚本文件

  • node.js预定义的核心模块,在加载模块时,只需要将模块名指定为require函数即可

    require('http')
    
  • 在node.js中可以自己编写或从网上下载的以下几种模块文件:

    • javascript文件
    • JSON文件
    • 后缀为.node的经过编译后的二进制模块文件
    • 以上模块文件加载的时候需要完整路径及文件名
    require('./scripts/foo.js')
    

2 从模块外部访问模块内的成员

  • 在一个模块中定义的本地(即非函数内定义的)变量、函数或对象只在该模块内有效,当需要在外部使用时,需要在该模块文件内使用exports对象
var myMsg = "hello";
var functionname = function () {
    return "我是函数";
};

exports.msg = myMsg;
exports.functionname = functionname;

// 然后在外部引用
var foo = require('./foo.js');
console.log(foo.msg);

  • 将模块定义为类

    • 可以在模块文件内将exports对象写成module.exports,但在需要将模块定义为一个类时,只能采用后者的书写方法
    // foo.js
    
    var _name, _age;
    var name="", age=0;
    
    // 模块对象的构造函数
    var foo = function(name, age) {
      _name = name;
      _age = age;
    }
    //获取私有变量_name的变量值
    foo.prototype.GetName = function () {
      return _name;
    };
    
    //设置私有变量_name的变量值
    foo.prototype.SetName = function (name) {
      _name = name;
    };
    
    // 获取私有变量_age的变量值
    foo.prototype.GetAge = function () {
      return _age;
    };
    
    // 设置私有变量_age的变量值
    foo.prototype.SetAga = function () {
      _age = age;
    };
    
    foo.prototype.name = name;
    foo.prototype.age = age;
    module.exports = foo;
    // 这是注释
    
    • 在外部使用foo.js内的变量
    var foo = require('./foo.js');
    var myFoo = new foo("Tom", 40);
    
    // 新建模块对象
    console.log(myFoo.GetName());
    console.log(myFoo.GetAge());
    
    myFoo.SetName("Bob");
    myFoo.SetAge(30);
    console.log(myFoo.GetName());
    console.log(myFoo.GetAge());
    
    console.log(myFoo.name;
    console.log(myFoo.age);
    
  • 为模块类定义类变量或类函数

    • 相当于其他语言中的静态变量或静态函数,在node.js里称为类变量或类函数

3 组织与管理模块

  • 从node_modules目录中加载模块
require('bar.js')
  • 上例中的写法,node.js将视该文件为node_modules目录下的一个文件

  • 使用目录来管理模块

    • 在node.js中,可以将目录名指定为模块名,以方便可以通过目录来光流模块,只需要为该目录指定一个入口点
  • 从全局目录中加载模块

    • 若在操作系统里设置了NODE_PATH变量,并将变量值设置为一个有效的磁盘目录,当在require函数中只指定模块名,而没有指定模块文件的路径,且node.js从其他路径中寻找不到需要被加载的模块文件时,Node.js将从NODE_PATH变量所指的磁盘目录中寻找并加载该模块文件。

4 模块对象的属性

  • 在模块文件内部,可以访问当前模块如下一些属性:
    • module.id,属性值为当前模块的ID
    • module.loaded,属性值为布尔值,false:模块尚未加载完毕
    • module.parent,属性值为当前模块的父模块
    • module.children, 属性值为一个数组,存放当前模块的所有子模块对象

5 包与npm包管理工具

  • node.js中的包

    • 在Node.js中可以通过包来对一组具有相互依赖关系的模块进行管理,通过包的使用,可以将某个独立的功能封装起来

    • 在node.js中一个包事实上是一个目录,其中包含了用于对包进行描述的package.json,一个包中,通常包含如下所示的一些内容:

      • 在包根目录中存放的package.json
      • 在bin子目录中存放二进制文件
      • 在lib子目录中存放javascript文件
      • 在doc子目录存放对包或包的使用方法进行说明的文档文件
      • 在test子目录中存放一些对包进行单元测试用的文件
    • 在一个package.json文件中,通常包含如下字段:

      • name: 包名,唯一
      • preferglobal: 是否支持全局安装;true:支持全局安装;
      • description: 包说明,对包进行简要描述
      • version: 版本号
      • author
      • maintainers:包维护者信息数组
      • bugs: bug提交地址
      • licenses: 许可证数组
      • repository
      • keywords
      • dependencies
  • npm包管理工具

    • 在Node.js中提供了一个npm(Node Package Manage)包管理工具
    • 使用npm可从第三方网站上下载Node.js包

结语

没有结语!