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 engineisolate, 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

execspawn方法的区别与陷阱》: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!

Made with Slides.com