快速了解node.js

142 阅读6分钟

什么是node.js

含义:node.js并非是一种语言,而是通过js实现的,只不过运行的方式不同;- 把浏览器内的 JS 解析引擎拿出来, 和其他的内容进行组装,- 变成一个 新的内容, 叫做 NodeJS

前端js 和 node.js的区别

  • 前端js:
    • JS 被引入到 HTML 文件中, 放在浏览器中执行的时候 (JS 的组成: BOM + DOM + ECMAScript)
    • 这时候是可以使用BOM和DOM的
    • 运行时可以操作模块发开发(ES6 模块化), 也可以采用非模块开发
  • node.js:
    • 把 JS 从 HTML 文件中拿出来, 放在 电脑系统中直接运行
    • 此时不能使用BOM和DOM
    • 因为在电脑系统中运行,可操作文件、文件夹(I/O; input/output)、电脑系统、数据库
    • 运行时 必须采用 模块化开发,使用的 模块化语法 是 CommonJS
  • node.js的作用
    • 按照 CommonJS 模块化开发语法的规范进行书写代码
    • 能够使用 js 这个语言进行后端的开发

命令行基本操作

  • 打开命令窗口(小黑窗)
    • win: cmd / powerShell;然后回车
    • MAC
      • 方式 1: 直接打开终端; 打开的是 操作系统的根目录
      • 方式 2: 直接拖拽文件夹到终端图标; 此时打开的就是当前文件夹下的
  • 命令窗口的基本指令
    • 查看当前目录的内容
      • 输入指令: dir
    • 切换目录
      • 输入指令: cd 文件夹名称
    • 退回上一级目录
      • 输入指令: cd ..
    • 清屏
      • win: cls
      • mac: clear
  • 使用node运行js代码
    • 方式 1:
      • 打开 小黑窗, 目录无所谓
      • 输入命令: node 按下回车
      • 会进入 JS 代码编辑模式
        • 此时是不能执行 cmd 命令的, 只能书写 JS 代码
      • 按下 ctrl + c 退出当前环境
      • 缺点: 书写的代码无法保存
  • 方式 2:
    • 把你要执行的 JS 代码 书写在一个 .js 文件内
    • 打开命令行, 切换目录到 JS 文件所在的目录
    • 输入指令: node 文件名

node模块化开发

node所有自带的内容都是以模块化的形式出现的,所以必须使用模块化

  • 导出
    • 每个js文件天生自带一个变量叫module,示的是当前自己这个模块的所有信息,每个文件默认导出一个对象
    • 语法“
      • module.exports.属性名 = 属性值
      • exports.属性名 = 属性值
      • node 的 每一个 JS 文件, 内部天生自带一个 变量 叫做 exports
      • 内部存放的是 指向 module.exports 这个对象的 地址
      • 也可以直接修改module.exports = 值
  • 导入
    • 每一个 JS 文件天生自带一个方法叫做 require()
    • 语法: require('地址') 注意: 如果地址书写的时候, 文件后缀是 .js, 那么可以省略后缀不写
    • 返回值: 该文件的 module.exports (该文件向外暴露的内容)
  • 模块分类
    • 自定义模块(自己写的)
    • 内置波快(node给我们提供的,直接引入就可以使用)
    • 第三方模块
      • 由其他人写好上传到某一个仓库内(npm)
      • 我们去这个仓库内(npm)下载到本地, 然后引入使用

node的内置模块

node 给出的内置模块, 专门用来操作 文件/文件夹

  • 内置fs模块

    1. 异步读取文件:
      • 语法:fs.readFile(文件路径, 配置参数, 回调函数)
      • 参数
        • 文件路径:必填
        • 配置参数:不写默认是 buffer 可以手动配置为 utf-8
        • 回调函数:必填, 接受两个参数, 第一个为报错信息, 第二个为正确读取到的文件的内容(字符串格式的)
    fs.readFile("./index1.txt", "utf-8", (error, data) => {
        if (error) return console.log(error);
        console.log(data);
    });
    
    1. 同步读取文件
      • 语法:fs.readFileSync(文件路径, 配置参数)
      • 参数:与同步读取相同
       let str = fs.readFileSync("./index1.txt", "utf-8");
       console.log(str);
    
    1. 异步写入文件
      • 语法: fs.writeFile(文件地址, 写入内容, 回调函数)
      • 参数:
        • 文件地址:
          • 这个文件, 直接将内容写入到指定文件内
          • 没有这个文件, 创建一个出来, 然后写入到指定文件内
      • 写入内容:
        • 字符串格式的内容, 将这段文本直接写入到指定文件中, 并覆盖这个文件之前的所有内容
      • 回调函数:
        • 必写, 哪怕这个函数什么也不做, 也必须要写
    fs.writeFile("./index.txt", "你好 世界", () => {
        console.log("写入完成");
    });
    
    1. 异步写入
    fs.writeFileSync("./index.txt", "hello word");
    console.log("node end");
    

node 自带的模块, 专门用于和路径相关的操作

  • 内置path模块
    • 组装一个相对路径 path.join(路径片段 1, 路径片段 2, 路径片段 3)
    const res = path.join("a", "b/c", "d", "e.html");
    console.log(res); // a\b\c\d\e.html
    
    • 组装一个绝对路径 path.resolve(路径片段 1, 路径片段 2, 路径片段 3)
    const res1 = path.resolve("a", "b/c", "d", "e.html");
    const res2 = path.resolve("C:", "b/c", "d", "e.html");
    console.log(res1); // C:\Users\41099\Desktop\qianfeng-prepares-lessons\06_周\05_天\code\06_内置模块path\a\b\c\d\e.html
    console.log(res2); // D:\b\c\d\e.html
    
    • 组装一个解析路径 path.parse(路径)
    const res = path.parse(
        "C:/Users/41099/Desktop/qianfeng-prepares-lessons/06_周/05_天/code/06_内置模块path/a/b/c/d/e.html"
    );
    console.log(res);
    /*
        {
            // 根路径
            root: 'C:/',
            // 完整文件目录(截止到目录, 不会到文件)
            dir: 'C:/Users/41099/Desktop/qianfeng-prepares-lessons/06_周/05_天/code/06_内置模块path/a/b/c/d',
            //  完整文件名
            base: 'e.html',
            // 文件后缀名
            ext: '.html',
            // 文件名
            name: 'e'
        }
    */
    

node 自带的模块, 专门用来操作 url 地址的

  • 内置url模块
    • 语法:url.parse('地址', 是否深度解析);
      • 地址:必填
      • 是否深度解析:默认false,可手动传入true;深度解析就是将对象中的query解析为对象格式
    const res = url.parse(
        "http://www.baidu.com:8080/a/b/c/index.html?key=value&name=QF001&age=18#abc",
        true
    );
    console.log(res);
    /*
        Url {
            // 协议
            protocol: 'http:',
            slashes: true,
            auth: null,
            // 域(域名+端口号)
            host: 'www.baidu.com:8080',
            // 端口号
            port: '8080',
            // 域名
            hostname: 'www.baidu.com',
            // hash值
            hash: '#abc',
            // 携带的参数
            search: '?key=value&name=QF001&age=18',
            // 查询字符串
            query: 'key=value&name=QF001&age=18',
            // 路径名称
            pathname: '/a/b/c/index.html',
            // 路径(路径名称 + 参数)
            path: '/a/b/c/index.html?key=value&name=QF001&age=18',
            // 完整地址
            href: 'http://www.baidu.com:8080/a/b/c/index.html?key=value&name=QF001&age=18#abc'
        }
    
        深度解析后的
        Url {
            ...
            query: [Object: null prototype] { key: 'value', name: 'QF001', age: '18' },
            ...
        }
    

node 自带的一个模块, 用于开启一个 http 服务

  • 内置http模块
    1. 创建服务
      • 语法: http.createServer(函数)
        • 函数: 每当前端有一个请求访问这个服务器的时候, 就会执行一次
      • 返回值: 一个服务
    const server = http.createServer(() => {
        console.log("前端发一次请求, 我就执行一次");
    });
    
    1. 给当前服务配置一个端口号
      • 语法: server.listen(端口号(0~65535), 回调函数)
    server.listen(8080, () => {
        console.log("启动服务成功~~~");
    });
    
    1. 创建函数时 函数接收的两个参数
      • 第一个 形参: request, 对应的值为前端请求时携带的请求报文
      • 第二个 形参: response, 表示本次响应的相关信息, 你只要添加到 res 内, 会由服务器自动组装响应报文返回给前端
    const server = http.createServer((request, response) => {
        if (request.url === "/a") {
            response.end("hello pageA");
        }
        if (request.url === "/b") {
            response.end("hello pageB");
        }
    });
    server.listen(8080, () => {
        console.log("启动服务成功~~~");
    });