Node 知识总结【NodeJs】

231 阅读8分钟

NodeJs

简介

是什么

是一个基于 Chrome V8 引擎的 JavaScript 运行环境。

可以做什么

Node.js 作为一个 JavaScript 的运行环境,仅仅提供了基础的功能和 API 。然而,基于 Node.js 提供的这些基础功能,很多强大 的工具和框架如雨后春笋,层出不穷,所以学会了 Node.js ,可以让前端程序员胜任更多的工作和岗位!

  • 可以快速构建 Web 应用。
  • 可以构建跨平台的桌面应用。
  • 可以快速构建 API 接口项目。
  • 可以读写和操作数据库、创建实用的命令行工具辅助前端开发。


JavaScript 运行环境比对

浏览器中的 JavaScript

- `V8` 引擎
- 内置 `API`
    1. `DOM`
    2. `BOM`
    3. `Canvas`
    4. `xhr`
    5. `js内置对象`

Node.js 中的 JavaScript

- `V8` 引擎
- 内置 `API`
    1. `fs`
    2. `path`
    3. `http`
    4. `querystring`
    5. `js内置对象`
    

注意:

  • 浏览器是 JavaScript前端 运行环境。(浏览器是客户端安装的软件)
  • Node.jsJavaScript后端 运行环境。(正常情况下,Nodejs要安装到服务器上)
  • Node.js 中无法调用 DOMBOM 等 浏览器内置 API


执行 JS 文件

  • 打开终端
  • 注意终端的路径,注意在此路径中,是否能找到你的js文件。
  • 输入 “node 要执行的js文件
  • 执行文件的时候,需要保证 node xxx.js 这种格式
  • node只能运行JS代码(也就是 不要 node xxx.html


模块化及其分类

模块化(了解)

  • AMD
  • CMD
  • CommonJSNode 中的模块化,使用的是这种方案)
  • ES6

模块分类

  • 自定义模块

    NodeJS中,创建的JS文件都是自定义模块。(也就是处处皆模块)

    1. 导入
      let 变量名 = require('相对路径')
      
    2. 导出
      module.exports={}
      
  • 内置模块(核心模块)

    安装Node之后,自带了很多内置模块。我们可以直接加载使用他们。

    导入

    let fs = require('fs')
    let path = require('path')
    
  • 第三方模块

    其他人编写的模块,发布到 npm 网站 上,我们可以下载使用。

fs 内置模块

  1. 读文件
    • 异步读取操作
      fs.readFile('相对路径','utf-8',(err,data)=>{})
      
    • 同步读取操作
      let data = fs.readFileSync('相对路径','utf-8')
      
  2. 写文件
    • 异步操作
      fs.writeFile('相对路径', 数据 ,(err)=>{})
      
    • 同步操作
      fs.readFileSync('相对路径', 数据)
      

注意:

读取到的文件返回的是字符串的形式;写操作时数据必须是字符串形式。因此用的 JSON 进行类型转换。

  1. 追加内容
    • 异步操作
      fs.appendFile('路径', 数据 ,(err)=>{})
      
    • 同步操作
      fs.appendFileSync('路径', 数据)
      

path 内置模块

  1. 获取后缀名

    let filename = path.extname(文件)
    console.log(filename);
    
  2. 拼接路径

    • 正常拼接
      let af = 'chao'
      let bf = 'ze'
      let cf = 'tie'
      let df = 'zhan'
      let ff = 'daodao.jpg'
      
      let file = path.join(af, bf, cf, df, ff)
      console.log(file); // chao\ze\tie\zhan\daodao.jpg
      
    • 带有返回上一级的拼接
      let file1 = path.join(af, bf, cf, df, '../', ff)
      console.log(file1); // chao\ze\tie\daodao.jpg
      

    因此后续的业务中可用于判断用户是否达到某个条件,满足可到下一层,不满足返回上一层。

  3. 获取文件绝对路径

    代码语法如下:

    console.log(__dirname); // 返回的是当前文件的绝对路径
    

    node.js 中相对路径是相对于运行 node 的文件而言,因此会出现小错误,如下所示。

    文件路径.png 有两个1.txt文件,现在我们在文件 code 中运行子文件夹 data 的 1.js文件,1.js代码如下。

    const fs = require('fs')
    const path = require('path')
    
    let txt = fs.readFileSync('./1.txt', 'utf-8')
    console.log(txt);
    

    实现读取1.txt文件的内容,由于在文件夹 code 外面执行里面的文件,因此我们可以手动加路径,运行后发现结果如下。

    结果1.png

    可以发现被读取的是文件夹 code 下的1.txt,因为我们在文件夹 code 下运行的代码,node 根据相对路径来找,找到的是外面的文件。 为了解决这种麻烦,在 node 中更推荐使用绝对路径,用绝对路径拼接文件名的形式,如下所示。

    const fs = require('fs')
    const path = require('path')
    
    let file = path.join(__dirname, '1.txt')
    let file1 = fs.readFileSync(file, 'utf-8')
    console.log(file1);
    

    运行结果如下所示。

    结果2.png



npm

介绍

  1. 本质 是 node 包 管理器。管理 node 包的工具。npm 这个工具,在安装 node 的时候,就已经安装到你的计算机中了。 查看 npm 版本号命令:

    npm -v
    
  2. 作用

    管理 node 模块的工具。

    • 下载并安装第三方的模块
    • 卸载第三方模块
    • 发布模块
    • 删除已发布的模块

总结:

npm 就是一个管理(下载安装、卸载...)第三方模块的工具



第三方模块

本地模块

  1. 初始化

    npm init -y
    

    初始化之后,会在项目目录中生成 package.json 的文件。

    注意事项:

    • package name 默认使用当前文件夹 当做 包的名字
    • package name 不能有中文
    • package name 不能有特殊符号
    • package name 不能和需要安装的第三方模块同名
  2. 安装卸载命令 建议在安装第三方模块之前,先执行如下命令。 下面的命令只需要执行一次即可(不管以后重启vscode还是重启电脑,都不需要执行第二次)

    npm config set registry https://registry.npm.taobao.org
    
    • 安装
      npm i 模块名 模块名
      
    • 卸载
      npm  un 模块名 模块名
      
  3. 使用

    • 和使用内置模块一样,需要使用 require 加载模块。
    • 调用模块提供的方法完成工作。

全局模块

和本地模块的差异

  • 全局安装的模块,不能通过 require() 加载使用。
  • 全局安装的模块,一般都是命令或者工具。

安装卸载命令

  • 安装命令(多一个 -g

    npm i 模块名 -g
    或
    npm i -g 模块名
    
    ### mac 系统如果安装不上,使用下面的命令提高权限
    sudo npm i -g 模块名
    
  • 卸载命令(也是多一个 -g

    npm un 模块名 -g
    
  • 全局安装的模块,在系统盘(C盘)

    • 通过命令 npm root -g 可以查看全局安装路径

全局安装 nrm

nrm 是作用是切换镜像源(模块下载地址;模块下载的网站)。

全局安装

npm i -g nrm   (mac系统前面加 sudo)

使用 nrm

nrm ls    --- 查看全部可用的镜像源
nrm test --- 测试 每一个镜像地址的网络速度 
nrm use taobao  ---- 切换到淘宝镜像


package.json 文件

在初始化之后,会生成一个 package.json 文件。

  • main

    指定了模块的入口文件。

  • dependencies

    指定了当前项目所依赖(需要)的包,可以使用 npm i 可以安装所有的依赖 。使用 npm i 模块 安装模块时,会将该模块记录到 dependencies 中,表示这是项目必须的模块。

  • scripts 指定了运行脚本命令的 npm 命令行缩写,比如start指定了运行 npm run start 时,所要执行的命令。



require 加载机制

  1. 判断缓存中有没有,如果有,使用缓存中的内容
  2. 缓存中没有,那么表示第一次加载,加载完会缓存
  1. 判断模块名有没有带路径(./)

  2. 模块名中有路径,加载自定义模块(自己写的文件)const xx = require('./xx')

    1. 优先加载同名文件,加载一个叫做 xx 的文件
    2. 再次加载js文件,加载 xx.js 文件
    3. 再次加载json文件,加载 xx.json 文件
    4. 最后加载node文件,加载 xx.node文件
    5. 如果上述文件都没有,则报错 “Cannot find module './xx'”
  3. 模块名没有路径优先加载核心模块如果没有核心模块,则加载第三方模块

  4. 加载第三方模块的查找方式

    1. 优先在当前文件夹的node_modules里面查找第三方模块
    2. 在当前文件夹的上级目录的node_modules里面查找第三方模块
    3. 继续向上层文件夹查找第三方模块

开发一个属于自己的包

初始化

初始化,生成一个 package.json 文件

npm init -y

定义方法

index.js 中定义函数属性方法,用 module.exports={} 导出。创建一个 README.md 文档记录使用说明。

注册账号

  • 访问 www.npmjs.com/ 网站
  • 点击 sign up 按钮,进入注册用户界面
  • 填写账号相关的信息
  • 点击 Create an Account 按钮,注册账号
  • 注册完账号,需要到邮箱中认证一下

发布

  • 终端中,切换镜像源为npm(不能发布到淘宝,所以必须切换镜像源为npm主站)

    https://www.npmjs.com/ 
    
  • 终端中,登录 npm 账号

    • 执行 npm login 命令
    • 输入账号
    • 输入密码(输入的密码是看不见的,正常
    • 输入邮箱
  • 发布

    • 注意,执行命令的文件夹,必须是包的根目录
    • 运行 npm publish 命令,即可将包发布到 npm 上


知识点补充

forforEach

  • for for 循环可以被打断,在函数内用 return ,函数体外用 break
  • forEach forEach 不可打断,即用 return 无效。

数组的方法

  • find for 返回满足条件的一个元素。
  • findIndex forEach 返回满足条件的一个元素的索引号。

const 改变的常量

JavaScript 中,用 const 声明的是一个常量,不可被更改,如下。

const报错.png

当我们对数组或对象的元素进行更改,不会报错,对象同理。

const数组.png

其中的原因就要说回数据类型了。在 JavaScript 中,数据类型分为简单数据类型和复杂数据类型。简单数据类型包括 numberbooleanstringundefinednull ,复杂数据类型包括 objectarrayfunction

当我们声明一个简单数据类型,就会在栈空间开辟一块内存,存放这个数据,变量则指向这个空间地址。我们重新更改后会重新开辟一个新空间,让变量指向新的地址。

当我们声明一个复杂数据类型,就会在堆空间开辟一块内存,存放这个数据所在的地址,实际上这个数据存放在其他位置。我们更改其中的属性会把原数据的属性更改,但地址不会发生变化,因此不会报错。

如果我们把代码变成以下形式:

const数组后.png

这样相当让变量 arr 重新指向一个新的地址,修改了其原本的指向,因此会报错。