内容1.Node简介2.模块机制3.异步I/O4.异步编程5.内存控制6.理解Buffer7.网络编程8.构建Web应用9.玩转进程10.测试11.产品化一、Node简介1.Node的特点异步I/O事件与回调函数单线程 弱点: 1)无法利用多核CPU 2)错误会引起整个应用退出,应用的健壮性值得考验。 3)大量计算占用CPU导致无法继续调用异步I/O。跨平台2.Node的应用场景I/O密集型是否不擅长CPU密集型业务与遗留系统和平共处分布式应用3.Node的使用者前后端编程语言环境统一Node带来的高性能I/O用于实时应用并行I/O使得使用者可以更高效地利用分布式环境并行I/O,有效利用稳定接口提升Web渲染能力云计算平台提供Node支持游戏开发领域。工具类应用二、模块机制1.CommonJs规范主要分为以下三个部分模块引用require()方法接受模块标识,以此引入一个模块的API到当前上下文中 var math=require(‘math’);模块定义 exports对象用于导出当前模块的方法或变量,并且它是唯一导出的出口。 module对象,它代表模块本身,exports是module的属性。 在node中,一个文件就是一个模块,将方法挂载在exports对象上作为属性即可定义导出的方式//math.jsexports.add=function(){ return ‘aaaa’}// program.jsvar math=require(‘math’);var a=math.add();//aaa模块标识模块标识就是传递给require()方法的参数,它必须是符合小驼峰命名的字符串,或者以.、..开头的相对路径,或是绝对路径,可以没有文件名后缀.js2.Node的模块实现在node中引入模块,需要经历如下三个步骤路径分析文件定位编译执行模块分为两类:核心模块:node提供的模块。在node源代码的编译过程中,编译进了二进制执行文件,加载速度快。文件模块:用户编写的模块。运行时动态加载,速度比较慢。1)优先从缓存中加载node 对引入过的模块都会进行缓存,以减少二次引入时的开销,缓存的是编译和执行之后的对象 require()方法对相同的模块二次加载都一律采用缓存优先的方式,核心模块的检查先于文件模块的缓存检查2)路径分析和文件定位模块标识符分析:加载速度:核心模块 > 路径形式的文件模块 > 自定义模块文件定位:文件扩展名分析:如果标识符中不包含文件扩展名,则按.js 、.json 、.node 的次序补足扩展名。目标分析和包:如果没有查找到对应文件,但却得到一个目录,此时node会将目录当做一个包来处理3)模块编译对于不同的文件扩展名,载入方法不同,具体如下:.js文件:通过fs模块同步读取文件后编译执行.node文件:这是用C/C++编写的扩展文件,通过dlopen()方法加载最后编译生成的文件.json文件:通过fs模块同步读取文件后,用JSON.parse()解析返回结果其余扩展文件。它们都被当做.js文件载入require.extensions:获取系统中已有的扩展加载方式。编译方式:JavaScript模块的编译: 在编译过程中,对js内容进行了包装 执行之后,exports属性被返回了调用方,被外部调用 (function(exports,require,module,__filename,__dirname){ // 内容 var math=require(’./math’); var a=math.add();})C/C++模块的编译调用dlopen()方法进行加载和执行JSON文件的编译通过fs模块同步读取文件后,用JSON.parse()得到对象,然后将它赋给模块对象的exports,以供外部调用3.核心模块核心模块分为两部分:C/C++编写(文件放在Node项目的src目录下),JavaScript编写(文件放在Node项目的lib目录下)。1)JavaScript核心模块的编译过程4.C/C++扩展模块5.模块调用栈6.包与NPM7.前后端共用模块