zoukankan      html  css  js  c++  java
  • node.js学习3

    Node.js中所有的异步的I/O操作在完成时都会发送一个事件到事件队列。事件由EventEmitter对象提供。

    Node.js的事件循环:

    node.js程序由事件循环开始,到事件循环借宿,所有的逻辑都是事件的回调函数。node.js始终在事件循环中,程序入口就是事件循环第一个事件的回调函数。

    事件回调函数在执行过程中可能会发出I/O请求或直接发射(emit)事件,执行完毕后再返回事件循序,事件循环会检查事件队列中有没有未处理的事件,直到程序结束。

    node.js的事件循环由libev库实现。libev支持多种类型的事件,eg: ev_io,ev_timer,ev_signal,ev_idle。。。均被封装EventEmitter封装。

    模块(Module 和 Package)和包:

    包可以理解为是实现了某个功能模块的集合,用于发布和维护。

    模块: 文件和模块是一一对应的,一个Node.js文件就是一个模块,这个文件可能就是JavaScript代码,JSON或者编译过的C/C++扩展。

    1.创建模块:

    exports是模块公开的接口,require用于从外部获取一个模块的接口,即所获取模块的exports对象。

    创建一个A.js文件,用exports.functionName的函数,在另一个B.js中用require('A的相对路径')以后可是直接使用,但是在A中如果有函数没有通过exports实现,则在B中无法调用。

    exports是模块的公开接口,require用于从外部获取一个模块的接口,即获取模块的exports对象。

    node.js的单次加载特性,

    var hello1 = require("./module");
    hello1.setName('1');
    
    var hello2 = require("./module");
    hello2.setName('2');
    
    hello1.sayHello();
    
    结果是 Hello 2

    因为hello1和hello2都指向同一个实例。

    2. 如果只是需要把一个对象封装到模块中,则可以通过: module.exports = hello;(在A.js中)

    然后在B.js中可以通过 hello = new Hello(); 来new一个对象出来。

    exports本身不仅仅是一个普通的空对象,即{},它专门用来声明接口,本质上是通过它为模块闭包的内部机建立了一个有限的访问接口。因为它没有任何特殊的地方,所以可以用其他东西来替代。

    注: 不可以通过对exports直接赋值代替对module.exports赋值。exports实际上只是一个和module.exports指向同一个对象的变量,但是它本身会在模块执行结束后释放,但module不会,因此只能通过指定module.exports来改变访问接口。

    符合CommonJS规范的包应该具备以下特征:

    1.package.json必须在包的顶层目录下;

    2.二进制文件应该在bin目录下

    3.JavaScript代码应该在lib目录下

    4.文档应该在doc目录下

    5.单元测试应该在test目录下

    包通常是一些模块的集合,在模块的基础上提供了更高层的抽象,相当于提供了一些固定接口的函数库。通过定制package.json,可以创建更复杂、更完善、更符合规范的包用于发布。

    Node.js在调用某个包时,会首先检查保重package.json文件的main字段,将其作为包的接口模块,如果package.json或main字段不存在,会尝试寻找index.js或index.node作为包的接口。

    完全符合规范的package.json文件应该含有以下字段:

    1.name : 包的名称,必须是唯一的,由小写英文字母,数字,下划线组成,不能包含空格。

    2.description : 包的简要说明。

    3.version : 符合语义化版本识别规范的版本字符串。

    4.keywords : 关键字数组,通常用于搜索。

    5.maintainer : 维护者数组,每个元素要包含name , email(可选) , web(可选)字段。

    6.contributors : 贡献者数组,格式与maintainers相同。包的作者应该是贡献者数组的第一个元素。

    7.bugs : 提交bug的地址,可以使网址或者电子邮件地址。

    8.licenses : 许可证数组,每个元素要包含type(许可证的名称)和url(链接到许可证问本地的地址)字段。

    9.repositories : 仓库托管地数组,每个元素要包含type(仓库的类型,eg : git )、url(仓库的地址)和path(相对于仓库的路径,可选)字段。

    10.dependencies : 包的依赖,一个关联数组,由包名称和版本号组成。

  • 相关阅读:
    Python基础之只接收关键字参数的函数
    Python基础之可接受任意数量参数的函数
    Django基础之创建admin账号
    GIT版本控制工具
    全站导航
    python中对url编码解码处理
    VUE安装及初始化报错解决办法
    使用Appium+python爬取手机App
    python发送QQ邮件
    docker部署flask项目
  • 原文地址:https://www.cnblogs.com/shixiaomiao/p/4957527.html
Copyright © 2011-2022 走看看