有些比较琐碎的知识点,这里再整理下:)
模块加载机制
模块的类型
- node内置的核心模块(http\fs\net\vm)
- 第三方的文件模块(npm安装、本地文件模块)
模块加载 require()
- 加载模块名:首先先查找同名内置核心模块,如果没有则查找 node_modules 目录加载模块
当 require 遇到一个既不是核心模块,又不是以路径形式表示的模块名称时,会试图在当前目录下的 node_modules 目录中来查找是不是有这样一个模块。如果没有找到,则会在当前目录的上一层中的 node_modules 目录中继续查找,反复执行这一过程,直到遇到根目录为止require('koa') - 按路径加载,在不显式指定文件模块扩展名的时候,Node.js 会分别试图加上 .js、.json 和 .node扩展名
加载缓存
- Node.js 对于已经加载过的文件模块,会缓存在内存中,以后多次require引用时,直接从内存中获取
- 通过文件名缓存所有加载过的文件模块,而不是 require() 提供的参数缓存的,也就是说即使你分别通过 require('express') 和 require('./node_modules/express') 加载两次,也不会重 复加载,因为尽管两次参数不同,解析到的文件却是同一个
Node.js应用部署
- 故障恢复的能力
- 日志(访问日志与 错误日志)
- 利用多核提升性能
- 共享同一端口(设置web服务器反向代理+虚拟主机)
server { listen 80; server_name mysite.com; #虚拟主机名 location / { proxy_pass http://localhost:3000; #设置反向代理 } } - 提供自动重启服务的能力(代码有部署更新时,无需手动重启)
Node.js不适合做的服务
- 计算密集型的服务:node.js单线程+事件驱动的异步编程方式,当遇到计算量很大的事件时,往往会阻塞队列中后续的响应事件,对于多核资源利用效率不高
- 单用户多任务型应用:需要同时执行多个任务在多个进程时,多进程之间的协作不够便捷
- 逻辑十分复杂的事务:对于线性且多步骤复杂的操作,其中一个步骤失败都需要回滚到最初状态。Node.js更善于处理那些逻辑简单但访问频繁的任务,而不适合完成逻辑十分复杂的工作