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模块化

  1. 自定义模块,需要自己定义、导入、导出
  2. 内置模块,官方定义、导出,自己导入使用
  3. 第三方模块,其他作者定义、导出,自己导入使用

导入和导出

  • 导出
    • 语法:module.exports = 导出内容
      • 需导出多个内容时,可以导出到一个对象内{}
      • 键值对的名字和内容一样时,只需要写一个行
  • 导入
    • 语法:let 变量 = require(‘模块路径’)
      • 导入自定义模块时必须加 ./ 但是可以省略后缀
      • 内置模块不需要 ./
  1. // 导出代码
  2. function aaa() {
  3. console.log(789)
  4. }
  5. function bbb() {
  6. console.log(123)
  7. }
  8. // module.exports = aaa
  9. module.exports = {aaa,bbb}
  10. // 导入代码
  11. // let fn = require('./02-funtion.js')
  12. // fn()
  13. // 解构赋值
  14. let {aaa,bbb} = require('./02-funtion')
  15. aaa()
  16. bbb()

Node内置模块

path模块

path是路径的意思,path模块的操作都是跟路径有关的

  • 使用前先导入,在调用模块方法

    • 方法:

      • path.join()

        • 语法:path.join(‘参数’)
        • 用来智能拼接路径,搭配__dirname使用
        • __dirname 永远表示当前js文件的绝对路径

          1. - `./`相对路径,相对的是当前的终端路径,如果终端没有选对会出错
          2. - `__dirname`绝对路径,就表示这文件的固定位置,不受终端路径的影响
          3. - 需要在同一个问价夹内才可以这样拼接
        • join(__dirname, '文件名')

  1. const path = require('path');
  2. // join -- 智能拼接路径
  3. // console.log(path.join('a', 'b', 'c')); // a/b/c
  4. // console.log(path.join('a', 'b', 'c', 'index.css')); // a/b/c/index.css
  5. // a里面有b,b里面有../c,言外之意,c和b同级。
  6. // console.log(path.join('a', 'b', '../c', 'index.js')); // a/c/index.js
  7. // __dirname 永远表示当前js文件的绝对路径
  8. 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 => {})
        • 异步写入文件(把内容添加到文件里面)
        • 特点:
            1. 如果文件不存在,会自动创建文件(但是不会递归创建)
            1. 如果文件里面有内容,再写入新内容,会把原来的内容覆盖掉
          • 3.不能写入数组和对象(只能写字符串)
  1. // 解构赋值
  2. let { readFile, writeFile } = require('fs')
  3. // -------------------------- readFile() -------------------------
  4. // 作用:异步读取文件(获取文件里面的内容)
  5. // 语法:
  6. /**
  7. * readFile('文件名', 'utf-8', (err, data) => {
  8. * err 表示错误信息(如果正确没错误,err=null; 如果读取错误,err=对象)
  9. * data 表示读取的结果
  10. * })
  11. */
  12. readFile('09-test.txt', 'utf-8', (err, data) => {
  13. // 有错误,则抛出错误信息
  14. if (err) throw err // throw抛出错误,遇到throw,后续的代码不再执行
  15. // 没有错误,则输出读取的结果
  16. console.log(data)
  17. })
  18. // -------------------------- writeFile() --------------------------
  19. // 作用:把一段字符,放到文件中保存。
  20. // 语法:
  21. /**
  22. * writeFile('文件名', '内容', err => {
  23. * err 表示错误信息(如果正确没错误,err=null; 如果读取错误,err=对象)
  24. * })
  25. */
  26. // 特点:
  27. // 1. 如果文件不存在,会自动创建文件(但是不会递归创建)
  28. // 2. 如果文件里面有内容,再写入新内容,会把原来的内容覆盖掉
  29. writeFile('10-test.txt', '明天放假,整理笔记', err => {
  30. if (err) throw err
  31. console.log('写入成功')
  32. })

小案例 — 封装四个函数,分别有增删改查的功能

  1. // 调用方法时,获取books.json的数据,log输出---------------------------------
  2. function query() {}
  3. query()
  4. // 调用方法时添加图书-------------------------------------------------------
  5. function add (obj) {}
  6. add({"bookname": "三国演义","author": "罗贯中","publisher": "三国出版社"})
  7. // 调用方法时根据id删除图书-------------------------------------------------
  8. function del(id) {}
  9. // del(4)
  10. // 调用方法时修改数据-------------------------------------------------------
  11. function update(obj) {}
  12. update({id:7,booksname:'朝花夕拾',author: '罗贯中',publisher: '三国出版社'})

JSON 文件内容

  1. [
  2. {
  3. "id": 2,
  4. "bookname": "西游记",
  5. "author": "唐僧",
  6. "publisher": "大唐出版社"
  7. },
  8. {
  9. "id": 4,
  10. "bookname": "水浒传",
  11. "author": "宋江",
  12. "publisher": "大宋出版社"
  13. },
  14. {
  15. "id": 7,
  16. "bookname": "红楼梦",
  17. "author": "曹雪芹",
  18. "publisher": "大清出版社"
  19. }
  20. ]

全部代码

  1. // 先导入需要使用的方法
  2. const {join} = require('path')
  3. const {readFile,writeFile} = require('fs')
  4. const { json } = require('stream/consumers')
  5. // 获取books.json的绝对路径
  6. const filePath = join(__dirname,'books.json')
  7. // 调用方法时,获取books.json的数据,log输出----------------------------------
  8. function query() {
  9. readFile(filePath,'utf-8',(err,data) => {
  10. if(err) throw err
  11. let arr = JSON.parse(data)
  12. console.log(arr)
  13. })
  14. }
  15. // query()
  16. // 调用方法时添加图书--------------------------------------------------------
  17. function add (obj) {
  18. readFile(filePath,'utf-8',(err,data) => {
  19. if(err) throw err
  20. let arr = JSON.parse(data)
  21. let id = arr[arr.length - 1].id + 1
  22. obj.id = id
  23. arr.push(obj)
  24. // writeFile 会覆盖 所以先读取数据,转换成数组添加上之后,在覆盖原有的,达到添加的效果
  25. writeFile(filePath,JSON.stringify(arr),err => {
  26. if(err) throw err
  27. console.log('添加成功')
  28. })
  29. })
  30. }
  31. // add({"bookname": "三国演义","author": "罗贯中","publisher": "三国出版社"})
  32. // 调用方法时根据id删除图书--------------------------------------------------
  33. function del(id) {
  34. readFile(filePath,'utf-8',(err,data) => {
  35. if(err) throw err
  36. let arr = JSON.parse(data)
  37. let result = arr.filter(item => item.id != id)
  38. writeFile(filePath, JSON.stringify(result),err => {
  39. if(err) throw(err)
  40. console.log('删除成功')
  41. })
  42. })
  43. }
  44. // del(4)
  45. // 调用方法时修改数据--------------------------------------------------------
  46. function update(obj) {
  47. readFile(filePath,'utf-8',(err,data) => {
  48. if(err) throw err
  49. let arr = JSON.parse(data)
  50. let i = arr.findIndex(item => item.id == obj.id)
  51. arr.splice(i,1,obj)
  52. writeFile(filePath,JSON.stringify(arr),err => {
  53. if(err) throw err
  54. console.log('修改成功')
  55. })
  56. })
  57. }
  58. update({id:7,booksname:'朝花夕拾',author: '罗贯中',publisher: '三国出版社'})

第三方模块

非node自带的模块。也不是自定义的模块。
是别人写的模块,然后发布到npm网站,我们可以使用npm工具来下载安装别人写的模块。
第三方模块,都是在node核心模块的基础之上,封装了一下,实现了很多非常方便快速简洁的方法。

如果你想实现一个功能。那么请搜索第三方模块,没有做不到的事情,只有你搜不到