【番外篇】node.js

192 阅读2分钟

有些比较琐碎的知识点,这里再整理下:)

模块加载机制

模块的类型

  • node内置的核心模块(http\fs\net\vm)
  • 第三方的文件模块(npm安装、本地文件模块)

模块加载 require()

  • 加载模块名:首先先查找同名内置核心模块,如果没有则查找 node_modules 目录加载模块
    require('koa')
    
    当 require 遇到一个既不是核心模块,又不是以路径形式表示的模块名称时,会试图在当前目录下的 node_modules 目录中来查找是不是有这样一个模块。如果没有找到,则会在当前目录的上一层中的 node_modules 目录中继续查找,反复执行这一过程,直到遇到根目录为止
  • 按路径加载,在不显式指定文件模块扩展名的时候,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更善于处理那些逻辑简单但访问频繁的任务,而不适合完成逻辑十分复杂的工作