Node.js 是一个基于 Chrome V8 引擎 的 JavaScript 运行时环境
下载
https://nodejs.org/zh-cn/download/
创建项目
mkdir node
cd node
npm init -y
新建 index.js 文件
const { readFile } = require('fs')
readFile('./package.json', { encoding: 'utf-8' }, (err, data) => {
if (err) {
throw err;
}
console.log(data)
})
输入 package.json 文件
node index.js
在同一个设备上如何快速切换Node.js 版本?
版本管理工具:
当 Node.js 执行 I/O 操作时,会在响应返回并恢复操作,而不是阻塞线程并浪费CPU 循环等待
Node.js 保持了 JavaScript 在浏览器中单线程的特点
优点:
缺点:
浏览器为例,浏览器是多进程,JS 引擎单线程
Browser 进程:浏览器主进程,只有一个
插件进程:插件使用时才创建
GPU 进程:最多一个用于3D 绘制
渲染进程:页面渲染、JS执行、事件处理
兼容Windows 和*nix 平台,主要得益于在操作系统与Node 上层模块系统之间构建了一层平台架构
Node.js 在大部分领域都占有一席之地,尤其是I/O密集型的
Node.js 支持 CommonJS 模块规范,采用同步机制加载模块
// greeting.js
const prefix = 'hello';
const sayHi = function () {
return prefix + 'world';
}
module.exports = {
sayHi
}
// index.js
const { sayHi } = require('./greeting');
sayHi();
exports = module.exports = { }
// greeting.js
const prefix = 'hello';
const sayHi = function () {
return `${prefix} world`;
}
exports.sayHi = sayHi;
// index.js
const { sayHi } = require('./greeting');
sayHi();
CommonJS 中 exports、require、module、__filename、__dirname 变量
function (exports, require, module, __filename, __dirname) {
const m = 1;
module.exports.m = m;
}
加载方式:
npm 包查找原则:
require('lodash')
require.cache
require.cache 中缓存着加载过的模块,缓存的原因:同步加载
// 有缓存
const mod1 = require('./foo');
const mod2 = require('./foo');
console.log(mod1 === mod2); // true
//无缓存
function requireUncached(module) {
delete require.cache[require.resolve(module)];
return require(module);
}
const mod3 = requireUncached('./foo');
console.log(mod1 === mod3); // false
文件
var fs = require("fs") // 引入 fs 模块
fs.readFile(filename, [options], callback); //读取文件
fs.writeFile(filename, data, [options], callback); // 写文件
fs.appendFile(filename, data, [options], callback); //以追加的方式写文件
fs.open(filename, flags, [mode], callback); //打开文件
fs.mkdir(path, [mode], callback); //创建目录:
fs.readdir(path, callback); //读取目录
fs.exists(path, callback); //查看文件与目录是否存在
Path 模块
var path = require("path") // 引入 path 模块
path.basename(path[, ext]); //返回path的最后-部分
path.dirname(path); // 返回path的目录名
path.normalize(path);//路径解析,得到规范路径
path.isAbsolute(path); //判断路径是否是绝对路径
path.relative(form,to); //方法根据当前工作目录返回从from 到to的相对路径
path.resolve([...paths]); //将路径或路径片段的序列解析为绝对路径
OS 模块
var os = require("os") //引入 os 模块
os.cpus(); //返回每个逻辑cpu内核信息
os.hostname(); //返回操作系统的主机名
os.platform(); //返回标识操作系统平台的字符串
os.userInfo([options]); //返回关于当前有效用户的信息
NPM 是Node.js 中的包管理器,提供了安装、删除等其它命令来管理包
常用命令:
package.json 文件
更多 package.json 配置
https://docs.npmjs.com/cli/v7/configuring-npm/package-json
依赖
私有 npm
其它
目的:读取 package.json 中main 字段对应的文件内容
问题:如何解决回调地狱?
const fs = require('fs')
fs.readFile('./package.json', { encoding: 'utf-8' }, (err, data) => {
if (err) throw err;
const { main } = JSON.parse(data);
fs.readFile(main, { encoding: 'utf-8' }, (err, data) => {
if (err) throw err;
console.log(data)
})
})
Promise 是一个具有四个状态的有限状态机,其中三个核心状态为 Pending(挂起),Fulfilled(完成)、Rejected(拒绝),以及还有一个未开始状态。
使用 Promise , 实现读取 package.json 中 main 字段对应的文件内容
const { readFile } = require('fs/promises')
readFile('./package.json', { encoding: 'utf-8' }).then(res => {
return JSON.parse(res);
}).then(data => {
return readFile(data.main, { encoding: 'utf-8' });
}).then(res => {
console.log(res);
})
如何将 Callback 转为 Promise 形式?ugl.promisify
function promisify(fn, receiver) {
return (...args) => {
return new Promise((resolve, reject) => {
fn.apply(receiver, [...args, (err, res) => {
return err ? reject(err) : resolve(res);
}]);
});
};
}
const readFilePromise = promisify(fs.readFile, fs);
await 函数使用 try catch 捕获异常(注意并行处理)
const { readFile } = require('fs/promises')
async () => {
const { main } = JSON.parse(await readFile('./package.json', { encoding: 'utf-8' }));
const data = await readFile(main, { encoding: 'utf-8' });
console.log(data);
}
Event
发布订阅模式,Node.js 内置events 模块
比如 HTTP server on('request') 事件监听
//发布订阅模式
const EventEmitter = require('events');
class MyEmitter extends EventEmitter { }
const myEmitter = new MyEmitter();
myEmitter.on('event', () => {
console.log('an event occurred!');
});
myEmitter.emit('event');
// server 监听request 事件
const http = require('http');
const server = http.createServer((req, res) => {
res.end('hello')
});
server.on('request', (req, res) => {
console.log(req.url);
});
server.listen(3000);
搭建一个最简单的HTTP 服务?Node.js 内置HTTP 模块
const http = require('http');
http.createServer((req, res) => {
res.end('hello World\n');
}).listen(3000, () => {
console.log('App running at http://127.0.0.1:3000/')
})
Koa —— 基于 Node.js 平台的下一代Web 开发框架 Koa 它仅仅提供了一个轻量优雅的函数库,使得编写Web 应用变得得心应手, 不在内核方法中绑定任何中间件
const Koa = require('koa');
const app = new Koa();
app.use(async ctx => {
ctx.body = 'Hello World';
});
app.listen(3000, () => {
console.log('App running at http://127.0.0.1:3000/')
});
执行过程
Koa 应用程序是一个包含一组中间件函数的对象,它是按照洋葱模型组织和执行的
常用中间件
Koa 中间件繁多,质量参差不齐,需要合理选择,高效组合...
开源:ThinkJS / Egg ...
内部:Turbo、Era、Gulu ...
它们做了什么?
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。