NodeJS学习笔记


NodeJS适用于IO密集的webserver,是JavaScript在chrome的V8引擎下的runtime
是单进程,单线程的,但只是对应于主进程,将IO交给操作系统之后,操作系统可能是多线程调度的。也可以用cluster模块使多核对应多进程。

主特性

  1. 异步IO
  2. 时间驱动

CommonJS是nodejs模块规范

  1. 每个文件是一个模块,有自己的作用域(因为nodejs自动包裹了一个自调用函数(function(){…}))。
  2. 模块内部module变量代表模块本身。
  3. module.exports属性代表模块对外接口。

require

  1. /表示绝对路径,./表示相对于当前文件的,即当前文件夹下的文件。
  2. 支持js, json, node扩展名,不写依次尝试。
  3. 不写路径默认为build-in模块,或者各级node_modules内的第三方模块。
  4. module被加载时会执行(03_require.js),加载之后会被缓存。(04_cache.js)。所以console.log()要放到函数内部。
  5. 一旦出现某个模块被循环加载,就只输出已经执行的部分,还未执行的部分不会输出。一定要避免循环加载(05_main.js)

exports和module.exports

默认情况exports= module.exports。
但是不能改变exports的指向,即不能写exports=…。即不能重新赋值,重新赋值之后只是一个属性,module.exports永远都是标准输出。

global

在08_global.js定义了global.te = 100; 要想在别module使用te变量要先require(‘08_global’)。

path

  1. __dirname, __filename总是当前文件的路径
  2. process.cwd()返回的是执行node命令的路径

相对路径(比如./)

  1. require中是指挡前文件所在路径。(可以用相对路径)
  2. 其他位置是执行node命令的路径。(都用绝对路径)

buffer

  1. 用于处理二进制数据流(在global中)
  2. 实例类似整数数组,大小固定
  3. C++代码在V8堆外分配物理内存,创建时确定大小,没有办法调节。

util.promisify

这种方式可以将异步调用写成类似于同步调用的方式,但是在方法之前一定要添加await,否则返回的是promisify对象,不是字符串。所有的异步调用都要包裹在async function中。

const fs = require('fs');
const promisify = require('util').promisify;
const stat = promisify(fs.stat);
const readdir = promisify(fs.readdir);

module.exports = async function(req, res, filePath){
    try{
        const stats = await stat(filePath);
        if (stats.isFile()) {
            res.statusCode = 200;
            res.setHeader('Contengt-Type', 'text/plain');
            //fs.createReadStream(filePath).pipe(res);
        }else if (stats.isDirectory()) {
        //这一定要有await,否则返回的是promisify对象,不是字符串。
            const files = await readdir(filePath);
            res.statusCode = 200;
            res.setHeader('Contengt-Type', 'text/plain');
            res.end(files.join(','));
            
        }

    }catch(ex){
        console.error(ex);
        res.statusCode = 404;
        res.setHeader('Contengt-Type', 'text/plain');
        res.end(`${filePath} is not exist!`);
    }
    
    // res.statusCode = 200;
    // res.setHeader('Content-Type', 'text/plain');
    // res.write('Hello World');
    // res.end(filePath);

}

读模板

读模板的时候用同步读有两个原因

  1. 只读一次(在加载模块的时候读一次,之后在缓存里面);
  2. 以后要用完整的模板,所以要读完了才能执行下面的语句。

缓存

在这里插入图片描述
缓存一个logo这种不变的标志的时间可以是十年,当logo变了的话,可以换路径。

在这里插入图片描述

版本号x.y.z

x代表大版本,可以不向前兼容
y增加新功能,但是要向前兼容
z修改bug

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值