node.js
by-lenovointer

Move fast with stable infra
第一讲

什么是Node.js?
Node.js不是JS应用、而是JS运行平台
Node.js采用事件驱动(事件与回调函数)、异步编程(异步I/O),为网络服务而设计
JavaScript 单进程、单线程
编写高性能Web服务
主要框架express、koa 两个框架是同一个团队开发

node 运行环境组成
v8 engine(isolate, context, handles)
libuv(主要用于处理事件驱动的异步I/O模型库)
内建模块(JS模块叫“native module”,而C++模块叫“builtin module”)

V8 engine: C++中运行JS , C++的方法与属性暴露给js 使用

事件驱动与事件循环



I/O
PHP是完全同步阻塞的方式
node 异步、非阻塞
同步造成cup等待I/O,比如读取磁盘的一段文件,要在磁盘寻道、读取数据、复制数据到内存这个调用才结束。
数据进内存叫In,出内存叫Out

多线程 单线程
阻塞 非阻塞
同步 异步
多进程 单进程
高效,敏捷,低成本


模块与包管理工具
第一阶段:常常会把非常多复杂的功能 封装成一个个的函数
第二阶段:为了避免全局变量的污染,我们会将单个模块封装到一个对象内部
第三阶段:利用立即执行函数 来达到 不暴露私有成员的目的

模块与包管理工具


模块的分类


模块的流程


模块对象
- 模块对象(module)实际上也是一个文件,表示当前模块文件,是一个js对象。模块对象不是全局的,而是每个模块唯一的
- 模块对象的属性
- module.id,模块的标识符,通常是完全解析后的文件名
- module.loaded 模块是否已经加载完成,或正在加载中 js运行时要先运行模块中的代码,加载完成后再执行其他的
- filename 模块完全解析后的文件名
- parent 调用该模块的模块
- children 被该模块引用的模块对象
- exports 模块的导出对象,默认为空对象

模块导出Module.exports 与 exports
// 准备module对象:
var module = {
id: 'hello',
exports: {}
};
var load = function (module) {
// 读取的hello.js代码:
function greet(name) {
console.log('Hello, ' + name + '!');
}
module.exports = greet;
// hello.js代码结束
return module.exports;
};
var exported = load(module);
// 保存module:
save(module, exported);
你想你的模块是一个特定的类型就用Module.exports。如果你想的模块是一个典型的“实例化对象”就用exports

模块的引用
- 使用require方法来指定加载模块,方法的参数是模块的标识符
- 模块标识符包括
- 核心模块,如http, fs, path等(核心模块不需要写路径,默认路径)
- 文件模块
- 以.或..开始的相对路径
- 绝对路径
- 可以省略文件扩展名后缀.js
- 必须是符合小驼峰命名的字符串
-
安装包模块,如express, colors
- 在全局(npm list -global)或当前应用的node_modules中寻找目录
- 在package.json文件中,寻找main属性所指明的模块入口文件
- 没有package.json文件,以index.js为模块入口文件
- require.resolve()可用来解析模块标识符的绝对路径。

模块的缓存
- 模块在第一次require后会被缓存,多次require不会导致模块的代码被执行多次
- Node模块的缓存不同于浏览器的js缓存,浏览器只缓存文件,Node模块缓存的是编译和执行之后的对象
- require.cache对象代表Node模块缓存区,缓存的模块以属性的方式加入该对象,可以用require.cache[‘模块标识符’]来访问具体的缓存模块,也可以delete该缓存

node包规范
- Node采用包来对一组具有相互依赖关系的模块进行统一管理,封装为独立的复用组件或单个应用
- Node的包通常为一个目录,包括如下内容
- package.json,包的描述文件
- bin目录,用于存放可执行文件和其他二进制文件
- lib目录,用于存放待加载的js文件
- doc目录,用于存放包使用说明的文档
- test目录,用于存放单元测试用例代码文件
- node_modules目录,本地安装的其他第三方包(全局安装的第三方包用npm list -g查询)

package.json
- package.json文件是一个JSON对象
- package.json的主要属性
- name:包名,npm install依赖此名称
- version:版本号,版本号为a,b,c的形式,其中a是大版本号,b是小版本号,c是补丁号
- description:项目描述,npm search会用到
- keywords:关键字,npm search会用到
- main:包输出主入口模块的ID,当包被require时,返回的就是这个模块的导出
- author,contributors:author是一个人,contributors是一组人
- dependents:当前包所依赖的其他包和包的版本
- scripts:指定了运行脚本命令的npm命令行缩写

部分Node核心模块
- console:控制台输入输出
- fs:与文件系统交互(在不同操作系统下是不一样的,node底层有个机制封装,可以使我们用的一样,实现跨平台)
- http:提供HTTP服务器功能
- net:有很多C++的库 提供TCP/IP网络功能
- os:提供了一些操作系统相关的实用方法,比如取cpu、内存的信息
- path:一般和os合起来用 提供了一些操作系统相关的实用方法
- url:解析URL
- querystring:解析URL的查询字符串
- crypto:提供加密和解密功能,基本上是对OpenSSL的包装

模块的使用场景
CommonJS 几乎全都是同步加载
AMD CMD 异步模块定义

运行效果


参考文献
《SQL注入》:http://baike.baidu.com/view/3896.htm
《数据库连接池》:http://baike.baidu.com/view/84055.htm
《segment fault 段异常各种原因》:http://www.myexception.cn/program/972764.html
《crontab命令》:http://baike.baidu.com/view/1229061.htm
《exec与spawn方法的区别与陷阱》:http://blog.csdn.net/bd_zengxinxin/article/details/9044989
《UNICODE,GBK,UTF-8区别》:http://www.cnblogs.com/cy163/archive/2007/05/31/766886.html
《NodeJS笔记:处理非utf8编码(续)》:http://nodejs.lofter.com/post/3c14e_48aee
Node.js的线程和进程: http://www.admin10000.com/document/4196.html
END
Thanks!

node.js 基础
By lenovointer
node.js 基础
- 269