Node.js

本文介绍Node.js的基础概念,包括其作为JavaScript后端运行环境的角色、安装方法、JavaScript代码的执行方式,以及模块化的实现机制。同时,文章还详细讲解了内置模块path和fs的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、Node.js

Node.js 的出现,使得JavaScript有了做后端开发的能力。

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

  • 基于 Express/Koa 框架,可以快速构建 Web 应用
  • 基于 Electron 框架,可以构建跨平台的桌面应用(vscode就是用node开发的)
  • 基于 restify 框架,可以快速构建 API 接口项目
  • 读写和操作数据库、创建实用的命令行工具辅助前端开发
  • etc…

Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine.
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。

Node.js 为 JavaScript 代码的正常运行,提供的必要的环境。
Node.js 的官网

二、Node.js中的JavaScript运行环境

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

总结:

Node是JS的另一个运行环境。
在Node环境中,可以运行ECMAScript语法,但不能运行 WebAPI的语法。

三、Node.js环境安装

通过 Node.js 来运行 Javascript 代码,则必须在计算机上安装 Node.js 环境才行。
安装包可以从 Node.js 的官网首页直接下载,进入到 Node.js 的官网首页,点 击绿色的按钮,下载所需的版本后,双击直接安装即可。
进入官网(中文),可以看到如下两个版本:
在这里插入图片描述

  • LTS 为长期稳定版,对于追求稳定性的企业级项目来说,推荐安装 LTS 版本
  • Current 为新特性尝鲜版,对于热衷于尝试新特性的用户来说,推荐安装Current 版本的 Node.js。但是,Current 版本 中可能存在隐藏的 Bug 或安全性漏洞,因此不推荐在企业级项目中使用 Current 版本的 Node.js。

查看已安装的Node.js的版本号

打开终端(黑窗口,或者蓝窗口),在终端输入命令 node –v 后,按下回车键,即可查看已安装的 Node.js 的版本号。

如果你能够看到版本号,说明你已经安装成功了。

在这里插入图片描述

四、在Node.js环境中运行JavaScript

终端窗口运行

类似于浏览器调试工具的“Console”面板,只适合运行少量的测试代码。
操作步骤:

  • 打开任意终端,直接输入 node 命令并回车
  • 执行你的JS代码,按回车表示执行
  • 按两次“Ctrl+C”退出。

在这里插入图片描述

使用node命令执行JS文件

运行写到 “xx.js” 里面的JS代码,可以运行JS文件中的代码。
操作步骤:

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

可能的问题:

如果终端中出现 >,按两次“Ctrl+C”退出
不能使用node运行html、css等等代码
不能在node环境中运行WebAPI的代码
JS文件名,不能叫做node.js

五、模块化

模块化,就是把一个大的文件拆分成若干小文件,而且还能把小文件通过特定的语法组合到一起的实现过程。

比如手机、电脑…等等几乎所有,都是模块化的设计,拿电脑来说,可以把电脑拆分成显示器、键盘、硬盘、内存等一个一个的小模块,当然也能够组装到一起。

模块化的优势:

  • 更利于维护(比如电脑屏幕坏了,只换屏幕就可以了;比如想升级显卡,只换显卡就行了);
  • 更好的复用性(比如有一块移动硬盘或U盘,大家都能用)
    Node中,规定每个JS文件都是一个小模块。一个项目由许许多多的小模块(JS文件)组合而成。

Node中模块化的优势:

  • 更利于维护(比如,项目需要对登录模块升级,则不会影响其他模块)
  • 更好的复用性(比如有一个公共的函数,封装起来。其他所有JS文件都能使用这个函数)

自定义模块

我们创建的每个JS文件都是一个自定义模块,并且具有模块作用域,也就是在一个模块中创建的变量、常量、函数等等一切,都只能在当前模块中使用。

  • 共享(导出/暴露)内容给其他模块用,需要使用 module.exports 导出内容。
    • module 是Node中的一个全局对象,对象包含当前模块的详细信息。
    • module.exports 是模块的出口,通俗的说,就是导出内容用的,默认值是 {}
    • 比如,02-test.js 导出 age、name、fn 给其他模块用,可以 module.exports = {age, name, fn}
  • 其他模块,如果需要使用上述模块导出的内容,可以使用 require() 加载
    • let 结果 = require(‘模块路径’)
    • 比如,let test = require(‘./02-test’);
    • 加载自定义模块,必须加路径,即使是 ./ 也必须加。但是可以省略后缀。

functions.js – 导出内容

// 项目中的函数库
function aa() {
  console.log(1111)
}

function bb() {
  console.log(2222)
}
// 我们声明的变量、函数等等,默认只能在当前文件中使用
// 变量、函数等等,属于当前这个文件

// 如果其他js文件想使用我的 变量、函数等等,需要我共享一下才行
// 共享、分享,也叫做暴露、也叫做导出 (叫导出的时候比较多)
// 分享、导出的语法,就一行代码
// module.exports = 共享的内容
// module.exports = {
//   uname: 'zs',
//   age: 20,
//   aa: aa,
//   bb: bb
// }
module.exports = { aa, bb }

index.js – 导入内容

// 怎么在这里调用 functions.js 中的函数???

// 想使用其他js文件中的函数,需要导入
// 导入的语法,也是一行代码
// 导入的语法:1. 必须带路径,即使是 ./ 也不能省略; 2. 可以省略后缀
let obj = require('./functions')
// console.log(obj)
obj.aa()
obj.bb()let test = require('./02-test');

console.log(test); // { age: 30, name: 'laotang', square: Function... }

一个模块导出什么,另一个模块加载后,就会得到什么。
就比如,我给你三个苹果,你只能得到三个苹果,不可能得到其他的。

模块的分类

自定义模块
  • NodeJS中,创建的JS文件都是自定义模块。(也就是处处皆模块)
  • 需要自己通过 module.exports = 内容 导出
  • 需要自己通过 let 变量 = require('./文件名') 导入 (注意路径不能丢)
内置模块
  • 安装Node之后,自带了很多内置模块。我们可以直接加载使用他们 。
  • 官方已经导出,我们只需要导入即可:let 变量 = require('模块名') (直接写模块名)
第三方模块
  • 其他人编写的模块,发布到 npm 网站上,我们可以下载使用。
  • 别人已经导出,我们只需要导入即可:let 变量 = require('模块名') (直接写模块名)

六、内置模块

内置模块是Node.js 平台自带的一套基本的 API(功能模块)。也叫做核心模块。

注意,加载内置模块,不能写路径,这是和加载自定义模块不一样的。

path模块

  • path 是 Node 本身提供的 API,专门用来处理路径。
  • http://nodejs.cn/api/path.html
  • 使用
    • 加载模块
    • 调用path模块中的方法,来处理相应的问题,下面列举path模块中的几个方法
// 使用核心模块之前,首先加载核心模块
let path = require('path');
// 或者
const path = require('path');
方法作用
path.basename(path[, ext])返回 path 的最后一部分(文件名)
path.dirname(path)返回目录名
path.extname(path)返回路径中文件的扩展名(包含.)
path.format(pathObject)将一个对象格式化为一个路径字符串
path.join([…paths])拼接路径
path.parse(path)把路径字符串解析成对象的格式
path.resolve([…paths])基于当前工作目录拼接路径
// 我现在要使用官方提供的 path 模块

// 用法一:先加载模块,得到对象;  然后再 ”对象.方法()”
// let path = require('path') // 导入内置模块,直接写模块名
// // console.log(path) //  { resolve: ..., join: ...., basename: ...., extname: ....., ..... }
// console.log(path.join('a', 'b', 'c', 'index.js')) // a/b/c/index.js

// 用法二:先加载模块,得到对象; 直接把需要的方法解构出来;最后直接使用方法即可
let { join } = require('path')
// node官方提供的join方法,作用是拼接几部分路径
// console.log(join('a', 'b', 'c')) // a/b/c
// console.log(join('a', 'b', '../c', 'index.js')) // a/c/index.js

// console.log(__dirname) // node中的一个全局变量,表示当前js文件的绝对路径(不包括文件名部分)

// 拼接一下,得到db.js的绝对路径
console.log(join(__dirname, 'db.js'))
// D:/147-148-金燕龙/项目前置课-01/课堂代码/db.js

这里有用的代码,就一行:join(__dirname, 'xxx')

fs模块

  • fs,即 file system,文件系统,该模块可以实现对 文件、文件夹的操作
  • http://nodejs.cn/api/fs.html
  • 使用
    • 加载模块
    • 调用fs模块的方法,下面列举fs模块中的常用方法
// 引入模块,引入模块的时候,可以使用var、let,但是建议使用const,因为我们不希望它改变
const fs = require('fs');
API作用备注
fs.access(path, callback)判断路径是否存在
fs.appendFile(file, data, callback)向文件中追加内容
fs.copyFile(src, callback)复制文件
fs.mkdir(path, callback)创建目录
fs.readDir(path, callback)读取目录列表
fs.rename(oldPath, newPath, callback)重命名文件/目录
fs.rmdir(path, callback)删除目录只能删除空目录
fs.stat(path, callback)获取文件/目录信息
fs.unlink(path, callback)删除文件
fs.watch(filename[, options][, listener])监视文件/目录
fs.watchFile(filename[, options], listener)监视文件
… 一大堆
// fs -- file system 文件系统
// fs 模块处理的问题,都和文件、文件夹相关
// 比如:获取某个文件里面的内容
// 比如:把一些内容放到某个文件中
// 比如:创建文件
// 比如:创建文件夹
// 比如:读取文件夹里面的全部文件
// 比如:删除文件、文件夹
// 比如:监视文件的变化
// .......

// 我们学习两个方法:
// 1. readFile() ---- 异步读取文件(获取文件里面的内容)
// 2. writeFile() --- 异步写入文件(把内容添加到文件里面)
// 首先,加载fs模块,并把我们需要的 两个方法解构出来
let { readFile, writeFile } = require('fs')

// ------------------------------ readFile -----------------------------
// 作用:读取文件(获取文件里面的内容)
// 语法:
/**
 * readFile('文件路径', '可选的utf-8', (err, data) => {
 *   err表示错误信息(如果读取发生了错误【err=错误对象】;如果没有错误【err=null】)
 *   data表示读取的结果
 * })
 */
// readFile('05.txt', 'utf-8', (err, data) => {
//   // throw专门用于抛出错误,可以理解为输出错误;遇到throw语句还会终止代码的执行,有return的特点
//   if (err) throw err
//   console.log(data)
// })

// --------------------------- writeFile ------------------------------
// 作用:写入文件(向文件中,添加内容)
// 语法:
/**
 * writeFile('文件', '字符串内容', err => {
 *   有错误发生【err=错误对象】; 没有错误【err=null】
 * })
 */
// 特点:
// 1. 如果文件不存在,会自动创建文件(但是不会递归创建)
// 2. 如果文件存在,并且里面有内容;写入的新内容会把原来的内容覆盖

writeFile('06.txt', '1234567890', err => {
  if (err) throw err
  console.log('写入成功')
})
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黄昏终结者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值