• Node.js


    1.概念

    官方概念:官方概念:Node.js 是一个基于 Chrome V8 引擎 的 JavaScript 运行时

    Chrome V8引擎: chrome浏览器用来解析和执行js代码的工具;

    运行时:理解为一个容器,用来运行代码的环境

    因此可以更加通俗的解释Node.js是

    一个用chrome浏览器V8引擎来跑JS代码的环境。  它不是一个js文件,而是一个软件 

    • 浏览器是javascript的前端运行环境;
    • Node.js是javascript的后端运行环境;

    需掌握的知识点

    它只是一个环境,不是一门语言,因此我们只需掌握它的两个内容:模块系统,npm包管理工具

    模块系统:能用不同的模块来完成不同的功能,例如:创建web服务器,写接口,连接操作数据库

     

     npm包管理工具:通过npm来管理我们的需要的第三方包,为后续学习框架打下基础

    下载

    官网 中文网    

    版本说明

    • LTS: 长期稳定版(Long Term Support))。 项目开发建议使用长期稳定版
    • Current: 最新版。最新版包含了一些新功能,如果想学习最新的功能,则可以使用该版本。最新版可能会有一些未知的bug。

    安装完成之后,页面没有图标按钮;

    测试是否安装成功

    打开任意一个小黑窗,输入node -v能够看到Nodejs版本号即为安装成功。

    2.在Node环境下运行js代码

    ①步骤

    1. 准备js文件。准备好要被执行的js文件
    2. 写命令来运行 

              格式  node  文件目录 .js  在命令行工具中写命令来运行这个文件

    例如

    1. node index.js
    2. node 01.js # 01.js就是当前目录下
    3. node a/01.js # 01.js在目录a下面

    最好是在.js文件所在目录下来运行这个js文件

    ②拓展 

    常用的命令行下的命令及按键

    1. node 空格 某个js文件 # 调用 node 程序,运行某个js文件
    2. clear 或者 cls # 清空界面
    3. ls/dir # 查看列表(list)
    4. cd 目录名 # 进入到目录中去
    5. cd .. # 返回上一级目录
    6. cd \ # 直接回到根目录
    7. Ctrl+C # 停止 Node 程序
    8. 输入部分文件名后按下 Tab 键 // 补全文件名 或 目录名, 多次tab会进行切换
    9. ↑ ↓ 上下箭头 # 切换历史输入

    3. Node.js和浏览器端的区别

    在浏览器

    js由三部分组成: ECMAScript + BOM + DOM

    es6 就是ECMAScript 6.0的简写,也泛指其之后的所有版本

    ECMAScript是一种由Ecma国际(前身为欧洲计算机制造商协会,European Computer Manufacturers Association)通过ECMA-262标准化的脚本程序设计语言。是javascript语言的一个标准。它约定了:如何定义变量,函数,运算,数组,内置对象等等。

    在nodejs端

    ECMAScript + 内置模块(fs, http, path,.....)。在nodejs中是没有BOM、DOM、window,但使用ECMAScript是通用的

    简单来说就是

    NodeJS中没有DOM,也没有BOM,也没有window对象。

    4.nodejs中的模块分类

    每个模块都是一个独立的文件。每个模块都可以完成特定的功能,我们需要时就去引入它们,并调用。

    4.1核心模块fs

    (1)理解核心模块

    ●核心模块就是 Node 内置的模块,需要通过唯一的标识名称来进行获取。

    ●每一个核心模块基本上都是暴露了一个对象,里面包含一些方法供我们使用。
    ●一般在加载核心模块的时候,变量(或常量)的起名最好就和核心模块的标识名同名。
    ●例如:const fs = require('fs'), const path = require('path')

    1. const path = require('path')
    2. console.log(path)

    (2)fs模块

    fs模块(fs是 FileSystem的简写)是Node.js用来进行文件操作的模块,它属于核心模块。你引入之后就可以直接使用了。

    官方手册:fs 文件系统 | Node.js API 文档

    使用步骤

    1.引入模块

    1. // 引入模块
    2. const fs = require('fs');
    3. // 可以使用var、let,但是建议使用const,因为我们不希望它被改变。
    4. // 名字不必大写成FS,一般也就叫fs这个名字。

    2.调用api实现自己的要求

    fs.各种API(实参)

    4.2fs-readFileSync-文件读取

    1. const fs = require("fs")
    2. let rs = fs.readFileSync('文件路径',"utf8")
    3. // rs 就是读出来的内容
    4. console.log(rs)

     注意:api的名字结尾有Sync(async是异步的,sync表示同步的)

    捕获同步格式中的错误对象

    如果读成功,则会获取读出来的数据,如果失败了,则会中断后续所有的代码执行。
     

    1. console.log(1)
    2. let res = fs.readFileSync('errorPath.js')
    3. console.log(res)
    4. console.log(2) // 这句代码是不会执行的

     解决方案:用try.catch结构

    1. // try catch
    2. // try {
    3. // 可能会有错误的代码
    4. // } catch(err){
    5. // 如果try内的代码有错误,就会进入catch,并把错误传进来
    6. // }

     输入下列代码

    1. try {
    2. const fs = require("fs")
    3. let rs = fs.readFileSync('文件路径',"utf8");
    4. console.log(rs)
    5. } catch(err) {
    6. console.log(err)
    7. }

    fs-writeFileSync-文件写入

    writeFileSync

    功能:向指定文件中写入字符串, 如果没有该文件则尝试创建该文件。

    格式:

    1. fs.writeFileSync(pathName, content, option);
    2. // 参数1: 要写入的文件路径 --- 相对路径和绝对路径均可,推荐使用绝对路径
    3. // 参数2: 要写入文件的内容
    4. // 参数3: 配置项,设置写入的字符集,默认utf-8

     注意:它是覆盖写入,会把文件中的内容全部删除,再填入新的内容。

    示例1: 写入.txt文件

    任务:写入约定文本内容

    1. const fs = require('fs')
    2. fs.writeFileSync('./a.txt', 'hello world! \n 换一行')

    示例2: 写入JSON数据

    稍微把问题提升一下,问: 如何把数据写入文件中?

    1. const fs = require('fs')
    2. const data = [{name: '小王', age: 20}]
    3. fs.writeFileSync('./a.txt', data)

    上面的写法会出错: data不是一个字符串或者是Buffer

    解决方式: 调用JSON.stringify先对内容做处理,转成字符串,再保存
     

    1. const fs = require('fs')
    2. const data = [{name: '小王', age: 20}]
    3. fs.writeFileSync('./a.txt', JSON.stringify(data))

     路径问题-相对路径的隐患

    假如  有如下两个文件,它们所处的目录及文件名如下所示

    1. pageA
    2. └── code
    3.    ├── readFile.js # 用来读txt
    4.    └── rs.txt # 文本文件,具体的内容没有影响

     readFile.js用来读出rs.txt中的内容,并显示。它的代码是这样的:

    1. // code/readFile.js
    2. const fs = require('fs');
    3. fs.readfilesync("./rs.txt",'utf8');
    4. //注意这里对fs.txt的访问使用的是相对"readFile.js" 本身的路径

     由于readFiles.js和要读取的目标rs.txt是在同级目录下,所以可以写相对路径。

     运行代码

    根据当前所处的位置不同,有两种运行代码的方式

    • A方案:如果终端中的路径定位在pageA/code目录下,则通过node readFile.js就可以运行
    • B方案:如果终端中的路径定位在pageA目录下,通过:node code/readFile.js 能成功执行.js文件,但是却找不到.txt文件的路径了。

    原因分析

    我们在fs中读取文件时,由于使用的是相对路径,所以在读这个文件的时,nodejs会去:

    运行命令的小黑窗的路径 + 代码中的相对路径 找它。

    B方案在运行时,找到的文件是pageA/rs.txt,它就找到不文件了

    解决方法:就是在操作文件时,使用绝对路径来定位文件

    那我们先回顾下,绝对定位跟相对定位

    例如

    1. <a href="./index.html">主页-相对地址a>
    2. <a href="https://www.baidu.com/index.html">主页-绝对路径a>

    在nodejs, 我们提到的相对/绝对路径理解如下:

    • 绝对路径: 从磁盘根目录开始到指定文件的路径。
    • 相对路径:是以某个文件的位置为起点,相对于这个位置来找另一个文件。

    __dirname __filename 获取绝对路径

    nodejs中提供了两个全局变量来获取获取绝对路径:

    • __filename:获取当前被执行的文件的绝对路径
    • __dirname:获取当前被执行的文件的文件夹所处的绝对路径

    全局变量的含义是:

    • 变量:它们的值是变化的。在不同的文件中值就不同,因为文件的路径也不同嘛。
    • 全局:在任意地方都可以直接使用。

    在文件操作时,使用绝对路径

    只需要在读入文件时,在文件名的前面拼接上路径:

    1. // 拼接html5.jpg的绝对路径
    2. // 1) 找到当前文件夹的绝对路径
    3. console.log(__dirname)
    4. // 2) 加上 html5.jpg
    5. const fs = require('fs')
    6. const filePath = __dirname + '\\rs.txt'
    7. // 走一步,看一步
    8. console.log(filePath)
    9. const rs = fs.readFileSync(filePath)

     4.3path模块

    作用

    作用是用来处理路径问题:拼接,分析,取后缀名等等。

    ●官网文档地址
    ●是node中的核心模块之一

    使用步骤

    1.引入模块

    const path  = require('path')

    2.使用模块

    调用API

    常用的api

    • path.basename() :此方法返回 path 的最后一部分。一般可用来获取路径中的文件名。
    • path.join() :路径拼接。
    • path.parse(pathurl) :把一个路径转成一个对象
    1. path.basename('/foo/bar/baz/asdf/quux.html');// 返回: 'quux.html'
    2. path.basename('/foo/bar/baz/asdf/quux.html', '.html');// 返回: 'quux'
    3. path.dirname('/foo/bar/baz/asdf/quux');// 返回: '/foo/bar/baz/asdf'
    4. path.extname('index.html');// 返回: '.html'

     注意:path模块并不考虑其中地址是否真的存在,只是单纯调用方法,获取结果。

    使用path模块解决文件读写中的路径拼写

    1. // 拼接html5.jpg的绝对路径
    2. // 1) 找到当前文件夹的绝对路径
    3. console.log(__dirname)
    4. // 2) 加上 html5.jpg
    5. const fs = require('fs')
    6. const path = require('path')
    7. const filePath = path.join(__dirname, 'html5.jpg')
    8. // const filePath = __dirname + '\\html5.jpg'
    9. // 走一步,看一步
    10. console.log(filePath)
    11. fs.readFile(filePath,function(err, data) {
    12. if(err) {
    13. console.log(err)
    14. return
    15. }
    16. console.log(data)
    17. })

     附:path模块常用方法列表

    方法

    path.basename(path[, ext])

    path.dirname(path)

    path.extname(path)

    path.format(pathObject)

    path.join([...paths])

    path.parse(path)

    path.resolve([...paths])

    附: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.existsSync(absolutePath)

    判断路径是否存在

    小结

    1.nodejs是什么

          a.是一个基于chrome v8引擎的JavaScript运行时(简单来说是一个用chrome浏览器V8引擎来跑JS代码的环境)

          b.它不是一个新语言,它只是一个环境,用来运行js代码

    2.与浏览器的区别?

            a.nodejs中没有dom,bom,window,只有ECMAScript

    3.学它目的

            a.它是用来写后端功能,帮助我们了解后端程序员是如何工作

            b.提升竞争力,会后端优先

            c.后边学习前端框架的基础

    4.学什么?

            a.模块系统(核心模块fs,path,自定义模块(),第三方模块())

            b.npm操作

    5.fs:用来做文件(文件夹)操作:读/写/删除/创建......

    6.path:做路径相关的操作path.join()

    7.__dirname, __filename : 在nodejs中,表示全局变量。用来获取绝对路径。

            a.__dirname:获取当前被执行的文件所在的文件夹的绝对路径

            b.__filename:获取当前被执行的文件的绝对路径

  • 相关阅读:
    Visual Studio的使用
    制造型企业的数字化转型离不开 MES 系统
    编写基于冒泡排序算法的qsort函数
    Talk | SIGGRAPH‘23 Best Paper 秦颖思:分罗曼三维显示器—各点独立变焦显示技术
    IEEE Transaction期刊修改过程记录
    猿创征文|pandas实现将矩阵导出到excel+对矩阵进行连接
    PX4模块设计之三十三:Sensors模块
    第十三天Tensorflow数据读取和复杂模型的构建
    Springboot+vue的医患档案管理系统。Javaee项目,springboot vue前后端分离项目。
    【第24例】华为 IPD 体系 | RMT 需求管理团队
  • 原文地址:https://blog.csdn.net/LJM51200/article/details/126208492