`
yanwenjinhaha
  • 浏览: 16475 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

NodeJs - 第二章

 
阅读更多
Node.js 是为网络而诞生的平台,但又与 ASP、PHP 有很大的不同,究竟不同在哪里呢?
如果你有 PHP 开发经验,会知道在成功运行 PHP 之前先要配置一个功能强大而复杂的HTTP服务器,譬如 Apache、IIS 或 Nginx,还需要将 PHP 配置为 HTTP 服务器的模块,或者使用FastCGI 协议调用 PHP 解释器。这种架构是“浏览器 HTTP服务器 PHP解释器”的组织方式,而Node.js采用了一种不同的组织方式,“浏览器 NODE”的组织。

小技巧——使用 supervisor
如果你有 PHP 开发经验,会习惯在修改 PHP 脚本后直接刷新浏览器以观察结果,而你
在开发 Node.js 实现的 HTTP 应用时会发现,无论你修改了代码的哪一部份,都必须终止
Node.js 再重新运行才会奏效。这是因为 Node.js 只有在第一次引用到某部份时才会去解析脚本文件,以后都会直接访问内存,避免重复载入,而 PHP 则总是重新读取并解析脚本(如果没有专门的优化配置)。Node.js的这种设计虽然有利于提高性能,却不利于开发调试,因为我们在开发过程中总是希望修改后立即看到效果,而不是每次都要终止进程并重启。
supervisor 可以帮助你实现这个功能,它会监视你对代码的改动,并自动重启Node.js。

什么是阻塞(block)呢?线程在执行中如果遇到磁盘读写或网络通信(统称为 I/O 操作),通常要耗费较长的时间,这时操作系统会剥夺这个线程的 CPU 控制权,使其暂停执行,同时将资源让给其他的工作线程,这种线程调度方式称为 阻塞。当 I/O 操作完毕时,操作系统将这个线程的阻塞状态解除,恢复其对CPU的控制权,令其继续执行。这种 I/O 模式就是通常的同步式 I/O(Synchronous I/O)或阻塞式 I/O (Blocking I/O)。
相应地,异步式 I/O (Asynchronous I/O)或非阻塞式 I/O (Non-blocking I/O)则针对所有 I/O 操作不采用阻塞的策略。当线程遇到 I/O 操作时,不会以阻塞的方式等待 I/O 操作的完成或数据的返回,而只是将 I/O 请求发送给操作系统,继续执行下一条语句。当操作系统完成 I/O 操作时,以事件的形式通知执行 I/O 操作的线程,线程会在特定时候处理这个事件。为了处理异步 I/O,线程必须有事件循环,不断地检查有没有未处理的事件,依次予以处理。

同步式 I/O                              异步式 I/O 的特点
同步式 I/O(阻塞式) 异步式 I/O(非阻塞式)
利用多线程提供吞吐量 单线程即可实现高吞吐量
通过事件片分割和线程调度利用多核CPU 通过功能划分利用多核CPU
需要由操作系统调度多线程使用多核CPU 可以将单进程绑定到单核 CPU
难以充分利用CPU资源 可以充分利用CPU资源
内存轨迹大,数据局部性弱 内存轨迹小,数据局部性强
符合线性的编程思维 不符合传统编程思维

Node.js 所有的异步 I/O 操作在完成时都会发送一个事件到事件队列。在开发者看来,事
件由 EventEmitter 对象提供。前面提到的 fs.readFile 和 http.createServer 的回调函数都是通过 EventEmitter 来实现的。实例如下:

var EventEmitter = require('events').EventEmitter;
var myEvent = new EventEmitter();
myEvent.on('someEvent', function(str){
console.log(str);
});

setTimeout(function(){
myEvent.emit('someEvent', 'hello EventEmitter');
},1000);

Node.js 在什么时候会进入事件循环呢?答案是 Node.js 程序由事件循环开始,到事件循环结束,所有的逻辑都是事件的回调函数,所以 Node.js 始终在事件循环中,程序入口就是事件循环第一个事件的回调函数。事件的回调函数在执行的过程中,可能会发出 I/O 请求或直接发射(emit)事件,执行完毕后再返回事件循环,事件循环会检查事件队列中有没有未处理的事件,直到程序结束。下图说明了事件循环的原理。
[img]

[/img]
模块(Module)和包(Package)是 Node.js 最重要的支柱。开发一个具有一定规模的程序不可能只用一个文件,通常需要把各个功能拆分、封装,然后组合起来,模块正是为了实
现这种方式而诞生的。在浏览器 JavaScript 中,脚本模块的拆分和组合通常使用 HTML 的script 标签来实现。Node.js 提供了 require 函数来调用其他模块,而且模块都是基于文件的,机制十分简单。

模块是 Node.js 应用程序的基本组成部分,文件和模块是一一对应的。换言之,一个
Node.js 文件就是一个模块,这个文件可能是 JavaScript 代码、JSON 或者编译过的 C/C++ 扩展。

Node.js 提供了 exports 和 require 两个对象,其中 exports 是模块公开的接口,require 用于从外部获取一个模块的接口,即所获取模块的 exports 对象。require 不会重复加载模块,也就是说无论调用多少次 require,获得的模块都是同一个。

包是在模块基础上更深一步的抽象,Node.js 的包类似于 C/C++ 的函数库或者Java/.Net的类库。它将某个独立的功能封装起来,用于发布、更新、依赖管理和版本控制。Node.js 根据 CommonJS 规范实现了包机制,开发了npm来解决包的发布和获取需求。Node.js 的包是一个目录,其中包含一个 JSON 格式的包说明文件 package.json。严格符合 CommonJS 规范的包应该具备以下特征:
 package.json 必须在包的顶层目录下;
 二进制文件应该在 bin 目录下;
 JavaScript 代码应该在 lib 目录下;
 文档应该在 doc 目录下;
 单元测试应该在 test 目录下。
Node.js 对包的要求并没有这么严格,只要顶层目录下有 package.json,并符合一些规范即可。

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

在使用 npm 安装包的时候,有两种模式:本地模式和全局模式。默认情况下我们使用 npm
install命令就是采用本地模式,即把包安装到当前目录的 node_modules 子目录下。Node.js的 require 在加载模块时会尝试搜寻 node_modules 子目录,因此使用 npm 本地模式安装的包可以直接被引用。npm 还有另一种不同的安装模式被成为全局模式,使用方法为:npm [install/i] -g [package_name]
本地模式与全局模式
模 式 可通过 require 使用 注册PATH
本地模式 是 否
全局模式 否 是

npm 提供了一个有趣的命令 npm link,它的功能是在本地包和全局包之间创建符号链接。我们说过使用全局模式安装的包不能直接通过 require 使用,但通过 npm link命令可以打破这一限制。举个例子,我们已经通过 npm install -g express 安装了express,
这时在工程的目录下运行命令:
$ npm link express
./node_modules/express -> /usr/local/lib/node_modules/express
我们可以在 node_modules 子目录中发现一个指向安装到全局的包的符号链接。通过这
种方法,我们就可以把全局包当本地包来使用了。
npm link 命令不支持Windows。
  • 大小: 29.3 KB
分享到:
评论

相关推荐

    Vue第二章nodeJS及vue-cli.pdf

    Vue 入门到进阶第二章 #资源达人分享计划 # 技术文档

    ignite-nodejs-workspace:训练营点燃点#1-Trilha NodeJS

    :construction:第二章第三章第四章第五章 :memo: Licença Esse projetoestá抽签了麻省理工学院。 Veja o arquivo获得。 拍摄的图片是美国火箭队的证明。 Feito com :purple_heart: 吉尔赫姆·胡里奥(Guilherme ...

    nodejs开发实战详解

    nodejs开发实战详解部分,大概到第二章,高清,求完整版

    nodeTest:nodejs实战第二版第6章原始码

    nodejs实战第二版第6章原始码 说明 运行环境system: Windows 64bit node version: v6.9.1 npm version: v3.10.8 IDE: Webstorm 2016.2.3 本部分代码包含了6.2节的原始代码,6.3节源码由于与实际项目相关,并且没有...

    七天学会NodeJS

    ### 第二章:NodeJS核心模块 这一章节将介绍NodeJS的核心模块,这些模块是NodeJS内置的,无需额外安装即可使用。具体包括: #### 2.1 内置模块 NodeJS提供了多个内置模块来支持常见的功能需求,如文件操作、网络...

    基于nodejs电影交流网站(源码 + 说明文档)

    第二章 开发技术介绍 1 2.2.1 Nodejs技术 1 2.2.2 mysql数据库介绍 1 2.2.3 MySQL环境配置 1 2.2.4 B/S架构 2 2.2.5 Vue框架 2 第三章 系统分析 1 3.1 可行性分析 1 3.1.1 技术可行性 1 3.1.2操作可行性 1 3.1.3 ...

    Nodejs实战前四章

    由于JavaScript不支持二进制数据处理,Node.js引入了Buffer类,用于处理二进制数据,如网络传输的数据、文件读写等场景。 9. **包管理器npm**: npm是Node.js的包管理工具,用于安装、发布、依赖管理。通过npm,...

    node-console-stamp:修补NodeJS控制台方法,以便按模式添加时间戳信息

    控制台图章3 该模块使您可以控制Node.js中console日志记录方法的输出。 例如在log语句前加上...您可以通过提供对象作为第二个参数来更改此设置。 require ( 'console-stamp' ) ( console , { format : ':date(yyyy

    Node.js in Action 第二版 第一章

    Node.js in Action 第二版 第一章的知识点主要包括Node.js的基础介绍、编写Node.js程序的基本原理、以及网络爬虫自动化网络数据处理的相关内容。 首先,Node.js是一种基于Chrome V8引擎的JavaScript运行时环境,它...

    chapter02-desafio02-trilha-nodejs

    在本项目"chapter02-desafio02-trilha-nodejs"中,我们可以看出这是一个关于Node.js学习路径的第二章第二个挑战。Node.js是JavaScript的一个运行环境,它允许开发者在服务器端使用JavaScript进行开发,提供了丰富的...

    ignite-primeiro-projeto-nodejs:由RocketSeat为Ignite Bootcamp第一章第二课制作的存储库

    FinAPI-Financeira 要求 Deve serpossívelcriar uma conta Deve serpossívelbuscar o extratobancáriodo cliente 开发者的实现和发展 现实生活中的一切 []客户数据的Deve serpossívelbuscar或Extratobancá...

    kyro-cyra#jenkins-study#第十二章-流水线实践(四)1

    第六章 前端发布流水线(NodeJs)1. 项目设置项目配置部分主要是将网站源代码上传到github,然后搭建用户访问的web服务器。再经过Jenkins配置发

    最新nodejs 书籍

    - **Mitchell Foley**(Google 软件工程师):书中的一些示例代码甚至被用于个人项目中,尤其是第七章。 #### 三、核心知识点 1. **Node.js 入门** - Node.js 基础概念 - 安装与环境配置 - 第一个 Node.js 应用...

Global site tag (gtag.js) - Google Analytics