共计 2363 个字符,预计需要花费 6 分钟才能阅读完成。
封面图片起源:Photo by Claudio Schwarz on Unsplash
本文整顿自我初学 Node.js 时的笔记,用以向对 Node.js 这门语言有趣味的读者简明扼要的介绍 Node.js 是什么,以及该如何学习这门语言。
1. 什么是 Node.js?
Node.js 是 Ryan Dahl 在 2009 年 为了解决 Web 服务器高并发问题 而开发的 基于 Chrome V8 引擎 的 JavaScript 运行时环境。
从这个定义中,能够看到 Node.js 的三个要害特色:
- 目标是 为了解决 Web 服务器高并发问题;
- 根基是 Chrome V8 引擎;
- 实质是 一个 JavaScript 运行时环境;
因而,要搞清楚什么是 Node.js,首先就要搞清楚以上三个要害特色。
1.1 Node.js 三个要害特色
1.1.1 为了解决 Web 服务器高并发问题
Ryan Dahl 在设计 Node 之前,始终致力于解决 Web 服务器高并发引起的性能问题,依据工作教训,他认为性能问题的瓶颈在于阻塞的 I/O 操作。恰逢 Chrome 推出了高性能的 V8 引擎,Ryan Dahl 认为 JavaScript 人造的异步,事件委托机制以及 JavaScript 语言在服务端无历史包袱的个性,非常适合通过 异步流程管制 的形式晋升大型分布式系统性能。于是,Node.js 应运而生。
只管当初 Node.js 曾经被利用于各种各样的场景。然而咱们始终应该意识到,了解 Node.js 的 异步流程管制原理 才算是把握了 Node.js 的外围。
1.1.2 Chrome V8 引擎
Chrome 内核基于 WebKit,分为以下两个引擎:
- 渲染引擎:Web Core;
- JavaScript 解释引擎:JavaScript Core;
而 Google 因为不称心 JavaScript Core 的性能,于是自主研发了性能更好的 V8 引擎予以取代。
作为 JavaScript 的解释引擎,V8 引擎的次要作用在于:
- 解释与编译 JavaScript;
- 堆治理;
- 解决内存垃圾回收;
- 解决内存调配;
- …
能够说,V8 引擎提供了一个高性能的 JavaScript 执行环境,因此 JavaScript 可能有短缺的底气在各平台(浏览器,服务端,桌面端)运行。
1.1.3 JavaScript 运行时环境
Node.js 既不是一门语言(JavaScript),也不是一个框架(React,Koa),而是一个 JavaScript 运行时环境。
那么什么是 JavaScript 运行时环境 呢?顾名思义,是一个能够运行 JavaScript 的 环境 。那么这里的 环境 是指什么呢?次要蕴含以下两个方面:
- 提供了解释,编译 JavaScript 的底层能力;
- 提供了一系列接口,使开发者能够通过 JavaScirpt 调用零碎底层能力(例如网络,文件读写等);
前者是由 Chrome V8 引擎提供的,而后者则是由一个底层由 C,C++ 编写的高性能的事件驱动的异步 I/O 库 libuv
所提供。
1.2 libuv
libuv
是一个跨平台的,事件驱动的异步 I/O 库,为 Node 提供了 CPU 和操作系统层面的性能。咱们晓得不同的操作系统调度硬件的形式不同,CPU 的指令集也各有差别。libuv
则抹平了这一差别,通过名为 Node Bindings
的模块,向用户裸露了对立的零碎操作接口。
因而当初咱们能够说,Node 实际上由两局部组成:Chrome V8 引擎以及 libuv
。这两层暗藏在 Node Bindings
之下,而用户面向 Node Bindings
进行编程。
至此,你应该了解了什么是 Node.js。它是一个跨平台的 JavaScript 可执行环境,在这个环境中,你能够应用 JavaScript 充分调动操作系统的能力,做你想做的任何事!
2. Node.js 的哲学
要充沛的了解 Node.js,除了前文提到的 异步流程管制原理 之外,咱们还须要理解下 Node.js 从开创到倒退所彰显的设计哲学,这有利于咱们更喜爱 Node.js 生态。
我认为 Node.js 有以下三大特点:
- 凋谢;
- 专一;
- 简洁;
让我别离解释。
2.1 凋谢
Node.js 在设计之初,就保持将外围库做的足够小,以便让充分发挥社区的创造性,让所有搭建大型零碎的构建都尽可能来源于社区,因而每个构件都能够疾速试错和迭代。不得不说,这种做法尽管有显得有些偷懒,然而事实证明这种对社区的信赖,和凋谢的态度播种了微小的回报:Node.js 领有了全世界最沉闷也是最大的社区和包治理平台 npm
。
2.2 专一
Node 社区的开发者始终保留着一个默契,将包的性能束缚的足够窄,最好一次只做好一件事,并对外裸露繁多的接口。这样包的开发,设计,测试就会变得更加简略,包也就更加牢靠。这种专一,也同时体现了开发者们的谦虚以及效率至上。
2.3 简洁
Node 包通常只裸露繁多模块和接口,并继承了 JavaScript 的简洁特点,应用简略的数据结构。这使得 Node 包易于浏览和了解。
3. 前端开发者如何学习 Node.js?
对于从未涉足过服务端开发的前端开发者而言,以下几点是学习 Node 过程中必须补足的常识:
- 对 JavaScript 语言个性(特地是 ESNext),语法的深刻了解;
- 数据库常识与数据表设计能力;
- 零碎架构能力;
而学习 Node.js 则能够分为两个局部:
- 学习 Node.js 的外围库的应用;
- 学习相干 Web 框架的应用;
在整个学习过程中,倡议采纳以下四步学习:
- 浏览官网文档;
- 撰写 Demo 相熟语法验证思路;
- 在此过程中一直地问本人问题,并深刻调研失去答案;
- 通过对外输入,分享所得加深本人的印象;
4. 小结
Node.js 在现在曾经是每一位前端开发者必须把握的技术,它通过 libuv 向前端开发者凋谢了操作系统层面的底层能力,让开发者可能全面应用计算机的算力和性能。并让用一种语言解决 Web 利用开发的所有问题的想法成为可能。心愿通过本文的介绍,您可能对 Node.js 产生好奇,祝您在将来的摸索旅途中,过得欢快。