banner
banner
banner
NEWS LETTER

Node基础

Scroll down

命令行窗口(小黑屏)、CMD窗口、终端、shell 的常用指令:

  • dir 列出当前目录下的所有文件
  • cd 目录名 进入到指定的目录
  • md 目录名 创建一个文件夹
  • rd 目录名 删除一个文件夹

Node.js

  • 一门后端语言(服务器端的程序语言),能够连接数据库存取数据,能够接受和处理网络请求(服务器的响应,发送请求去获取数据),单线程事件驱动,异步执行,不等待,提高IO(Input/output)的处理速度和效率
  • Node是一款对ES标准实现的JS引擎
  • Node的中js引擎使用的chrome的v8引擎
  • Node仅仅对ES标准进行了实现,所以在Node中不包含DOM 和 BOM
  • Node的特点:
    1. 非阻塞、异步的I/O
    2. 事件和回调函数
    3. 单线程(主线程单线程,后台I/O线程池)
    4. 跨平台

包(package)

  • 将多个模块组合为一个完整的功能,就是一个包

包结构

  • bin — 二进制的可执行文件,一般都是一些工具包中才有
  • lib — js文件
  • doc — 文档
  • test — 测试代码
  • package.json — 包的描述文件,json格式
    • name: 包名
    • version: 版本
    • dependencies: 依赖
    • main: 包的主要的文件
    • bin: 可执行文件

npm(Node Package Manager node的包管理器)

  • npm会在安装完node以后,自动安装
  • 通过npm下载的包都放到node_modules文件夹中,可以直接通过包名引入即可
  • npm的常用指令
    • npm -v — 查看npm的版本
    • npm version — 查看所有模块的版本
    • npm init — 初始化项目(创建package.json)
    • npm i/install 包名 — 安装指定的包
    • npm i/install 包名 –save — 安装指定的包并添加依赖
    • npm i/install 包名 –save-dev — 安装的包只用于开发环境
    • npm i/install 包名 -g — 全局安装(一般都是一些工具)
    • npm i — 安装当前项目所依赖的包
    • npm s/search 包名 — 搜索包
    • npm r/remove 包名 — 删除一个包

node的全局对象 — global

  • 在全局中创建的变量或函数都会作为global的属性或方法保存

模块化

  • ES5中没有原生支持模块化,我们只能通过script标签引入js文件来实现模块化
  • 在Node中为了对模块管理,引入了CommonJS规范

模块的定义

  • 在Node中一个js文件就是一个模块
  • 默认情况下在js文件中编写的内容,都是运行在一个独立的函数中,外部的模块无法访问

模块的引用 — require()函数

  • 可以传递一个文件的路径作为参数,Node将会自动根据该路径来引入外部模块
    • 相对路径的引入:require(“./math”);
    • 绝对路径的引入:require(“fs”);
  • 引入模块以后,该函数会返回一个对象,这个对象代表的是引入的模块
  • 引入模块时,使用的就是模块标识,可以通过模块标识来找到指定的模块

暴露变量或方法 — exports / module.exports

系统默认设置了 exports = modules.exports

  • exports

    • 只需要将需要暴露给外部的变量或方法设置为exports的属性即可
    • 只能设置单个属性来向外暴露
    • 向外部暴露属性:exports.属性 = 属性值;
    • 向外部暴露方法:exports.方法名 = 函数;
  • module.exports

    • module.exports既可以单个设置属性也可以整个赋值,一切以module.exports为准
    • module.exports.属性 = 属性值
    • module.exports.方法名 = 函数
    • module.exports = {}

1
2
3
4
5
6
7
8
9
10
11
存在
exports.a = 1
module.exports.b = 2
已知
exports = module.exports
因此
exports = {c:3}
不成立,输出时仍显示a,b

module.exports = {c:3}
成立, 输出为{c:3}

模块的初始化

  • 一个模块中的js代码仅在模块第一次使用时执行一次

模块的类型

  • 核心模块

    • 由node引擎提供的模块
    • 核心模块的标识就是,模块的名字
  • 文件模块

    • 由用户自己创建的模块
  • 路径模块

    • let path = require(“path”)
    • 获取路径信息扩展名 — path.extname
    • 将数组的元素自动拼接成一个路径 — path.resolve()
      • let arr = [‘/sxt’,’xxx’, ‘ppp’]
      • let info1 = path.resolve(…arr)
      • 返回:当前文件在的系统盘:\sxt\xxx\ppp
    • 获取当前执行目录并拼接 — path.join()
      • let info2 = path.join(__dirname, ‘sxt’, ‘xxx’, ‘ppp’)
    • 解析网址 — str.split('/')
    • 解析路径(根路径、目录、扩展名、文件名称、文件名) — path.parse(__filename)
      1
      2
      3
      let url = require('url')
      url.parse(httpUrl) --- 解析路径
      url.resolve(targetUrl, httpUrl) --- 将两个路径合理拼接在一起

系统模块

  • let os = require(“os”)
  • 查看cpu信息 — os.cpus()
  • 查看整个内存大小 — os.totalmem()
  • 查看系统架构 — os.arch()

模块的标识 — 模块的名字或路径

  • 通过模块的标识来寻找模块的
  • 对于核心模块(npm中下载的模块),直接使用模块的名字对其进行引入
  • 对于自定义的文件模块,需要通过文件的路径来对模块进行引入
    • 路径可以是绝对路径,如果是相对路径必须以./或 ../开头

模块的运行规则

  • 当node在执行模块中的代码时,它会将代码放进以下函数中
    • function (exports, require, module, __filename, __dirname) {}
  • 实际上模块中的代码都是包装在一个函数中执行的,并且在函数执行时,同时传递进了5个实参
    • exports — 该对象用来将变量或函数暴露到外部
    • require — 函数,用来引入外部的模块
    • module — module代表的是当前模块本身
    • __filename — 获取当前执行文件的完整路径
    • __dirname — 当前执行文件的目录的完整路径

模块的查找规则

  • node在使用模块名字来引入模块时,它会首先在当前目录的node_modules中寻找是否含有该模块
    • 如果有则直接使用,如果没有则去上一级目录的node_modules中寻找
    • 如果有则直接使用,如果没有则再去上一级目录寻找,直到找到为止
    • 直到找到磁盘的根目录,如果依然没有,则报错
  • arguments.callee
    • 这个属性保存的是当前执行的函数对象

事件

发送和接受事件

  • let event = require(“events”)
  • let ee = new event.eventEmitter()
  • 监听事件:let ee.on(‘事件名’, ()=> {})
  • 触发事件:let ee.emit(‘事件名’,事件的数据data)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
let events = require("events")
let fs = require("fs")
let ee = new events.EventEmitter()

ee.on("test", (msg) => {
console.log(msg)
console.log("输出test")
})
// 同步
fsReadDir = () => {
fs.readdir("./", (err, files) => {
// files 是一个包含该目录所有文件的数组
if(!err) {
ee.emit("test",files)
} else {
console.log(err)
}
})
}
fsReadDir()
// 异步写法
const fsRead = (url: string) => {
return new Promise((resolve, reject) => {
fs.readFile(url, {flag: 'r', encoding: "utf-8"}, (err, data) => {
if(!err) {
resolve(data)
} else {
reject(err)
}
})
})
}
fsRead(path).then((res) => {
ee.emit("test",res)
})
|| 两者差不多,但下面少一个回调函数
const Test = async () => {
let res = await fsRead()
ee.emit("test",res)
}
Test()

// 老式写法
let Event = {
event: {},
on: (eventName, eventFn) => {
// 如果数组中存在这个事件,就及那个对应事件的函数赋给它,不存在则先添加事件名在赋值事件函数
if(this.event.eventName) {
this.event[eventName].push(eventFn)
} else {
this.event[eventName] = []
this.event[eventName].push(eventFn)
}
},
emit: (eventName, data) => {
// 数组存在这个事件就调用事件函数并返回数据
if(this.event[eventName]){
this.event[eventName].forEach(itemFn => {
itemFn(data)
})
}
}
}
eventEmitter.on("event1", (data) => {
// ... 一些事件
})
其他文章
cover
ES6-字符串
  • 24/10/31
  • 15:54
  • ES6
目录导航 置顶
  1. 1. 命令行窗口(小黑屏)、CMD窗口、终端、shell 的常用指令:
  2. 2. Node.js
  3. 3. 包(package)
    1. 3.1. 包结构
  4. 4. npm(Node Package Manager node的包管理器)
  5. 5. node的全局对象 — global
  6. 6. 模块化
    1. 6.1. 模块的定义
    2. 6.2. 模块的引用 — require()函数
    3. 6.3. 暴露变量或方法 — exports / module.exports
    4. 6.4. 模块的初始化
    5. 6.5. 模块的类型
    6. 6.6. 系统模块
    7. 6.7. 模块的标识 — 模块的名字或路径
    8. 6.8. 模块的运行规则
    9. 6.9. 模块的查找规则
  7. 7. 事件
    1. 7.1. 发送和接受事件
请输入关键词进行搜索