文章目录
NodeJS适用于IO密集的webserver,是JavaScript在chrome的V8引擎下的runtime
是单进程,单线程的,但只是对应于主进程,将IO交给操作系统之后,操作系统可能是多线程调度的。也可以用cluster模块使多核对应多进程。
主特性
- 异步IO
- 时间驱动
CommonJS是nodejs模块规范
- 每个文件是一个模块,有自己的作用域(因为nodejs自动包裹了一个自调用函数(function(){…}))。
- 模块内部module变量代表模块本身。
- module.exports属性代表模块对外接口。
require
- /表示绝对路径,./表示相对于当前文件的,即当前文件夹下的文件。
- 支持js, json, node扩展名,不写依次尝试。
- 不写路径默认为build-in模块,或者各级node_modules内的第三方模块。
- module被加载时会执行(03_require.js),加载之后会被缓存。(04_cache.js)。所以console.log()要放到函数内部。
- 一旦出现某个模块被循环加载,就只输出已经执行的部分,还未执行的部分不会输出。一定要避免循环加载(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
- __dirname, __filename总是当前文件的路径
- process.cwd()返回的是执行node命令的路径
相对路径(比如./)
- require中是指挡前文件所在路径。(可以用相对路径)
- 其他位置是执行node命令的路径。(都用绝对路径)
buffer
- 用于处理二进制数据流(在global中)
- 实例类似整数数组,大小固定
- 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);
}
读模板
读模板的时候用同步读有两个原因
- 只读一次(在加载模块的时候读一次,之后在缓存里面);
- 以后要用完整的模板,所以要读完了才能执行下面的语句。
缓存
缓存一个logo这种不变的标志的时间可以是十年,当logo变了的话,可以换路径。
版本号x.y.z
x代表大版本,可以不向前兼容
y增加新功能,但是要向前兼容
z修改bug