Node.js
Node.js是一个基于Chrome V8 JavaScript引擎构建的开源、跨平台运行时环境。它允许开发人员在服务器上运行JavaScript代码,而不是在Web浏览器中。Node.js使用事件驱动的非阻塞I/O模型,使其变得轻量和高效。Node.js是一个轻量级的JavaScript运行环境,适用于构建实时数据交互应用程序。Node.js可以用于开发服务器端和网络应用程序。Node.js使用异步编程,使其非常内存高效。它可以生成动态页面内容,创建、打开、读取、写入、删除和关闭服务器上的文件,收集表单数据,并在数据库中添加、删除和修改数据。Node.js是一个流行的编程环境,可用于构建需要支持多个连接的高规模应用程序。
Node.js 入门
Node.js 是一个独立的 JavaScript 运行环境,能独立执行 JS 代码,因为这个特点,它可以用来编写服务器后端的应用程序
Node.js 作用除了编写后端应用程序,也可以对前端代码进行压缩,转译,整合等等,提高前端开发和运行效率
Node.js 基于Chrome V8 引擎封装,独立执行 JS 代码,但是语法和浏览器环境的 V8 有所不同,没有 document 和 window 但是都支持 ECMAScript 标准的代码语法
想要得到 Node.js 需要把这个软件安装到电脑,在素材里有安装程序(window 和 mac 环境的)参考 PPT 默认下一步安装即可
Node.js 没有图形化界面,需要使用 cmd 终端命令行(利用一些命令来操控电脑执行某些程序软件)输入,node -v 检查是否安装成功
- ```bash
node -v1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
### fs 模块 - 读写文件
---
Node.js的fs模块提供了读写文件的方法。以下是读写文件的方法:
读取文件:
- `fs.readFile(path[, options], callback)`:异步读取文件内容,其中path为文件路径,options为读取选项,callback为读取完成后的回调函数。
- ```js
const fs = require('fs');
fs.readFile('./file.txt', 'utf-8', function(error, data) {
if (error) {
console.log(error);
} else {
console.log(data);
}
});
- ```bash
fs.readFileSync(path[, options])
:同步读取文件内容,其中path为文件路径,options为读取选项。- ```js
const fs = require(‘fs’);
try {
const data = fs.readFileSync(‘./file.txt’, ‘utf-8’);
console.log(data);
} catch (error) {
console.log(error);
}1
2
3
4
5
6
7
8
9
10
11
12
13
写入文件:
- `fs.writeFile(file, data[, options], callback)`:异步写入文件内容,其中file为文件路径,data为要写入的数据,options为写入选项,callback为写入完成后的回调函数。
- ```js
const fs = require('fs');
fs.writeFile('./file.txt', 'Hello, world!', function(error) {
if (error) {
console.log(error);
} else {
console.log('File written successfully!');
}
});
- ```js
fs.writeFileSync(file, data[, options])
:同步写入文件内容,其中file为文件路径,data为要写入的数据,options为写入选项。- ```js
const fs = require(‘fs’);
try {
fs.writeFileSync(‘./file.txt’, ‘Hello, world!’);
console.log(‘File written successfully!’);
} catch (error) {
console.log(error);
}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
异步读写文件需要在回调函数中处理读写完成后的操作,而同步读写文件则会阻塞后续代码的执行,直到读写完成。
### path 模块 - 路径处理
---
为什么在 Node.js 待执行的 JS 代码中要用绝对路径:
——> Node.js 执行 JS 代码时,代码中的路径都是以终端所在文件夹出发查找相对路径,而不是以我们认为的从代码本身出发,会遇到问题,所以在 Node.js 要执行的代码中,访问其他文件,建议使用绝对路径
使用模块内置变量 `__dirname`配合 path.join() 来得到绝对路径使用
- `__dirname` 模块内置变量的值
- 动态获取当前文件所在文件夹的绝对路径
```js
const fs = require('fs')
console.log(__dirname)
// 1. 加载 path 模块
const path = require('path')
// 2. 使用 path.join() 来拼接路径
const pathStr = path.join(__dirname, '..', 'text.txt')
console.log(pathStr)
fs.readFile(pathStr, (err, data) => {
if (err) console.log(err)
else console.log(data.toString())
})
- ```js
Node.js 模块化
模块化简介
Node.js模块化是将一个大型的应用程序拆分成小的、可维护的模块,以便于开发和维护。Node.js 支持模块化开发,可以将一个大型应用程序分解成多个模块进行开发和维护。Node.js 的模块化采用 CommonJS 规范,支持将代码封装在模块中,避免全局变量污染和命名冲突等问题。
- 在Node.js中,每个.js文件都是一个单独的模块。
- 每个模块都可以使用exports和module.exports变量来导出模块中的内容。
- 使用require函数可以帮助我们导入其他模块(自定义模块、系统模块、第三方库模块)中的内容。
- Node.js中的模块化是同步的,即在导入模块时会阻塞后续代码的执行,直到模块导入完成。
在 Node.js 中每个文件都被当做是一个独立的模块,模块内定义的变量和函数都是独立作用域的,因为 Node.js 在执行模块代码时,将使用如下所示的函数封装器对其进行封装
而且项目是由多个模块组成的,每个模块之间都是独立的,而且提高模块代码复用性,按需加载,独立作用域
但是因为模块内的属性和函数都是私有的,如果对外使用,需要使用标准语法导出和导入才可以,而这个标准叫 CommonJS 标准,接下来我们在一个需求中,体验下模块化导出和导入语法的使用
导出模块:
使用 export
关键字可以将变量、函数或类导出为模块,其他模块就可以通过 import
关键字引用这些变量、函数或类。
1 | // math.js |
1 | module.exports = { |
导入模块:
使用 import
关键字可以引入其他模块导出的变量、函数或类
1 | // app.js |
1 | const 变量名 = require('模块名或路径') |
Node.js 模块化开发的示例代码:
在 math.js
模块中定义了一个加法函数和减法函数:
1 | // math.js |
在 app.js
模块中引入了 math.js
模块,并调用了其中的函数:
1 | // app.js |
在上面的代码中,我们首先在 math.js
模块中定义了一个加法函数和减法函数,并将其导出。然后,在 app.js
模块中通过 require
方法引入了 math.js
模块,并调用了其中的函数。
需要注意的是,模块导出的方式有两种:exports
和 module.exports
。其中,exports
是 module.exports
的一个引用,可以通过 exports
导出多个函数,但不能直接修改 exports
的值。而 module.exports
是真正的导出对象,可以直接修改其值。
Node.js的模块化规范是CommonJS,而在浏览器端使用的是ES6的模块化规范。
- Node.js 中什么是模块化
- 每个文件都是独立的模块
- 模块之间怎么联系
- 使用特定语法,导出和导入使用
- CommonJS 标准规定如何导出和导入 模块
- 导出:module.exports = {}
- 导入:require(‘模块名或路径’)
- 模块名/路径如何选择?
- 内置模块:写名字。例如:fs,path,http等。
- 自定义模块:写模块文件路径,例如:./utils.js
ECMAScript标准-默认导出和导入
CommonJS 规范是 Node.js 环境中默认的,后来官方推出 ECMAScript 标准语法,我们接下来在一个需求中,体验下这个标准中默认导出和导入的语法要如何使用
需求:封装并导出基地址和求数组元素和的函数,导入到 index.js 使用查看效果
导出语法:
1
2
3export default {
对外属性名: 模块内私有变量
}导入语法:
1
import 变量名 from '模块名或路径'
变量名的值接收的就是目标模块导出的对象
注意:Node.js 默认只支持 CommonJS 标准语法,如果想要在当前项目环境下使用 ECMAScript 标准语法,请新建 package.json 文件设置 type: ‘module’ 来进行设置
1
{ “type”: "module" }
代码实现:
utils.js:导出
1
2
3
4
5
6
7
8
9
10
11/**
* 目标:基于 ECMAScript 标准语法,封装属性和方法并"默认"导出
*/
const baseURL = 'http://hmajax.itheima.net'
const getArraySum = arr => arr.reduce((sum, item) => sum += item, 0)
// 默认导出
export default {
url: baseURL,
arraySum: getArraySum
}index.js:导入
1
2
3
4
5
6
7
8/**
* 目标:基于 ECMAScript 标准语法,"默认"导入,工具属性和方法使用
*/
// 默认导入
import obj from './utils.js'
console.log(obj)
const result = obj.arraySum([10, 20, 30])
console.log(result)
Node.hs 切换 模块标准为 ECMAScript —— 运行模块所在文件夹,新建 packag.json 并设置 {“type”: “module”}
ECMAScript标准-命名导出和导入
ECMAScript 标准的语法有很多,常用的就是默认和命名导出和导入,这节课我们来学习下命名导出和导入的使用
需求:封装并导出基地址和数组求和函数,导入到 index.js 使用查看效果
命名导出语法:
1
export 修饰定义语句
命名导入语法:
1
import { 同名变量 } from '模块名或路径'
注意:同名变量指的是模块内导出的变量名
代码示例:
utils.js 导出
1
2
3
4
5
6/**
* 目标:基于 ECMAScript 标准语法,封装属性和方法并"命名"导出
*/
export const baseURL = 'http://hmajax.itheima.net'
export const getArraySum = arr => arr.reduce((sum, item) => sum += item, 0)index.js 导入
1
2
3
4
5
6
7
8
9
10/**
* 目标:基于 ECMAScript 标准语法,"命名"导入,工具属性和方法使用
*/
// 命名导入
import {baseURL, getArraySum} from './utils.js'
console.log(obj)
console.log(baseURL)
console.log(getArraySum)
const result = getArraySum([10, 21, 33])
console.log(result)
与默认导出如何选择:
- 按需加载,使用命名导出和导入
- 全部加载,使用默认导出和导入
包
包:将模块,代码,其他资料整合成一个文件夹,这个文件夹就叫包
包分类:
- 项目包:主要用于编写项目和业务逻辑
- 软件包:封装工具和方法进行使用
包要求:根目录中,必须有 package.json 文件(记录包的清单信息)
包使用:在引入一个包文件夹到代码中,默认引入的是包文件节下的 index.js 模块文件里导出的对象,如果没有 index.js 文件,则会引入 package.json 里 main 属性指定的文件模块导出的对象
需求:封装数组求和函数的模块,封装判断用户名和密码长度函数的模块,形成一个软件包,并导入到 index.js 中使用查看效果
代码示例:
utils/lib 相关代码在素材里准备好了,只需要自己在 utils/index.js 统一出口进行导出
1
2
3
4
5
6
7
8
9
10
11
12
13
14/**
* 本文件是,utils 工具包的唯一出口
* 作用:把所有工具模块方法集中起来,统一向外暴露
*/
const { getArraySum } = require('./lib/arr.js')
const { checkUser, checkPwd } = require('./lib/str.js')
// 统一导出所有函数
module.exports = {
getArraySum,
checkUser,
checkPwd
}index.js 导入软件包文件夹使用(注意:这次导入的是包文件夹,不是模块文件)
1
2
3
4
5
6
7/**
* 目标:导入 utils 软件包,使用里面封装的工具函数
*/
const obj = require('./utils')
console.log(obj)
const result = obj.getArraySum([10, 20, 30])
console.log(result)
npm软件包管理器
npm 简介链接: 软件包管理器,用于下载和管理 Node.js 环境中的软件包
npm 使用步骤:
初始化清单文件: npm init -y (得到 package.json 文件,有则跳过此命令)
注意 -y 就是所有选项用默认值,所在文件夹不要有中文/特殊符号,建议英文和数字组成,因为 npm 包名限制建议用英文和数字或者下划线中划线
下载软件包:npm i 软件包名称
使用软件包
需求:使用 npm 下载 dayjs 软件包到本地项目文件夹中,引入到 index.js 中格式化日期打印,运行观察效果
具体使用流程图:
- npm 包管理器的作用
- 下载软件包以及管理版本
- 初始化项目清单文件 packag.json 的命令
npm init -y
- 下载软件包的命令
npm i 软件包名
- 下载的包存放在哪里
- 当前项目下的 node_modules, 并记录在 package.json 中
npm 安装依赖
拿到一个别人编写的项目,但是没有 node_modules,项目能否正确运行?
不能,因为缺少了项目需要的依赖软件包,比如要使用 dayjs 和 lodash 但是你项目里没有这个对应的源码,项目会报错的
为何没有给我 node_modules?
因为每个人在自己的本机使用 npm 下载,要比磁盘间传递要快(npm 有缓存在本机)
如何得到需要的所有依赖软件包呢?
直接在项目目录下,运行终端命令:npm i 即可安装 package.json 里记录的所有包和对应版本到本项目中的 node_modules
Node.js概念和常用命令总结
Node.js 模块化:把每个文件当做一个模块,独立作用域,按需加载,使用特定标准语法导出和导入使用
CommonJS 标准:一般应用在 Node.js 项目环境中
ECMAScript 标准:一般应用在前端工程化项目中
Node.js 包:把模块文件,代码文件,其他资料聚合成一个文件夹就是包
项目包:编写项目需求和业务逻辑的文件夹
软件包:封装工具和方法进行使用的文件夹(一般使用 npm 管理)
- 本地软件包:作用在当前项目,封装的属性/方法,供项目调用编写业务需求
- 全局软件包:作用在所有项目,一般封装的命令/工具,支撑项目运行
Node.js 常用命令:
- Title: Node.js
- Author: cccs7
- Created at: 2023-07-06 18:40:22
- Updated at: 2023-07-07 13:53:22
- Link: https://blog.cccs7.icu/2023/07/06/Node.js/
- License: This work is licensed under CC BY-NC-SA 4.0.