1. Node.js 简介
Node.js 是什么?
Node.js 是一个 JavaScript 执行环境,不是编程语言,类似浏览器内核。它遵循 ES 规范,可以用于执行任何基于 ES 规范实现的语言,例如,typescript 等等。Node.js 基于 Google V8 引擎构建,主要用于创建 Web 服务,用于服务端的 JavaScript 代码运行。
Node.js 也是一个 Web 服务器,与 Tomcat 类似,我们可以在服务器上部署 Node.js,对外提供服务,监听外部请求,处理请求,返回响应结果。
Node.js 服务是单进程应用,不会为每个请求创建新的线程。它使用异步 I/O 避免 JavaScript 运行阻塞以此来提高性能。
它和 JavaScript 的关系
Node.js 最大的贡献在于是前端人员可以使用 JavaScript 来编写服务端代码。并且 Node.js 能够同步支持最新 ES 标准。Node.js 还提供了一套强大的标准库 standary library,其中包含一流的 networking 网络支持。
面向 Node.js 和浏览器编程的区别?
用 JavaScript 写 Node.js 的应用程序和写浏览器上的 Web 应用的区别:
- 在浏览器上,你操作的对象主要是 Dom。而在 Node.js 上没有 Dom,你操作的是系统环境,能访问文件系统,网络等系统功能。
- Node.js 总是能够快速支持最新的 ES 标准,你只要安装最新的版本即可。而浏览器却无法做到这一点。
- Node.js 同时支持 CommonJs 和 ES Module
2. Node.js 的安装
Node.js 当前最新版本 v20 LTS 版本。一般通过 nvm 来安装 node.js,nvm 也是 node.js 版本管理器,可以安装不同的 node.js 版本。
Node.js 的执行环境
两个执行环境:production 和 development。Node.js 默认运行在 development 环境,你可以通过设置环境变量 NODE_ENV=production 来切换环境。当运行在 production 环境时,我们需要保证日志量的最小化,控制日志输出级别。
它是如何工作的
介绍 Node.js 的执行原理,包括请求监听、请求执行。它与 V8 JS engine 的关系,既然 Node.js 提供了异步 I/O,那它这个特性是独立于 V8 执行的吗?还是它有改造 V8?V8 又是如何执行的呢?难道 Node.js 的 I/O 文件模块和 Net 网络模块是独立于 V8 实现的?
V8 是 JIT 即时编译,它将 JS 源码直接编译成目标机器代码,而不是中间代码。V8 是一个 sandbox 环境,只用于执行 JS 代码啊,例如,编译 JS 文件,对象管理,内存管理,垃圾回收等工作,限制了对文件和网络的访问,但是提供了必要的接口。Node.js 基于 V8 提供的接口(JS 到 C++),实现了文件模块、网络模块、事件驱动 三大功能(基于 C++/JS 编写)。从功能性角度上来看,Node.js 对 V8 进行了扩展,完善的 JS 运行时,使 JS 能够运行在服务器上,执行服务端的工作。
基于 Node.js 的 Web 框架
koa,与 SprintBoot 类似。它底层仍然是基于 HTTP 类库,用来处理 HTTP 转发过来的请求,然后响应。类比于,SprintBoot 挂载在 Tomcat 后面一样。
它的优势在哪里
主要相比主流的 Web/应用服务器,例如,tomcat 等,Node.js 的亮点和不一样的点在哪里?它的性能怎么样?应用场景?可以从执行模型上进行对比。
单线程还是多线程?
介绍 Node.js 的执行模型,是单线程还是多线程?异步处理的优势,是否能利用多核的能力。
事件驱动
Node.js 高性能的地方在于它的异步和事件驱动模块,Node.js 中所有的方法都是异步的。那 chrome 用的 V8 是否有使用了事件驱动?
Chrome 浏览器和 Node.js 都实现了事件驱动模块,在 Chrome 中,页面元素是发送对象,事件监听者接收事件。在 Node.js 中,没有页面元素,只有文件、网络,它们作为事件发送者。
相关参考链接
- https://github.com/rogchap/v8go/issues/22
- https://www.knowledgehut.com/blog/web-development/nodejs-and-v8
- https://juejin.cn/post/6844904037335187463
3. NPM 包管理工具
NPM 用来管理你项目中依赖包的下载。npm install 会根据工程中的 package.json 文件,下载文档里定义的所有依赖。所有下载的包都会放到工程目录下的 node_modules 文件。
npm install
package.json 里有两个常见的依赖管理,dependencies 生产环境必须的包 和 devDenpendencies 用于开发环境,不会打包到包里。通过指定 –save-dev 或 -D 可以将不必要的包从 dependencies 剥离出来,减少包的体积。
npm update 会将所有已安装的包更新到最新的版本。不过在项目中,一般不建议使用 update,更多是指定版本。