nodejs知识总结

来源:互联网 发布:水文地质钻孔数据 编辑:程序博客网 时间:2024/06/07 19:11
CommonJS规范:弥补javascript天然不足的问题,规定了模块化开发的整体规则
1:引用模块
  var http = require("http");

2、模块定义规则:
  将方法作为exports的属性进行输出,
    // math.js 
    exports.add = function() {
      var sum = 0;
      i = 0;
      args = arguments,
      l = args.length;
      while(i<l){
        sum += args[i++];
      }
      return sum;
    };
  // 在其他js代码中调用导出的模块
  var math = require("math");
  }

3、模块标识,传给require()方法的参数,它是必须符合小驼峰命名的字符串,或者以..或者.开头的的相对路径,或者绝对路径,可以没有后缀名js ;

Node 中引进模块的步骤: 
  (1)路径分析 (2)文件定位(3)编译执行 
模块分为两类,一类是Node的核心模块,一个是用户自定义的模块,成为文件模块;文件模块需要在 运行时进行加载,速度比核心的慢
node对引入过的js代码会进行缓存,减少二次加载的开销;


如何进行路径分析和文件定位,在require()函数中的代码如何实现路径解析的呢?
  模块分为核心模块和文件模块,如果是Node自带的一些模块,例如"http", "fs",require中只要指定
  1、核心模块,"http", "fs", 
  2、以..或.开头的相对文件模块,
  3、以/开头的绝对路径模块,
  4、非路径形式的模块,如自定义的Connector模块;
  console.log(module.paths)   // 先在此js所在的文件夹下寻找指定的js文件,没找到则一次递归在父目录中寻找;
  小诀窍,在指定文件的后缀,当模块不是以js结尾的情况下,用于快速加载js代码;
  出现目录的名称和require()中的参数相同,则Node将目录当作一个包来处理,Node现在当前目录下查找package.json文件,通过JSON.parse()解析出包描述符对象,
  读取main属性所指定的文件模块名称,然后对此模块名进行解析;
  如果没有package.json文件,则以index作为文件模块名进行解析查找;
  最后依然找不到,则抛出异常;

模块编译:
  编译和执行是引入文件模块的最后步骤,Node会新建一个模块对象,然后根据路径载入编译,不同的后缀,载入方法也是不一样的,例如js后缀的fs模块进行加载,
  .json后缀的以JSON.parse()函数解析,.node后缀以Node的C++模块dlopen()函数进行载入;
在Node中,每个文件模块都是一个对象,文件模块的定义如下:
  function Module(id, parent) {
    this.id = id;
    // 导出对象
    this.exports = {}
    this.parent = parent;
    if(parent && parent.children) {
      parent.children.push(this)
    }
    this.filename = null;
    this.loaded = false;
    this.children = [] ;
  }
每一个编译成功的模块,都会被缓存起来,作为索引存储在Module._cache对象上;
加载定义后缀的模块,设置require.extensions属性,require.extensions['.ext']

Node文件封装隔离,消除名称污染;

创建一个npm包的全过程:
(1)创建一个目录, mkdir demo, cd demo,创建文件hello.js文件 :
(2)调用npm init命令初始化package.json包;
(3)注册包仓库帐号
  npm adduser 
(4)上传包到npm仓库 npm publish 
  
原创粉丝点击