Node.js-模块系统

1.模块化: -文件作用域
-通信规则: *导入 (require) , *导出(exports)
2.CommonJS 模块规范:
-模块作用域
-使用 require 方法来加载模块
-使用 exports 接口对象来导出模块中的成员

3.导出 exports:
Node 中时模块作用域默认文件中所有的成员只在当前文件模块有效,对于其他模块
需要访问的成员,把这些成员挂载到exports 接口对象中即可

//直接挂载在exports对象上
exports.a = 666;
exports.b = 'Vodka';
exports.mutiple = function(x,y){
    
    
     return x * y ;
}
//导出单个成员,需要用到 module 对象
module.exports = ['name','age','gender'];
//新的赋值会覆盖掉旧的,所以导出一个字符串
module.exports = 'Hello Vodka!';

4.在Node中,每个模块内部都有个自己的 module 对象,在module 对象中,有一个成员叫: exports 也是一个对象

//对象内部结构
var module = {
    
    
  exports: {
    
    
    Name: 'Vodka',
    mutiple: function(){
    
    }
  }
  //默认返回代码
  return module.exports;
}
//模块中还有包括以下代码
   var exports = module.exports;	
   module.exports.Name = 'Vodka';
   module.exports.mutiple = function(x,y){
    
    
        return x * y ;
   }
   console.log( exports === module.exports);  //(true)
   //给两者其中一个赋值,都会断开两者之间指向同一内存空间的关系,一方会指向新的内存空间

当某个模块调用(require)另一个模块时,该模块就会得到被调用模块的 module.exports。

5.优先从缓存中加载:
例子: 在主模块中依次加载 a , b 模块, 在进入a模块中,a也加载并执行b模块,随后返回到主模块,这时主模块会直接从缓存中加载b,此时require b 不会再执行b中的代码,只是获得b的 module.exports 对象

  1. 路径形式的模块:
    - ./ 表示当前目录,不可省略
    - …/ 上一级目录,不可省略
    - 绝对路径 和 /xxxx 几乎不使用 ( 首位 /xxx 表示当前文件模块所属磁盘的根路径 )
    - .js 后缀名可以省略
    - require (’./Vodka.js’); // 这里require 的是模块标识,本质是文件

7.核心模块文件已经被编译到了二进制文件中,使用的时候直接加载就可以了:
-require(‘fs’);
-require(‘http’);
8.第三方模块:
-第三方模块都必须通过 npm 来下载
-使用的时候可以通过 require(‘包名’) 的方式进行加载第三方模块使用,包名是不会也不允许和核心模块重复
例:先找到当前文件所处目录中的 node_modules 目录, 最后: node_modules/art-template /package.json 文件中的 main 属性,main属性记录了 art-template 的入口模块,然后使用这个第三方包,实际最后加载的还是文件,如果没找到,则node会寻找当前目录下自定义的 index.js (默认备选项),如果index.js也没找到,则会返回上一级目录寻找,最后没找到的话,则会报错: can not find module xxx。(一个项目只有一个node_modules,放在项目录中的根目录,这样子目录就能加载的第三方模块)

                      默认加载方式:
                      var temp = require('art-template');
                      如果想改变加载路径,则需要用这种加载方式    require('../xxxx/xxx/xx.js');

猜你喜欢

转载自blog.csdn.net/Vodka688/article/details/115300194