在 Node.js 之前,JavaScript 只能运行在浏览器中,作为网页脚本使用,为网页添加一些特效,或者和服务器进行通信。有了 Node.js 以后,JavaScript 就可以脱离浏览器,像其它编程语言一样直接在计算机上使用,不需要依托浏览器运行。
它是一套 JavaScript 运行环境,用来支持 JavaScript 代码的执行。
Node.js 是一个 JavaScript 运行时(Runtime)
node.js的组成
1) V8 引擎
V8 引擎就是 JavaScript 解释器,借鉴了 Java 虚拟机和 C++ 编译器的众多技术,它将 JavaScript 代码直接编译成原生机器码,使用了缓存机制来提高性能,这使得 JavaScript 的运行速度可以媲美二进制程序。
2) 本地模块
Node.js 集成了众多高性能的开源库,它们使用 C/C++ 语言实现
3) 标准库
本地模块使用 C/C++ 编写,而 Node.js 必须要封装本地模块的 C/C++ 接口,提供一套JavaScript 接口,保持接口在不同操作系统上一致,就是 Node.js 标准库。
fs模块
// 1. 导入 fs 文件系统模块
const fs = require('fs')
// 2. 调用 fs.writeFile() 方法,写入文件的内容
// 参数1:表示文件的存放路径
// 参数2:表示要写入的内容
// 参数3:回调函数
fs.writeFile('./files/helloword.txt', '你好世界', function (err) {
if (err) {
} else {
console.log('写入成功')
fs.readFile('./files/helloword.txt', 'utf-8', function (err, dataStr) {
if (err) {
return
} else console.log(dataStr)
})
}
})
fs.writeFile('./files/3.txt', 'ok123', function (err) {
// 2.1 如果文件写入成功,则 err 的值等于 null
// 2.2 如果文件写入失败,则 err 的值等于一个 错误对象
// console.log(err)
if (err) {
return console.log('文件写入失败!' + err.message)
} else console.log('文件写入成功!')
})
整理成绩案例
// 1. 导入 fs 模块
const fs = require('fs')
// 2. 调用 fs.readFile() 读取文件的内容
fs.readFile('../素材/成绩.txt', 'utf8', function (err, dataStr) {
// 3. 判断是否读取成功
if (err) {
return console.log('读取文件失败!' + err.message)
}
console.log('读取文件成功!' + dataStr)
// 4.1 先把成绩的数据,按照空格进行分割
const arrOld = dataStr.split(' ')
console.log(arrOld)
// 4.2 循环分割后的数组,对每一项数据,进行字符串的替换操作
const arrNew = []
arrOld.forEach((item) => {
arrNew.push(item.replace('=', ':'))
})
// 4.3 把新数组中的每一项,进行合并,得到一个新的字符串
const newStr = arrNew.join('\r\n')
// 5. 调用 fs.writeFile() 方法,把处理完毕的成绩,写入到新文件中
fs.writeFile('./files/成绩-ok.txt', newStr, function (err) {
if (err) {
return console.log('写入文件失败!' + err.message)
}
console.log('成绩写入成功!' + newStr)
})
})
// 可能出现路径拼接错误的问题,是因为提供了 ./ 或 ../ 开头的相对路径
// 如果要解决这个问题,可以直接提供一个完整的文件存放路径就行
fs.readFile(__dirname + '/files/1.txt', 'utf8', function (err, dataStr) {
if (err) {
return console.log('读取文件失败!' + err.message)
}
console.log('读取文件成功!' + dataStr)
})
path模块
//用 + 拼接不正规 使用path方法处理路径拼接更正规
const path = require('path')
const fs = require('fs')
fs.readFileSync('./files/1.txt')
// fs.readFileSync(__dirnamed)
//用 + 拼接不正规 使用path方法处理路径拼接更正规
//使用 ./ ../不正规 使用 __dirname 表示当前文件路径
console.log(__dirname)
fs.readFile(
path.join(__dirname + '/files/1.txt'),
'utf8',
function (err, dataStr) {
if (err) {
console.log(err)
} else console.log(dataStr)
}
)
const path = require('path')
// 定义文件的存放路径
const fpath = '/a/b/c/index.html'
//path.basename() 获取文件路径的最后一部分 (文件名和后缀)
const fullName = path.basename(fpath)
console.log(fullName) //index.html
const nameWithoutExt = path.basename(fpath, '.html')
console.log(nameWithoutExt) //index
const path = require('path')
// 这是文件的存放路径
const fpath = '/a/b/c/index.html'
// path.extname 获取文件路径后缀
const fext = path.extname(fpath)
console.log(fext) //.html
const basename = path.basename(fpath, '.html')
const extname = path.extname(fpath)
console.log(basename + extname)
const { log } = require('console')
// 遍历数组
const xiyou = ['唐僧', '孙悟空', '猪八戒', '沙僧']
//使用 for...of 遍历数组
for (let v of xiyou) {
console.log(v)
}
//同样便利数组
// 用来遍历数组中的每一项,不影响原数组,性能差
// 缺陷 你不能使用break语句中断循环,也不能使用return语句返回到外层函数。
xiyou.forEach((element) => {
console.log(element)
})
const honglou = ['贾宝玉', '林黛玉', '薛宝钗', '何熙凤']
for (let k in honglou) {
console.log(k)
console.log(honglou[k])
}
for (let k in xiyou) {
console.log(k)
}