Node安装
下载长期维护版本 : https://nodejs.org/zh-cn/
在cmd中执行node -v
查看版本号,有版本号表示安装成功
Node命令执行JS文件
- 在终端中输入 “
node 要执行的js文件
” - 执行文件的时候,需要保证
node xxx.js
这种格式
可能的问题:
- 如果终端中出现
>
,按两次“Ctrl+C”退出 - 不能使用node运行html、css等等代码
- 不能在node环境中运行WebAPI的代码
- 文件名,不能叫做node.js
Node模块化
- 自定义模块,需要自己定义、导入、导出
- 内置模块,官方定义、导出,自己导入使用
- 第三方模块,其他作者定义、导出,自己导入使用
导入和导出
- 导出
- 语法:module.exports = 导出内容
- 需导出多个内容时,可以导出到一个对象内{}
- 键值对的名字和内容一样时,只需要写一个行
- 语法:module.exports = 导出内容
- 导入
- 语法:let 变量 = require(‘模块路径’)
- 导入自定义模块时必须加
./
但是可以省略后缀 - 内置模块不需要
./
- 导入自定义模块时必须加
- 语法:let 变量 = require(‘模块路径’)
// 导出代码
function aaa() {
console.log(789)
}
function bbb() {
console.log(123)
}
// module.exports = aaa
module.exports = {aaa,bbb}
// 导入代码
// let fn = require('./02-funtion.js')
// fn()
// 解构赋值
let {aaa,bbb} = require('./02-funtion')
aaa()
bbb()
Node内置模块
path模块
path是路径的意思,path模块的操作都是跟路径有关的
使用前先导入,在调用模块方法
方法:
path.join()
- 语法:path.join(‘参数’)
- 用来智能拼接路径,搭配__dirname使用
__dirname
永远表示当前js文件的绝对路径- `./`相对路径,相对的是当前的终端路径,如果终端没有选对会出错
- `__dirname`绝对路径,就表示这文件的固定位置,不受终端路径的影响
- 需要在同一个问价夹内才可以这样拼接
join(__dirname, '文件名')
const path = require('path');
// join -- 智能拼接路径
// console.log(path.join('a', 'b', 'c')); // a/b/c
// console.log(path.join('a', 'b', 'c', 'index.css')); // a/b/c/index.css
// a里面有b,b里面有../c,言外之意,c和b同级。
// console.log(path.join('a', 'b', '../c', 'index.js')); // a/c/index.js
// __dirname 永远表示当前js文件的绝对路径
console.log(path.join(__dirname, 'css', 'demo.css')); // /Users/tangfengpo/Study/123/Node01/code/css/demo.css
fs模块
fs,即 file system,文件系统
- 使用前先导入,在调用模块方法
- 方法:
fs.readFile()
- 语法:fs.readFile(‘文件路径’, ‘utf-8’, (err, data) => {})
- 异步读取文件(获取文件里面的内容)
- err表示错误信息,如果没有err=null
- data表示读取结果
fs.writeFile()
- 语法:fs.writeFile(‘文件名’, ‘内容’, err => {})
- 异步写入文件(把内容添加到文件里面)
- 特点:
- 如果文件不存在,会自动创建文件(但是不会递归创建)
- 如果文件里面有内容,再写入新内容,会把原来的内容覆盖掉
- 3.不能写入数组和对象(只能写字符串)
- 方法:
// 解构赋值
let { readFile, writeFile } = require('fs')
// -------------------------- readFile() -------------------------
// 作用:异步读取文件(获取文件里面的内容)
// 语法:
/**
* readFile('文件名', 'utf-8', (err, data) => {
* err 表示错误信息(如果正确没错误,err=null; 如果读取错误,err=对象)
* data 表示读取的结果
* })
*/
readFile('09-test.txt', 'utf-8', (err, data) => {
// 有错误,则抛出错误信息
if (err) throw err // throw抛出错误,遇到throw,后续的代码不再执行
// 没有错误,则输出读取的结果
console.log(data)
})
// -------------------------- writeFile() --------------------------
// 作用:把一段字符,放到文件中保存。
// 语法:
/**
* writeFile('文件名', '内容', err => {
* err 表示错误信息(如果正确没错误,err=null; 如果读取错误,err=对象)
* })
*/
// 特点:
// 1. 如果文件不存在,会自动创建文件(但是不会递归创建)
// 2. 如果文件里面有内容,再写入新内容,会把原来的内容覆盖掉
writeFile('10-test.txt', '明天放假,整理笔记', err => {
if (err) throw err
console.log('写入成功')
})
小案例 — 封装四个函数,分别有增删改查的功能
// 调用方法时,获取books.json的数据,log输出---------------------------------
function query() {}
query()
// 调用方法时添加图书-------------------------------------------------------
function add (obj) {}
add({"bookname": "三国演义","author": "罗贯中","publisher": "三国出版社"})
// 调用方法时根据id删除图书-------------------------------------------------
function del(id) {}
// del(4)
// 调用方法时修改数据-------------------------------------------------------
function update(obj) {}
update({id:7,booksname:'朝花夕拾',author: '罗贯中',publisher: '三国出版社'})
JSON 文件内容
[
{
"id": 2,
"bookname": "西游记",
"author": "唐僧",
"publisher": "大唐出版社"
},
{
"id": 4,
"bookname": "水浒传",
"author": "宋江",
"publisher": "大宋出版社"
},
{
"id": 7,
"bookname": "红楼梦",
"author": "曹雪芹",
"publisher": "大清出版社"
}
]
全部代码
// 先导入需要使用的方法
const {join} = require('path')
const {readFile,writeFile} = require('fs')
const { json } = require('stream/consumers')
// 获取books.json的绝对路径
const filePath = join(__dirname,'books.json')
// 调用方法时,获取books.json的数据,log输出----------------------------------
function query() {
readFile(filePath,'utf-8',(err,data) => {
if(err) throw err
let arr = JSON.parse(data)
console.log(arr)
})
}
// query()
// 调用方法时添加图书--------------------------------------------------------
function add (obj) {
readFile(filePath,'utf-8',(err,data) => {
if(err) throw err
let arr = JSON.parse(data)
let id = arr[arr.length - 1].id + 1
obj.id = id
arr.push(obj)
// writeFile 会覆盖 所以先读取数据,转换成数组添加上之后,在覆盖原有的,达到添加的效果
writeFile(filePath,JSON.stringify(arr),err => {
if(err) throw err
console.log('添加成功')
})
})
}
// add({"bookname": "三国演义","author": "罗贯中","publisher": "三国出版社"})
// 调用方法时根据id删除图书--------------------------------------------------
function del(id) {
readFile(filePath,'utf-8',(err,data) => {
if(err) throw err
let arr = JSON.parse(data)
let result = arr.filter(item => item.id != id)
writeFile(filePath, JSON.stringify(result),err => {
if(err) throw(err)
console.log('删除成功')
})
})
}
// del(4)
// 调用方法时修改数据--------------------------------------------------------
function update(obj) {
readFile(filePath,'utf-8',(err,data) => {
if(err) throw err
let arr = JSON.parse(data)
let i = arr.findIndex(item => item.id == obj.id)
arr.splice(i,1,obj)
writeFile(filePath,JSON.stringify(arr),err => {
if(err) throw err
console.log('修改成功')
})
})
}
update({id:7,booksname:'朝花夕拾',author: '罗贯中',publisher: '三国出版社'})
第三方模块
非node自带的模块。也不是自定义的模块。
是别人写的模块,然后发布到npm网站,我们可以使用npm工具来下载安装别人写的模块。
第三方模块,都是在node核心模块的基础之上,封装了一下,实现了很多非常方便快速简洁的方法。
如果你想实现一个功能。那么请搜索第三方模块,没有做不到的事情,只有你搜不到。