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 = aaamodule.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 errconsole.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 errlet arr = JSON.parse(data)console.log(arr)})}// query()// 调用方法时添加图书--------------------------------------------------------function add (obj) {readFile(filePath,'utf-8',(err,data) => {if(err) throw errlet arr = JSON.parse(data)let id = arr[arr.length - 1].id + 1obj.id = idarr.push(obj)// writeFile 会覆盖 所以先读取数据,转换成数组添加上之后,在覆盖原有的,达到添加的效果writeFile(filePath,JSON.stringify(arr),err => {if(err) throw errconsole.log('添加成功')})})}// add({"bookname": "三国演义","author": "罗贯中","publisher": "三国出版社"})// 调用方法时根据id删除图书--------------------------------------------------function del(id) {readFile(filePath,'utf-8',(err,data) => {if(err) throw errlet 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 errlet 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 errconsole.log('修改成功')})})}update({id:7,booksname:'朝花夕拾',author: '罗贯中',publisher: '三国出版社'})
第三方模块
非node自带的模块。也不是自定义的模块。
是别人写的模块,然后发布到npm网站,我们可以使用npm工具来下载安装别人写的模块。
第三方模块,都是在node核心模块的基础之上,封装了一下,实现了很多非常方便快速简洁的方法。
如果你想实现一个功能。那么请搜索第三方模块,没有做不到的事情,只有你搜不到。
