Node.js   发布时间:2022-04-24  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Node.js之模块系统大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

CommonJS规范

CommonJS模块规范

CommonJS模块特点

Node.js模块介绍

模块系统

  • 1、什么是模块

  • 2、模块作用域

  • 3、require

require("路径")
//路径现阶段使用相对路径
  • 4、exports

① 是module.exports的一个别名、引用,exports能做的module.exports都可以完成。

② 为了方便,Node为每个模块提供一个exports变量,指向module.exports。

相当于在每个模块头部,有这样一行命令:
var exports = module.exports;

结果就是:在对外输出模块接口时,可以向exports对象添加方法

③ 注意:不能直接给exports赋值,因为这样等于切断了exports和module.exports的联系

@H_264_32@module.exports 别名
@H_264_32@module.exports=123;已经使用过一次了,exports就不生效了
@H_264_32@module.exports.a=12;这样使用,exports是还可以使用的
  • 5、module.exports

补充: @H_172_14@module对象
1、 是一个全局对象,它的作用是存储模块信息的。每一个js是一个模块,每一个模块里面都有@L_930_0@module,module里面还存储了父子结构。直接给module.exports赋值,exports是无效,用属性的形式去赋值的时候二者都有效。

2、Node内部提供@L_930_0@module构造函数,所有模块都是Module的实例。
每个模块内部,都有@L_930_0@module对象,代表当前模块。

@H_205_13@module.id 带有绝对路径的模块文件
module.filename 模块的文件名,带有绝对路径
module.loaded 表示模块是否已经完成加载
module.parent 返回一个对象,表示调用该模块的模块。
module.children 返回一个数组,表示该模块要用到的其他模块。
module.exports 模块对外输出的值

1 模块种类

在Node.js中,模块分为两类:

第一类,核心模块(原生模块),node自带,用名称直接可以加载。

- 核心模块
  fs: file sy@L_944_24@与文件系统交互
  http: 提供http服务器功能
  os
  path: 处理文件路径
  queryString : 解析url查询字符串
  url:解析url
  util: 提供一系列实用小工具
  ...

核心模块的源码都在Node的lib子目录中。为了提高运行速度,它们安装的时候都会被编译成二进制文件

第二类,文件模块,用路径加载,用户自己编写的模块。有一种特殊的文件模块—–>包,可以直接用名字。

规范的包目录结构:

package.json : 包描述文件,说明文件
Bin : 存放可执行二进制文件的目录
Lib : 存放JavaScript代码的目录
Doc : 存放文档的目录
Test : 存放单元测试用例的代码

其中package.json:

name
    包的名称
description
    包的简介
version
    包的版本号
keywords
    关键词数组,用于在npm分类搜索
author
    包的作者
main
    配置包的入口,认是模块根目录下的index.js
dependencies
    包的依赖项,npm会通过该属性自动加载依赖包
scripts
    指定了运行脚本命令的npmm命令行缩写,例如start

package.json全字段解析](http://www.voidcn.com/article/p-fpclbowo-mw.html

一个例子:

//test_package/node_modules/myPackage/package.json
{
  "name": "test","version": "0.0.1","description": "","main": "index.js","keywords": [
  ],"author": "KingNigel","repository": {
    "type": "git","url": "https://github.com/KingNigel/test.git"
  },"bugs": {
    "url": "https://github.com/KingNigel/test/issues"
  },"license": "MIT","devDependencies": {
    "test": "*"
  },"dependencies": {
    "test": "*"
  }
}

//test_package/node_modules/myPackage/index.js
exports.a=123;

//test_package/index.js
var foo = require('myPackage'); //文件夹名就是包名
console.log(foo); //{a:123}

2 优先从缓存加载

common.js规范----->加载后,再次加载时,去缓存中取@H_264_32@module.exports

只在第一次加载的时候,从硬盘中读取js,执行代码,缓存整个module对象。第二次加载去缓存中取module.exports。

Node.js之模块系统

//add.js
var add = function(a,b){
    return a+b;
}
module.exports = add;
console.log('执行add.js');

//sub.js
var sub = function(a,b){
    return a-b;
}

module.exports = sub;
console.log('执行sub.js');
//math.js
var add1 = require('./add.js');
var add2 = require('./add.js');
var add3 = require('./add.js');
var sub1 = require('./sub.js');

console.log(add1(3,5));
console.log(add3(1,5));

//执行结果:
执行add.js
执行sub.js
8
6

测试结果可知,add1和add3只加载一次;sub没有使用,也会加载执行

3 require参数解析及加载规则

  • ./ 或 ../ 开始的相对路径文件模块
    • 在加载一个自己编写的模块的时候,最好使用__dirname 和 你要加载的模块的文件名拼接。
  • 以 / 开始的绝对路径文件模块(不建议使用)

    • 在Linux或者MAc的操作系统中,/表示系统的根路径
    • 在Windows中,/表示当前文件模块所属的根磁盘路径
  • 参数字符串不以“./“或”/”开始

    • 表示加载核心模块,或者一个位于各级node_modules目录已安装的模块。
  • 标识符中可以不包含扩展名

    • Node会按照 .js、.node、.json 的次序补足扩展名,依次尝试
    • Node.js会通过同步阻塞的方式看这个路径是否存在。依次尝试,直到找到为止, 如果找不到,报错。

  • 最终获取到的是module.exports

  • 参考田永强《深入浅出nodejs》

    4 require加载机制

    Node.js之模块系统

    5 require的实现原理

    6 仿写Myrequire.js

    //@H_118_33@myrequire.js
     function Myrequire(path) {
        //定义一个构造@L_971_12@module
        function Module() {
          this.exports = {};
        }
        var fs = require('fs');
        //同步读取文件文件内容source
        var source = fs.readFileSync(path,'utf-8');
        //拼接代码变成一个函数String
        var package = '(function(exports,modulE){' + source + ' return module.exports;})';
        var packObj = eval(packagE);
    
        //调用构造函数创建Module
        var @H_264_32@module = new Module();
        //var exports = @H_264_32@module.exports 把@H_264_32@module.exports当实参传入,exports当形参去接
        var obj = packObj(@H_264_32@module.exports,@H_264_32@module);
        return obj;
      }
    
      var foo = Myrequire('./hia.js');
      console.log(foo);
      console.log(foo.a);
      foo.fun();
    //hia.js
    var a = 123;
    var fun = function(){
        console.log("我是fun函数");
    }
    console.log("Helloworld");
    
    exports.a=a;
    exports.fun = fun;
    @H_812_489@参文档:

    package.json全字段解析:
    (http://www.voidcn.com/article/p-fpclbowo-mw.html

    田永强《深入浅出nodejs》:(http://www.infoq.com/cn/articles/nodejs-module-mechanism/)

    大佬总结

    以上是大佬教程为你收集整理的Node.js之模块系统全部内容,希望文章能够帮你解决Node.js之模块系统所遇到的程序开发问题。

    如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

    本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
    如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。