美文网首页
node.js基础

node.js基础

作者: AAA前端 | 来源:发表于2021-08-06 09:53 被阅读0次

    node.js是什么

    Node.js不是代码库、不是框架,node是一个js运行的环境:简单点来讲就是node.js可以解析和执行JavaScript代码(v8引擎:v8负责编译js代码、处理调用栈、内存分配、垃圾回收等操作)。

    node.js应用

    • 开发服务器应用程序
      • 结构一


        image2021-5-31 11_38_36.png

    这种结构通常应用在微型站点(个人博客,公司官网):node服务器完成站点请求的处理、响应、和数据

    • 结构二
      这种结构应用很广泛


      image2021-5-31 11_40_26.png

    node服务器当一个中间层,只是简单的把请求转发给后端服务器(减轻服务器压力),数据存在后端服务器上(大量数据:产品数据,物流数据,用户数据信息...)。

    node服务器不做任何与业务逻辑有关的事情,绝大部分时候,只做简单的转发请求,但可能会有一些额外的功能

    • 简单的信息记录:请求日志、用户偏好,广告信息......

    • 静态资源托管:js,css,img......

    • 缓存:访问量量高的页面,做缓存

    node数据库存放轻量级数据。

    node强项:大量吞吐量、异步,没有线程切换开销

    node全局对象global

    setTimeout

    setInterval

    setImmediate : setTimeout 0 异步

    console

    __dirname : 获取当前模块所在的目录,不是global属性

    __filename:获取当前模块的文件路径,不是global属性

    process:

    • cwd():放回当前nodejs进程的工作目录,绝对路径

    • exit():强制退出当前node进程

    • platform:获取当前的操作系统

    • kill(pid):杀死进程 pid:进程id

    • env:获取环境变量对象

    • nextTick(): 微任务

    node事件循环

    image2021-5-31 11_42_33.png

    timers:存放定时器回掉函数 检查每一个计时器,有没有达到计时时间,到达了就将会掉放入事件队列的,等待执行

    poll:轮训等待队列

    • 除了timers、check,绝大部分会掉函数都放入该队列,比如文件读取,监听用户请求

    • 运作方式:

      • 如果poll中有回掉,依次执行回掉,直到队列清空,进入下一阶段。
      • 如果poll中没有回掉,如果其他队列中将会出现回掉,则等待其他队列中出现回掉,结束该阶段,进入下一阶段。
      • 如果没有任何要等待执行的回掉,就立即结束。
        check 检查阶段:使用setImmediate的回掉会直接进入这个队列,事件循环到这就会执行

    setImmediate(function () {
    console.log('setImmediate延迟执行');
    });
    setTimeout(function () {
    console.log('setTimeout延迟执行');
    },0);

    // 执行结果
    koolearn@koolearndeMBP  ~/workfile/node  node ./src/d
    setImmediate延迟执行
    setTimeout延迟执行
    koolearn@koolearndeMBP  ~/workfile/node  node ./src/d
    setImmediate延迟执行
    setTimeout延迟执行
    koolearn@koolearndeMBP  ~/workfile/node  node ./src/d
    setImmediate延迟执行
    setTimeout延迟执行
    koolearn@koolearndeMBP  ~/workfile/node  node ./src/d
    setImmediate延迟执行
    setTimeout延迟执行
    koolearn@koolearndeMBP  ~/workfile/node  node ./src/d
    setTimeout延迟执行
    setImmediate延迟执行
    koolearn@koolearndeMBP  ~/workfile/node 

    // 事件循环,进入timers,什么也没有,进入poll,没有回掉,等待计时器,5秒过后回掉放入timers队列,往后执行
    setTimeout(function f1(){
    console.log('setTimeout');
    },5000)
    var http = require('http')
    var server = http.createServer()
    server.on('request', function (request,response) {
    console.log('收到客户端的请求了')
    })
    server.listen(3000)

    // 事件循环,进入timers,什么也没有,进入poll,没有回掉,等待文件读取结束,开一个计时器,0秒过后放入timers队列,同时往check里放setImmediate回掉,poll阶段结束,进入check执行。
    fs.readFile('./index.json', () => {
    setTimeout(() => {
    console.log('fs =》1');
    },0);
    setImmediate(() => {
    console.log('fs =》2');
    });
    });

    事件循环中,每次打算执行一个回掉之前,都会先清空nextTick和promise队列,nextTick队列优先级最高

    // e.js
    setImmediate(() => {
    console.log(1);
    })
    process.nextTick(() => {
    console.log(2);
    process.nextTick(() => {
    console.log(3);
    })
    })
    console.log(4)
    Promise.resolve().then(() => {
    console.log(5)
    process.nextTick(() => {
    console.log(6);
    })
    })

    node模块化细节

    require函数
    当执行一个模块或使用require时,会将模块放置在一个函数环境中

    模块的查找

    • 绝对路径

    • 相对路径 ./或../ 相对于当前模块,转换为绝对路径,去加载模块

    • 相对路径: require('abc')

      • 优先从缓存加载

      • 检查是否是内置模块,如,http、fs

      • 检查当前路径的node_modules

      • 检查上级目录的node_modules,

      • 转换为绝对路径,加载模块

    • 后缀名 如果不提供后缀名,自动补全,js、json、node、mjs

    • 文件名

      • 如果仅提供目录,不提供文件名,则自动寻找该目录中的index.js

      • package.json中的main字段

      • 表示包的默认入口,导入或执行包时,若仅提供目录,则使用main补全入口,默认值是index.js

    module对象
    记录当前模块信息

    // a.js
    exports.a = 1;
    this.b = 2
    module.exports = {
    b: 3,
    c: 4,
    };
    /* module.exports.c = 3;
    module.exports.d = 4; */
    this.e = 5;

    最开始:this == exports == module.exports 他们指向同一个引用,改变引用就会出错
    不能给this赋值, 会报错

    最终返回的是module.exports

    简单http服务

    // 1. 加载http核心模块
    var http = require('http')
    // 2. 使用 http.createServer() 方法创建一个 Web 服务器 ,返回一个 Server 实例
    var server = http.createServer()
    // 3. 服务器要干嘛?
    // 提供服务:对数据的服务
    // 对发出的请求进行接受,处理请求
    // 发送响应
    // 注册 request 请求事件
    // 当客户端请求过来,就会自动触发服务器的 request 请求事件,然后执行第二个参数:回调处理函数
    // request请求对象,response对象
    server.on('request', function (request,response) {
    console.log('收到客户端的请求了')
    })
    // 4. 绑定端口号,启动服务器
    server.listen(3000, function () {
    console.log('服务器启动成功了,可以通过 http://127.0.0.1:3000/ 来进行访问')
    })
    //server简写方式
    var http = require('http')
    http
    .createServer(function (req, res) {
    // 简写方式,该函数会直接被注册为 server 的 request 请求事件处理函数
    })

    .listen(3000, function () {
    console.log('running...')
    })

    相关文章

      网友评论

          本文标题:node.js基础

          本文链接:https://www.haomeiwen.com/subject/scdvvltx.html