模块、Node 调度与资源生命周期
连接模块声明、检查、装载和执行,并说明 Promise、事件循环、并行、取消与清理。
从一个 import 追到执行
模块说明导出什么,装载器决定地址怎样找到文件,工具链决定产物怎样生成。TypeScript 能解析一个别名,运行环境仍可能找不到它。paths 本身不改写运行时导入;框架别名或打包器配置需要与检查配置对齐。TypeScript 模块参考
Node 的 ESM 与 CommonJS 分别具有导入、导出、扩展名和互操作规则。package.json 的 type、.mjs/.cjs、包的 exports 与条件决定可见入口。发布包时应核对声明文件和运行产物共同表达的接口,消费方不依赖未公开的深层文件。
{
"name": "@example/rules",
"type": "module",
"exports": {
".": {
"types": "./dist/index.d.ts",
"import": "./dist/index.js"
}
}
}这是仅展示 ESM 接口的教学片段;构建还需真实生成两份产物。要支持 CommonJS,另建立并检查对应产物,不能只补一个指向错误文件的条件。
Promise 怎样接续工作
Promise 表示将来完成或拒绝的结果。创建它可能已经启动工作;await 暂停当前异步函数的继续部分,让宿主能安排其他工作,随后在结果可用时接续。同步 CPU 运算仍会占用当前执行线程。
async function loadTwo() {
const first = load('first');
const second = load('second');
return Promise.all([first, second]);
}假定 load 启动独立 I/O,这段让两次等待重叠。Promise.all 的拒绝不会自动取消仍在运行的另一项操作。需要停止它时,应把取消信号传给真正支持取消的依赖,并处理清理。
Node 将 JavaScript 回调、微任务和不同阶段的宿主回调协调起来。定时器给出可被调度的条件,繁忙执行可能延迟回调。相同 API 在不同调用位置、模块形态和 Node 版本下的观察顺序需要核查;本页不提供无条件的 timer 与 immediate 排名。Node 事件循环指导
并发和并行怎样区分
多个 I/O 可以同时等待,回调仍按宿主规则在 JavaScript 线程执行。worker threads 可以让独立计算在其他线程运行,进程可以形成更强的隔离;二者都增加通信、资源和生命周期责任。CPU 密集操作可以阻塞 API 响应,即使它包在 async 函数中。
流式处理在读取、处理和输出之间传递分块。背压使上游知道下游暂时无法接收更多,避免把全部数据积累在内存。流错误和停止还需要销毁或关闭相应资源。Node Streams
取消怎样传到资源
AbortController 发出取消信号。支持该信号的操作可以停止等待或处理,已经产生的外部效果仍可能存在。连接超时也不能单独证明服务端未写入。
函数取得文件、连接或订阅后,应定义释放者与释放时机。try/finally 能处理正常返回和抛错路径;进程崩溃、外部强制终止及错误退出仍需持久化或恢复条件。服务停机通常先停止接受新工作,再等待或中止在途工作,最后关闭资源。
最后更新于