目录
- 定义
- 架构
- 应用场景
- 安装
- 版本工具
- 代码执行
- REPL
- 传递参数
- 输出
- 全局对象
定义
Node.js 是一个基于 V8 JavaScript 引擎构建的运行时环境,允许你在服务器端运行 JavaScript 代码。Node.js 允许开发者使用 JavaScript 编写服务器端代码,实现前后端代码的统一,大大简化了全栈开发的流程,现在已经成为全栈开发中非常流行的一部分
也就是说Node.js基于V8引擎来执⾏JavaScript的代码,但是不仅仅只有V8引擎:
-  我们知道 V8可以嵌⼊到任何C++应⽤程序中,无论是Chrome还是Node.js,事实上都是嵌⼊了V8引擎来执⾏JavaScript代码
-  但是在 Chrome浏览器中,还需要解析、渲染HTML、CSS等相关渲染引擎,另外还需要提供⽀持浏览器操作的API、浏览器⾃ ⼰的事件循环等
-  在 Node.js中我们也需要进行⼀些额外的操作,⽐如⽂件系统读/写、⽹络IO、加密、压缩解压⽂件等操作
架构
我们看下浏览器架构和Node架构的区别:

我们编写的JavaScript代码会经过V8引擎,再通过Node.js的Bindings,将任务放到Libuv的事件循环中,
 libuv(Unicorn Velociraptor—独角伶盗龙)是使用C语言编写的库,提供了事件循环、文件系统读写、网络IO、线程池等等内容

应用场景
-  应用一:目前前端开发的库都是以 node包的形式进行管理
-  应用二: npm、yarn、pnpm工具成为前端开发使用最多的工具
-  应用三:越来越多的公司使用 Node.js作为web服务器开发、中间件、代理服务器
-  应用四:大量项目需要借助 Node.js完成前后端渲染的同构应用
-  应用五:资深前端工程师需要为项目编写脚本工具(前端工程师编写脚本通常会使用 JavaScript,而不是Python或者shell)
-  应用六:很多企业在使用 Electron来开发桌面应用程序
安装
Node.js是在2009年诞生的,目前最新的版本是分别是LTS v20.17.0以及Current v22.9.0
- LTS版本:(- Long-term support, 长期支持)相对稳定一些,推荐线上环境使用该版本
- Current版本:最新的- Node版本,包含很多新特性,平常学习使用可以选择- current版本
Node的安装方式有很多:
- 可以借助于一些操作系统上的软件管理工具,比如Mac上的homebrew,Linux上的yum、dnf等
- 可以官网直接下载对应的安装包 
  -  window选择.msi安装包,Mac选择.pkg安装包,Linux会在后续部署中讲解
-  安装过程中会配置环境变量(让我们可以在命令行使用) 
-  并且会安装 npm(Node Package Manager)工具
 
-  
版本工具
如果你希望可以快速更新或切换node多个版本时,可以借助于一些工具:下面两个工具都不支持window
- nvm:Node Version Manager
- n:Interactively Manage Your Node.js Versions(交互式管理你的- Node.js版本)
针对nvm,在GitHub上有提供对应的window版本:https://github.com/coreybutler/nvm-windows
-  nvm install latest安装最新的node版本
-  nvm list展示目前安装的所有版本
-  nvm use切换版本
n的使用:使用时前面添加的sudo是因为权限问题
-  npm i -g n:直接使用npm安装即可
-  n --version:安装成功会显示版本
-  n lts:安装最新node的lts版本
-  n latest:安装node最新版本
-  n:查看你安装的所有版本
-  n i version:version替换成你要安装的node版本,就会安装这个版本
-  n use version:version替换成你要使用的node版本,就会使用这个版本
代码执行
我们编写一个js文件,里面存放JavaScript代码,目前我们知道有两种方式可以执行
- 将代码交给浏览器执行: 
  -  需要通过让浏览器加载、解析 html代码,所以我们需要创建一个html文件
-  在 html中通过script标签,引入js文件
-  当浏览器遇到 script标签时,就会根据src加载、执行JavaScript代码
 
-  
- 将代码载入到node环境中执行:进入到文件所在目录,使用命令行node 文件名就可以执行,tab键可以补全文件名-  首先电脑上需要安装 Node.js环境,安装过程中会自动配置环境变量
-  可以通过终端命令 node js文件名的方式来载入和执行对应的js文件
 
-  
REPL
REPL是Read-Eval-Print Loop的简称,翻译为“读取-求值-输出”循环,是一个简单的、交互式的编程环境
- 事实上,我们浏览器的console就可以看成一个REPL
- Node也给我们提供了一个- REPL环境,我们可以在其中演练简单的代码

传递参数
正常情况下执行一个node程序,直接跟上我们对应的文件即可:node node.js
但在某些情况下执行node程序的过程中,我们可能希望给node传递一些参数:node node.js env=development 30 40
- 获取参数其实是在process的内置对象中,它包含版本、操作系统等,而我们的参数在argv中,它是一个数组,我们来看下面练习代码:
// node.js文件
function add(num1, num2) {
  return num1 + num2;
}
console.log("add函数结果:", add(10, 20));
console.log("process.argv:", process.argv);
argv打印结果如下:

为什么叫argv呢?
- argc:- argument counter的缩写,传递参数的个数
- argv:- argument vector(向量、矢量)的缩写,传入的具体参数- vector翻译过来是矢量的意思,在程序中表示的是一种数据结构
- 在C++、Java中都有这种数据结构,是一种数组结构
- 在JavaScript中也是一个数组,里面存储一些参数信息
 
输出
-  console.log:最常用的输入内容的方式
-  console.clear:清空控制台
-  console.trace:打印函数的调用栈
-  还有一些其他的 console方法:https://nodejs.org/dist/latest-v16.x/docs/api/console.html
全局对象
Node中给我们提供了⼀些全局对象,⽅便我们进行⼀些操作:某些全局对象并不常⽤,某些我们深入学习node的时候再去理解
-  特殊的全局对象:这些全局对象实际上是模块中的变量,只是每个模块都有,看来像是全局变量,包括: __dirname、__filename、exports、module、require()-  __dirname:获取当前⽂件所在的路径,不包括后⾯的⽂件名
-  __filename:获取当前⽂件所在的路径和⽂件名称,包括后⾯的⽂件名称
-  后面三个在模块化中讲解具体学习这篇文章:待后面补充 
  
 
-  
-  常见的全局对象: -  process对象:process提供了Node进程中相关的信息⽐如 Node的运⾏环境、参数信息等;
 后⾯在项⽬中,会学习如何将⼀些环境变量读取到process的env中
  
-  console对象:提供了简单的调试控制台
-  定时器函数:在 Node中使⽤定时器有好⼏种⽅式setTimeout(callback, delay, args):callback在delay毫秒后执⾏⼀次setInterval(callback, delay, args):callback每delay毫秒重复执⾏⼀次setImmediate(callback, args):callback I/O事件后的回调的“⽴即”执⾏,后面事件循环中具体讲解process.nextTick(callback, args):添加到下⼀次tick队列中,后面事件循环中具体讲解
-  global对象:事实上前面的process、console、setTimeout等都有被放到global中在新的标准中还有⼀个 globalThis,因为在浏览器中全局对象是window,在node中全局对象是global,所以在新的标准中就统一了一个globalThis
  在浏览器中执⾏的 JavaScript代码,如果我们在顶级范围内通过var定义的⼀个属性,默认会被添加到window对象上但是在 node中,我们通过var定义⼀个变量,它只是在当前模块中有⼀个变量,不会放到全局中
 
-  


















