Node.js 入门前言
去年9月份左右的前端学习Ajax时,始终不明白为什么发送一段http请求,就能获取数据,这个数据是从哪来的,怎么设计这个数据的接口,我一直很好奇,于是在晚上查找资料了解到了Node.js这个东西,知道了用它这个环境能够用JS去写后台,于是我为了弄清楚前后端分离联调这个过程,学习了Node.js的相关知识,做了一些笔记如:
Node.js是什么
官方定义:Node.js是一个基于V8的JavaScript引擎的JavaScript运行时环境
原话:(Node.js is a JavaScript runtime biilt on Chrome’s V8 JavaScript engine).
- 也就是说Node.js基于V8引擎来执行JavaScript的代码,但是不仅仅只有V8引擎
- V8可以嵌入到任何c++应用程序中,无论是Chrome还是Node.js,事实上都是嵌入了v8引擎来执行JavaScript代码
- 但是在Chrome浏览器中,还需要解析、渲染HTML、CSS等相关渲染引擎,另外还需要提供支持浏览器操作的API、浏览器自己的事件循环等
- 另外,在Node.js中我们也需要进行一些额外的操作,比如文件系统读/写、网络IO、加密、压缩解压文件等操作
Node.js架构
- JS代码会经过V8引擎,在通过Node.js的Bindings,将任务放到Libuv的时间循环中
- libuv是使用C语言编写的库
- libuv提供了事件循环,文件系统读写,网络IO、线程池等等内容
Node的应用场景
Node.js现在是企业快速发展下对高级前端工程师的基本要求,在实习或秋招中通常也会对大家的Node.js有一定要求,所以Node.js或多或少都是有所了解。
- 前端开发的库都是以node包的形式进行管理
- npm、yarn、pnpm工具成为前端开发使用最多的工具
- 越来越多的公司使用Node.js作为web服务器开发、中间件、代理服务器
- 大量项目需要借助Node.js完成前后端渲染的同构应用
- 资深前端工程师需要为项目编写脚本工具(前端工程师编写脚本通常会使用JavaScript,而不是Python或者shell)
- 很多企业在使用Electron来开发桌面应用程序
Node的安装和管理
Node.js安装
安装LTS版本,区别:
- LTS版本: (Long-term support,长期支持)相对稳定一些,推荐线上环境使用该版本
- Current版本:最新的Node版本,包含很多新特性
- 安装过程全程下一步
Node版本工具
- nvm,(Windows安装比较麻烦,Mac简单)
安装nvm后,几个命令
- nvm install latest 安装最新的node、
- nvm list 展示目前安装的所有版本
- nvm use 切换版本
Node.js中执行JavaScript代码
如果我们编写一个js文件,里面存放JavaScript代码,如何来执行它呢?目前我们知道有两种方式可以执行:
- 将代码交给浏览器执行
- 将代码载入到node环境中执行
如果我们希望把代码交给浏览器执行:
- 需要通过让浏览器加载、解析html代码,所以我们需要创建一个html文件
- 在html中通过script标签,引入js文件
- 当浏览器遇到script标签时,就会根据src加载、执行JavaScript代码
如果我们希望把js文件交给node执行
- 首先电脑上需要安装Node.js环境,安装过程中会自动配置环境变量
- 可以通过终端命令node js文件的方式来载入和执行对应的js文件
正常情况下执行一个node程序,直接跟上我们对应的文件即可
node index.js
但是,在某些情况下执行node程序的过程中,我们可能希望给node传递一些参数
node index.js 123123
如果我们这样来使用程序,就意味着我们需要在程序中获取到传递的参数
- 获取参数其实是在process的内置对象中的;
- 如果我们直接打印这个内置对象,它里面包含特别的信息:
√其他的一些信息,比如版本、操作系统等大家可以自行查看,后面用到一些其他的我们还会提到现在 - 我们先找到其中的argv属性:
我们发现它是一个数组,里面包含了我们需要的参数;
有个疑问,为什么叫argv呢?
在C/C++程序中的main函数中,实际上可以获取到两个参数:
- argc: argument counter的缩写,传递参数的个数;
- argv: argument vector(向量、矢量)的缩写,传入的具体参数。
- vector翻译过来是矢量的意思,在程序中表示的是一种数据结构。
- √在C++、Java中都有这种数据结构,是一种数组结构
- 在JavaScript中也是一个数组,里面存储一些参数信息
我们可以在代码中,将这些参数信息遍历出来,使用:
Node的输入和输出
- console.log()打印
- console.log()清空控制台
Node的全局对象
类似于window的全局对象
console.log(global)
特殊的全局对象
模块中的变量,只是每个模块都有,看起来像是全局变量
- __dirname 获取当前文件所在路径(两个横线)
- __filename 获取当前文件所在的路径和文件名称
常见的全局对象
- process 提供了Node进程中相关的信息
- 比如Node的运行环境,参数信息等
- console对象 提供了简单的调试控制台
- 定时器函数
- setTimeout: callback在delay毫秒后执行一次
- setInterval: callback在delay毫秒后重复执行
- setImmediate: callback I/O事件后的回调的立即执行
- process.nextTick: 添加到下一次tick队列中