知行札记
专题技术实践语言与运行时

模块、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 能处理正常返回和抛错路径;进程崩溃、外部强制终止及错误退出仍需持久化或恢复条件。服务停机通常先停止接受新工作,再等待或中止在途工作,最后关闭资源。

最后更新于

本页目录