Nodejs 基础
什么是nodejs
- Node.js 不是变成语言, 只是javascript的一个编译环境, 我们在这个环境里还是写javascript
- 之前的javascript是依托于浏览器存在的, 无法单独运行,js缺少一些I/O操作
- Node里有 模块化的 概念 Node把每一类功能都封装成了一个模块(文件) node里采用了CommonJS规范
- Node为我们提供了 npm(包管理器). 可以让我们快速方便的管理第三方库
- 喜欢处理高并发, 低逻辑运算的请求
nodejs的特点
-
非阻塞式的异步的I/O
例子: 访问数据库, 需要一段时间, 在传统单线程处理机制中, 该线程在处理数据库的操作时, 整个线程停下来, 一直等着从数据库里取出数据, 然后后面的代码才继续执行, 也就是说, I/O是阻塞的, 效率比较低
Node也是单线程, 但是node在执行一个需求时, 比方访问数据库, 将立刻执行后面的代码, 把数据库执行完成之后取回的结果放进回调函数里, 提高效率
1个厨师:
传统厨师, 6个人排队点饭, 厨师听了第一个人的需求就先去做第一个人的饭了, 后面5个人只能排队等着, 阻塞
node厨师, 6个人点饭, 厨师一个一个问一遍需求, 然后这些人可以不用排队继续做自己的事情去, 等到对应的饭做好之后, 厨师喊号.
-
单线程, 异步回调
java, php, .net 这些服务端的语言, 会为每一个请求开辟一个线程, 大概每个线程需要消耗2M的空间, 理论上, 8G的服务器允许同时连接4000个请求, 如果要支持更多的用户, 增加服务器数量, 成本问题
Node不会为每个请求开辟一个线程, 而仅仅使用一个线程, 当有用户连接时, 触发一个内部事务, 通过非阻塞式的I/O和回调函数保证事件的执行. 理论上一个8G的服务器, 可以同时支持4万个用户连接
-
事件驱动
因为node是单线程, 所以, node采用的是事件循环机制. 内部拥有个infinity loop, 每当有新的连接进来时, node会将其放进事件循环, 单线程执行完一个, 从循环里再取出一个
-
兼容性好,跨平台
单线程的弊端
- 无法充分利用多核cpu
- 因为是单线程, 如果有错误, 会导致整个应用退出
- 大量计算的需求, 会导致node的延迟