node.js详解

本文涉及的产品
云解析 DNS,旗舰版 1个月
云解析DNS,个人版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: node.js详解

1.Node.js概述

1.1 为什么JavaScript可以在浏览器中被执行

(1)浏览器中有JavaScript 的解析引擎:

Chrome 浏览器 => V8

Firefox 浏览器 => OdinMonkey(奥丁猴)

⚫ Safri 浏览器

IE 浏览器

⚫ etc…

(2)其中,Chrome 浏览器的V8 解析引擎性能最好

1.2 为什么JavaScript可以操作DOM和BOM

每个浏览器中都内置了DOM、BOM 这样的API 函数,因此,浏览器中的JavaScript 可以调用它们

1.3 浏览器中的JavaScript运行环境

(1)解析引擎(V8)负责解析和执行JavaScript 代码。

(2)内置API(如BOM、DOM) 是由运行环境(指浏览器)提供的特殊接口,只能在所属的运行环境中被调用。

1.4 什么是Node.js

(1)浏览器是JavaScript 的前端运行环境;Node.js 是 JavaScript 的后端运行环境。脱离浏览器环境也可以运行JavaScript,只要有JavaScript引擎就可以

(2)Node.js是一个基于Chrome V8引擎的JavaScript运行环境,即:Node.js内置了Chrome的V8引擎,可以在Node.js环境中直接运行JavaScript程序

(3)Node.js通常会被作一个BFF层,即Backend For Frontend(服务于前端的后端),通俗的说是一个专门用于为前端业务提供数据的后端程序

1.5 在Node.js中写JavaScript和在Chrome浏览器中写JavaScript区别

(1)Node.js没有浏览器API,即document,window等。Node.js 中无法调用DOM 和BOM 等浏览器内置API。

(2)Node.js 没有浏览器安全级别的限制,提供很多系统级别的API,,文件的读写 (File System),进程的管理 (Process),网络通信 (HTTP/HTTPS)

1.6 Node.js 可以做什么

Node.js 作为一个 JavaScript 的运行环境,仅仅提供了基础的功能和API。然而,基于Node.js 提供的这些基础功能,出现了很多强大的工具和框架

①基于Express 框架可以快速构建Web 应用

②基于Electron框架可以构建跨平台的桌面应用

③基于restify框架可以快速构建API 接口项目

④读写和操作数据库、创建实用的命令行工具辅助前端开发

1.7 在 Node.js 环境中执行 JavaScript 代码

(1)打开终端

(2)进入js文件所在的目录,输入命令:node js文件

2.fs文件系统模块

(1)fs 模块是 Node.js 官方提供的、用来操作文件的模块。它提供了一系列的方法和属性,用来满足用户对文件的操作需求。

(2)如果要在JavaScript 代码中,使用fs 模块来操作文件,则需要使用如下的方式先导入它:

const fs = require('fs')

2.1 读取指定文件中的内容

(1)fs.readFile() 的语法格式

①参数1:必选参数,字符串,表示文件的路径。

②参数2:可选参数,表示以什么编码格式来读取文件。一般指定utf-8

③参数3:必选参数,文件读取完成后,通过回调函数拿到读取的结果。

函数中有两个参数err和dataStr分别表示读取失败和成功的结果

(2)示例

const fs = require('fs')
fs.readFile('./test.txt','utf-8',function(err,dataStr){
    console.log(dataStr)
    console.log(err)
})

(3)如果读取成功,则err的值为null;如果读取失败,则err的值为错误对象,dataStr的值为undefined

2.2 向指定的文件中写入内容

(1)使用fs.writeFile() 方法,可以向指定的文件中写入内容,语法格式如下

①参数1:必选参数,需要指定一个文件路径的字符串,表示文件的存放路径。

②参数2:必选参数,表示要写入的内容。

③参数3:可选参数,表示以什么格式写入文件内容,默认值是utf8。

④参数4:必选参数,文件写入完成后的回调函数

(2)判断文件是否写入成功:

可以判断err 对象是否为null,从而知晓文件写入的结果

2.3 fs 模块- 路径动态拼接的问题

(1)在使用fs 模块操作文件时,如果提供的操作路径是以./ 或…/ 开头的相对路径时,很容易出现路径动态拼接错误的问题。

(2)原因:代码在运行的时候,会以执行node 命令时所处的目录,动态拼接出被操作文件的完整路径。

(3)解决方案:在使用fs 模块操作文件时,直接提供完整的路径,不要提供./ 或…/ 开头的相对路径,从而防止路径动态拼接的问题。

3.path路径模块

3.1 什么是path 路径模块

(1)path 模块是Node.js 官方提供的、用来处理路径的模块。它提供了一系列的方法和属性,用来满足用户对路径的处理

(2)如果要在JavaScript 代码中,使用path 模块来处理路径,则需要使用如下的方式先导入它:

3.2 path 路径模块的使用

(1)path.join()

①路径拼接,把多个路径片段拼接为完整的路径字符串

②语法格式使用path.join() 方法,可以把多个路径片段拼接为完整的路径字符串,语法格式如下:

③代码示例:

(2)path.basename()

①可以从一个文件路径中,获取到文件的名称部分

②语法:

a.path:必选参数,表示一个路径的字符串

b.ext:可选参数,表示文件扩展名。结果会只保留文件名,去掉扩展名

③代码示例

(3)path.extname()

①获取路径中的扩展名部分

②代码示例

4.http 模块

4.1 什么是http 模块

(1)在网络节点中,负责消费资源的电脑,叫做客户端;负责对外提供网络资源的电脑,叫做服务器。

(2)http 模块是 Node.js 官方提供的、用来创建web 服务器的模块。通过http 模块提供的http.createServer() 方法,就能方便的把一台普通的电脑,变成一台Web 服务器,从而对外提供Web 资源服务。

4.2 创建web服务器的基本步骤

(1)如果要希望使用http 模块创建Web 服务器,则需要先导入http 模块

(2)调用http.createServer() 方法,创建web服务器实例

(3)为服务器实例绑定request 事件,即可监听客户端发送过来的网络请求:

(4) 启动服务器:调用服务器实例的.listen() 方法,即可启动当前的web 服务器实例:

(5)使用node命令启动该js文件

4.3 req 请求对象和res 响应对象

(1)req 请求对象

只要服务器接收到了客户端的请求,就会调用通过server.on() 为服务器绑定的request 事件处理函数。

如果想在事件处理函数中,访问与客户端相关的数据或属性,可以使用如下的方式

(2) res 响应对象

在服务器的request 事件处理函数中,如果想访问与服务器相关的数据或属性,可以使用如下的方式:

(3)解决中文乱码问题

当调用res.end() 方法,向客户端发送中文内容的时候,会出现乱码问题,此时,需要手动设置内容的编码格式:

5. Node.js 模块化

(1)什么是模块化与模块 ?

①将一个复杂的程序文件依据一定规则拆分成多个文件的过程称之为 模块化

②其中拆分出的 每个文件就是一个模块 ,模块的内部数据是私有的,不过模块可以暴露内部数据以便其他

模块使用

(2)什么是模块化项目?

编码时是按照模块一个一个编码的,整个项目就是一个模块化的项目

(3)模块化好处

①防止命名冲突

②高复用性

③高维护性

5.1 Node.js 中模块的分类

Node.js 中根据模块来源的不同,将模块分为了3 大类,分别是:

⚫内置模块(内置模块是由Node.js 官方提供的,例如fs、path、http 等)

⚫自定义模块(用户创建的每个.js 文件,都是自定义模块)

⚫第三方模块(由第三方开发出来的模块,并非官方提供的内置模块,也不是用户创建的自定义模块,使用前需要先下载)

5.2 加载模块

注意:使用require() 方法加载其它模块时,会执行被加载模块中的代码

5.3 Node.js 中的模块作用域

(1)什么是模块作用域

和函数作用域类似,在自定义模块中定义的变量、方法等成员,只能在当前模块内被访问,这种模块级别的访问限制,叫做模块作用域。

(2)模块作用域的好处:防止了全局变量污染的问题

5.4 向外共享模块作用域中的成员

在每个.js 自定义模块中都有一个module 对象,它里面存储了和当前模块有关的信息,打印如下

5.4.1 模块初体验

(1)创建me.js

//声明函数
function tiemo(){
  console.log('贴膜....');
} 
//暴露数据
module.exports = tiemo;

(2)创建index.js

//导入模块
const tiemo = require('./me.js');
//调用函数
tiemo();

5.4.2 暴露数据

模块暴露数据的方式有两种:

(1)module.exports = value

(2)exports.name = value

由于module.exports 单词写起来比较复杂,为了简化向外共享成员的代码,Node 提供了exports对象。默认情况下,exports 和module.exports 指向同一个对象。最终共享的结果,还是以module.exports指向的对象为准

(3)使用时有几点注意:

①module.exports 可以暴露 任意 数据

②不能使用 exports = value 的形式暴露数据,因为模块内部 module 与 exports 的隐式关系exports = module.exports = {} ,require 返回的是目标模块中 module.exports 的值

5.4.3 导入(引入)模块

在模块中使用 require 传入文件路径即可引入文件

const test = require('./me.js');

require 使用的一些注意事项:

(1)对于自己创建的模块,导入时路径建议写 相对路径,且不能省略 ./ 和 …/

(2)js 和 json 文件导入时可以不用写后缀,c/c++编写的 node 扩展文件也可以不写后缀,但是一

般用不到

(3)如果导入其他类型的文件,会以 js 文件进行处理

(4)如果导入的路径是个文件夹,则会 首先 检测该文件夹下 package.json 文件中 main 属性对应

的文件

①如果存在则导入,反之如果文件不存在会报错。

②如果 main 属性不存在,或者 package.json 不存在,则会尝试导入文件夹下的 index.js 和

index.json

③如果还是没找到,就会报错

(5)导入 node.js 内置模块时,直接 require 模块的名字即可,无需加 ./ 和 …/

5.5 Node.js 中的模块化规范

Node.js 遵循了 CommonJS 模块化规范,CommonJS 规定了模块的特性和各模块之间如何相互依赖。

CommonJS 规定:

① 每个模块内部,module 变量代表当前模块。

② module 变量是一个对象,它的exports 属性(即module.exports)是对外的接口。

③ 加载某个模块,其实是加载该模块的module.exports 属性。require() 方法用于加载模块

6. BFF

(1)BFF 解决什么问题

①一个前端页面向 Service A、Service B 以及 Service C发送请求,不同的微服务返回的值用于渲染页面中不同的组件。此时,每次访问该页面都需要发送 3 个请求。我们需要一个服务来聚合Service A、Service B 以及 Service C响应的数据,这个服务层叫做BFF。

②手机、平板端、PC机等用户终端都需要向每个Service,例如Service A发送请求。对于同一个功能,不同的终端需要的数据格式和内容会有不同。此时 Service A 的一个接口,不能同时满足三个客户端的不同需求。我们可以在Service A中开发三个接口,也可以增加一个数据裁剪服务,将数据按照不同终端的不同要求进行裁剪,这个服务层叫做BFF。

7.包管理工具

(1)包是什么

Node.js 中第三方模块和包指的是同一个概念,只不过叫法不同。包是基于内置模块封装出来的,提供了更高级、更方便的API,极大的提高了开发效率。

(2)包管理工具

①管理『包』的应用软件,可以对「包」进行 下载安装 ,更新,删除 ,上传 等操作

②借助包管理工具,可以快速开发项目,提升开发效率

③包管理工具是一个通用的概念,很多编程语言都有包管理工具,所以 掌握好包管理工具非常重要

(3)常用的包管理工具

下面列举了前端常用的包管理工具

①npm

②yarn

③cnpm

(4)包的来源

不同于Node.js 中的内置模块与自定义模块,包是由第三方个人或团队开发出来的,免费供所有人使用。

注意:Node.js 中的包都是免费且开源的,不需要付费即可免费下载使用

(5)一个规范的包,它的组成结构,必须符合以下3 点要求:

①包必须以单独的目录而存在

②包的顶级目录下要必须包含package.json 这个包管理配置文件

③package.json 中必须包含name,version,main这三个属性,分别代表包的名字、版本号、包的入口。

7.1 npm

(1)npm 全称 Node Package Manager ,翻译为中文意思是『Node 的包管理工具』

(2)npm 是 node.js 官方内置的包管理工具,是 必须要掌握住的工具

7.1.1 npm 的安装

(1)node.js 在安装时会 自动安装 npm ,所以如果你已经安装了 node.js,可以直接使用 npm

(2)可以通过 npm -v 查看版本号测试,如果显示版本号说明安装成功,反之安装失败

7.1.2 npm 基本使用

7.1.2.1 初始化(创建 package.json 文件)

(1)创建一个空目录,然后以此目录作为工作目录 启动命令行工具 ,执行 npm init

①npm init 命令可以将文件夹初始化为一个『包』, 交互式创建 package.json 文件

②package.json 是包的配置文件,每个包都必须要有 package.json。可用来记录项目中安装了哪些包。从而方便剔除node_modules 目录之后,在团队成员之间共享项目的源代码

注意:今后在项目开发中,一定要把node_modules文件夹,添加到.gitignore忽略文件中。

③package.json 内容示例:

{
  "name": "1-npm", #包的名字
  "version": "1.0.0", #包的版本
  "description": "", #包的描述
  "main": "index.js", #包的入口文件
  "scripts": { #脚本配置
  "test": "echo \"Error: no test specified\" && exit 1"
},
  "author": "", #作者
  "license": "ISC" #开源证书
}

(2)初始化的过程中还有一些注意事项:

①package name ( 包名 ) 不能使用中文、大写,默认值是 文件夹的名称 ,所以文件夹名称也不

能使用中文和大写

②version ( 版本号 )要求 x.x.x 的形式定义, x 必须是数字,默认值是 1.0.0

a.第1位数字:大版本

b.第2位数字:功能版本

c.第3位数字:Bug修复版本

版本号提升的规则:只要前面的版本号增长了,则后面的版本号归零。

③ISC 证书与 MIT 证书功能上是相同的,关于开源证书扩展阅读http://www.ruanyifeng.com/bl

og/2011/05/how_to_choose_free_software_licenses.html

④package.json 可以手动创建与修改

⑤使用 npm init -y 或者 npm init --yes 极速创建 package.json

(3)package.json 文件中,有一个dependencies 节点,专门用来记录您使用npm install 命令安装了哪些包

(4)devDependencies 节点

如果某些包只在项目开发阶段会用到,在项目上线之后不会用到,则建议把这些包记录到devDependencies节点中。与之对应的,如果某些包在开发和项目上线之后都需要用到,则建议把这些包记录到dependencies 节点中。

7.1.2.2 搜索以及下载安装包

(1)搜索包的方式有两种

a.命令行 『npm s/search 关键字』

b.网站搜索 网址是 https://www.npmjs.com/

(2)我们可以通过 npm install 和 npm i 命令安装包

# 格式
npm install <包名>
npm i <包名>
# 示例
npm install uniq
npm i uniq

(3)运行之后文件夹下会增加两个资源

①node_modules: 文件夹,用来存放所有已安装到项目中的包

②package-lock.json: 包的锁文件 ,用来锁定包的版本。该配置文件用来记录 node_modules 目录下的每一个包的下载信息,例如包的名字、版本号、下载地址等。

注意:程序员不要手动修改node_modules 或package-lock.json文件中的任何代码,npm 包管理工具会自动维护它们

7.1.2.3 require 导入 npm 包基本流程

(1)在当前文件夹下 node_modules 中寻找同名的文件夹

(2)在上级目录中下的 node_modules 中寻找同名的文件夹,直至找到磁盘根目录

7.1.3 生产环境与开发环境,生产依赖与开发依赖

(1)开发环境是程序员 专门用来写代码 的环境,一般是指程序员的电脑,开发环境的项目一般 只能程序员自己访问

(2)生产环境是项目 代码正式运行 的环境,一般是指正式的服务器电脑,生产环境的项目一般 每个客户都可以访问

(3)我们可以在安装时设置选项来区分 依赖的类型 ,目前分为两类:

7.1.4 解决下包速度慢的问题

7.1.5 全局安装

(1)在执行npm install 命令时,如果提供了-g参数,则会把包安装为全局包。

(2)全局包会被安装到C:\Users\用户目录\AppData\Roaming\npm\node_modules 目录下

(3)说明:

①全局安装的命令不受工作目录位置影响

②可以通过 npm root -g 可以查看全局安装包的位置

③不是所有的包都适合全局安装 , 只有全局类的工具才适合,可以通过 查看包的官方文档来确定

安装方式

7.1.6 修改 windows 执行策略

windows 默认不允许 npm 全局命令执行脚本文件,所以需要修改执行策略

(1)以 管理员身份 打开 powershell 命令行

(2)键入命令 set-ExecutionPolicy remoteSigned

(3)如果不生效,可以尝试重启 vscode

7.1.7 安装包依赖(npm i)

(1)在项目协作中有一个常用的命令就是 npm i ,通过该命令可以依据 package.json 和 packagelock.json 的依赖声明一次性安装所有的依赖包:

(2)命令:

npm i或者npm install

(3)node_modules 文件夹大多数情况都不会存入版本库

7.1.8 安装指定版本的包、卸载包

(1)项目中可能会遇到版本不匹配的情况,有时就需要安装指定版本的包,可以使用下面的命令的

## 格式
npm i <包名@版本号>
## 示例
npm i jquery@1.11.2

(2)运行npm uninstall 命令,来卸载指定的包

注意:npm uninstall 命令执行成功后,会把卸载的包,自动从package.json 的dependencies 中移除掉。

7.1.9 删除依赖

项目中可能需要删除某些不需要的包,可以使用下面的命令

## 局部删除
npm remove uniq
npm r uniq
## 全局删除
npm remove -g nodemon

7.1.10 配置命令别名

(1)通过配置命令别名可以更简单的执行命令

(2)配置 package.json 中的 scripts 属性

{
.
.
.
  "scripts": {
  "server": "node server.js",
  "start": "node index.js",
},
.
.
}

(3)配置完成之后,可以使用别名执行命令

npm run server
npm run start

(4)不过 start 别名比较特别,使用时可以省略 run

npm start

(5)补充说明:

①npm start 是项目中常用的一个命令,一般用来启动项目

②npm run 有自动向上级目录查找的特性,跟 require 函数也一样

③对于陌生的项目,我们可以通过查看 scripts 属性来参考项目的一些操作

7.2 cnpm

7.2.1 介绍

(1)cnpm 是一个淘宝构建的 npmjs.com 的完整镜像,也称为『淘宝镜像』,网址https://npmmirror.com/

(2)cnpm 服务部署在国内 阿里云服务器上 , 可以提高包的下载速度

(3)官方也提供了一个全局工具包 cnpm ,操作命令与 npm 大体相同

7.2.2 安装

我们可以通过 npm 来安装 cnpm 工具

npm install -g cnpm --registry=https://registry.npmmirror.com

2.2.3 操作命令

7.2.4 配置淘宝镜像

用 npm 也可以使用淘宝镜像,配置的方式有两种

(1)直接配置

(2)工具配置

7.2.4.1 直接配置

执行如下命令即可完成配置

npm config set registry https://registry.npmmirror.com/
7.2.4.2 工具配置

使用 nrm 配置 npm 的镜像地址 npm registry manager

(1)安装 nrm

npm i -g nrm

(2)修改镜像

nrm use taobao

(3)检查是否配置成功(选做)

npm config list

检查 registry 地址是否为 https://registry.npmmirror.com/ , 如果 是 则表明成功

补充说明:

(1)建议使用第二种方式 进行镜像配置,因为后续修改起来会比较方便

(2)虽然 cnpm 可以提高速度,但是 npm 也可以通过淘宝镜像进行加速,所以 npm 的使用率还

是高于 cnpm

7.3 yarn

7.3.1 yarn简介

(1)yarn 是由 Facebook 在 2016 年推出的新的 Javascript 包管理工具,官方网址:https://yarnpkg.com/

(2)yarn特点:

①速度超快:yarn 缓存了每个下载过的包,所以再次使用时无需重复下载。 同时利用并行下载以最大

化资源利用率,因此安装速度更快

②超级安全:在执行代码之前,yarn 会通过算法校验每个安装包的完整性

③超级可靠:使用详细、简洁的锁文件格式和明确的安装算法,yarn 能够保证在不同系统上无差异的工作

(3)yarn的安装

npm i -g yarn

7.3.2 yarn 常用命令

7.3.3 yarn 配置淘宝镜像

(1)可以通过如下命令配置淘宝镜像

yarn config set registry https://registry.npmmirror.com/

(2)可以通过 yarn config list 查看 yarn 的配置项

7.3.4 npm 和 yarn 选择

大家可以根据不同的场景进行选择

(1)个人项目

如果是个人项目, 哪个工具都可以 ,可以根据自己的喜好来选择

(2) 公司项目

如果是公司要根据项目代码来选择,可以 通过锁文件判断 项目的包管理工具

①npm 的锁文件为 package-lock.json

②yarn 的锁文件为 yarn.lock

目录
相关文章
|
2月前
|
JSON JavaScript 前端开发
Node.js 的适用场景
Node.js 的适用场景
46 0
|
10月前
|
JavaScript 安全 前端开发
Node.js 20.6.0 特点
Node.js 20.6.0 特点
|
12月前
|
JavaScript 前端开发
初学Node.Js
初学Node.Js
52 0
|
Web App开发 JavaScript 前端开发
Node.js 是什么?
Node.js 是什么?
|
SQL 存储 JavaScript
【Node.js】初识Node.js
【Node.js】初识Node.js
|
JSON JavaScript 前端开发
Node.js Next 10
Node.js Next 10
|
存储 Web App开发 JSON
一篇文章带你看懂Node.js
一篇文章带你看懂Node.js
153 0
一篇文章带你看懂Node.js
|
缓存 运维 JavaScript
狼叔:聊聊 Node.js
前阵子我在知乎上回答了《2021前端会有什么新的变化?》,单篇33.8万的阅读量,还是不错的,说明大家非常关心前端的变化趋势,这里再与大家分享一下我对 Node.js 相关内容的看法。
狼叔:聊聊 Node.js
|
JavaScript API 前端开发
Node.js - What's next
来自 Node.js 技术委员会(TSC)主席 Michael Dawson 在 D2 的分享,Node.js 工作组正在做的事情及未来规划。
Node.js - What's next
|
机器学习/深度学习 Kubernetes JavaScript
Node.js 要完了吗?
不管你输入的是哪种技术都可以搜出来一大堆文章来,其中很多无疑写的就是垃圾。就算是 Kubernetes 之类的新技术也不能幸免,Node.js 自然也不例外。