在 fs 回调等 I/O 回调里创建的 Promise.then 和 setImmediate 谁先执行?
围绕“在 fs 回调等 I/O 回调里创建的 Promise.then 和 setImmediate 谁先执行”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕必须利用 poll 阶段后先清空微任务再进入 check 的规则判断微任务先执行。
程序员面试题库第 58 页,收录第 2851–2900 题,共 5000 道完整解析,覆盖前端、JavaScript、React、Vue、Node.js、AI Agent、网络、数据库与系统设计。
按稳定语义路径排序
围绕“在 fs 回调等 I/O 回调里创建的 Promise.then 和 setImmediate 谁先执行”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕必须利用 poll 阶段后先清空微任务再进入 check 的规则判断微任务先执行。
围绕“Node.js 中 new Promise 的 executor 是同步还是异步执行,这对错误捕获有什么影响”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须明确 executor 同步执行且其抛错转为 rejection,区别于 then 回调的微任务时机。
围绕“在 Node.js 中嵌套的 Promise.then 链与多个并行 Promise 的回调按什么顺序交错执行”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答要按 FIFO 队列逐次入队的规则推演链式与并行 then 的交错顺序。
围绕“Node.js 中每个事件循环阶段结束后微任务队列是如何被清空的”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明每个阶段回调执行完即清空 nextTick 与微任务队列,而非整个循环结束才执行。
围绕“Node.js 的 queueMicrotask() 与 process.nextTick、Promise.reso”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须比较三者进入的队列及错误处理行为差异,说明 queueMicrotask 属标准微任务队列。
围绕“官方建议哪些场景使用 process.nextTick,例如保证回调总是异步的 API 设计”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须给出统一同步/异步回调时机、在事件派发前让调用者先绑监听器等官方场景。
围绕“为什么在 Node.js 中递归调用 process.nextTick 会导致 I/O 饿死,而递归 setImme”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要解释 nextTick 在阶段间持续清空阻塞循环推进,setImmediate 每轮只执行一次。
围绕“process.nextTick 队列和 Promise 微任务队列都清空时谁先执行?为什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须给出 nextTick 队列优先于 Promise 微任务队列的结论并解释队列分离的实现。
围绕“如何在运行期程序化地获取当前 Node.js 版本的内置模块清单”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕必须介绍 module.builtinModules 与 module.isBuiltin 的用法差异,不罗列具体内置模块。
用三个独立 CommonJS 文件复现循环依赖中的初始化顺序,区分复制属性值与保留导出对象引用,解释 module.exports 重新赋值的风险,并给出拆分依赖和显式初始化的改法。
围绕“CommonJS 模块里的 exports、require、module 等变量是从哪来的”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要解释模块被包装进函数并注入五个参数的编译机制。
区分 require ESM 的引入版本、默认启用和警告变化,解释同步模块图、间接顶层 await、返回命名空间与动态 import 的边界,避免只按 Node 大版本判断兼容性。
沿文件扩展名、最近 package.json 和歧义输入语法检测定位 Node.js 模块格式,给出嵌套包作用域示例,说明动态 import、构建工具和命令行输入的区别。
围绕“exports 中 require、import、node、default 等条件的匹配顺序如何决定”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明按对象键顺序匹配、node 应置于 require/import 之前的规则。
围绕“Corepack 如何在团队内统一锁定 yarn/pnpm 的版本”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 packageManager 字段声明与 corepack enable 的生效机制及与 npm 的关系,不比较三个包管理器优。
围绕“在 ESM 文件里如何拿到可用的 require 函数以加载 CJS 资源”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须给出 createRequire(import.meta.url) 的标准用法及其解析基准路径语义。
围绕“dependencies 与 devDependencies 的划分在库和应用两种场景下判断标准有何不同”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答要按「运行期是否被 require」及「库的消费者是否安装」两条线说明。
围绕“为什么 Node.js 废弃了 exports 里的 './features/*' 目录映射式写法”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须指出带尾斜杠的目录映射已废弃、应改用 '*' 模式替代。
围绕“同时发布 CJS 与 ESM 双格式的包为什么会导致 instanceof 判断失效”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要解释同一库被加载为两份独立模块状态的危害及条件导出如何缓解。
解释 Node.js 如何为 CommonJS 合成命名导出,复现动态属性可默认导入却不能可靠命名导入的情况,区分静态检测、属性读取和 ESM 实时绑定,并讨论包升级与转译差异。
围绕“ESM 导出的值在导入方为什么能感知后续变化,与 CJS 有何本质不同”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须讲清 ESM 导入是只读活绑定而 CJS 是值快照的差异及一个可观察场景。
围绕“Node.js 的 module customization hooks(resolve/load)能解决什么 CJ”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 hooks 在独立线程拦截解析与加载的能力及 module.register 的接入方式。
围绕“ESM 中没有 __dirname 和 __filename,如何等价获取当前模块路径”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须给出 import.meta.url 配合 fileURLToPath 的标准做法。
围绕“为什么 ESM 中相对路径 import 必须写全扩展名而 CJS 可以省略”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须指出 ESM 解析不做扩展名补全与目录索引推断的设计原因及 .js 指代 .mjs 之类的边界。
围绕“Node.js 中 import assertions 与 import attributes 的语法演进要点是什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须指出 assert 关键字已被 with 取代的版本背景与兼容写法。
围绕“在 Node.js ESM 中如何正确 import 一个 JSON 文件”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须给出 import attributes(with { type: 'json' })写法及其与 CJS require 直接加载 。
围绕“import.meta.resolve 在 Node.js 中解决什么实际问题”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明它在不执行模块的情况下解析 specifier 为 URL 的用途与同步特性。
围绕“依赖包的 preinstall/postinstall 脚本为何是供应链攻击的常见入口,如何缓解”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明安装期脚本以用户权限执行任意代码的风险及 --ignore-scripts、CI 审查等缓解,不列举具体攻击事件。
围绕“package-lock.json 在可复现安装中起什么作用,为什么必须提交到仓库”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明锁定完整依赖树版本与 resolved 完整性信息的意义。
围绕“CommonJS 中 module.exports 与 exports 赋值有什么区别,为什么会踩坑”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 exports 是 module.exports 的引用、直接重赋值会断开引用的机制。
围绕“require('lodash') 这类裸说明符在 Node.js 中的完整查找路径是什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答要按官方算法讲清核心模块、文件/目录、node_modules 逐层上溯的优先级。
围绕“在 exports 中如何用嵌套条件表达「浏览器下用 ESM、Node 下用 CJS」这类组合”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须给出嵌套条件对象的合法结构与求值逻辑。
围绕“import 'fs' 与 import 'node:fs' 在 Node.js 中有实际区别吗”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 node: 前缀绕过 node_modules 同名包劫持的保证及哪些模块只能前缀加载。
围绕“npm audit 报告的漏洞应如何分级处置,audit fix --force 有什么风险”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明按可利用性与依赖类型分级、--force 可能引入 semver major 破坏的风险。
围绕“CI 流水线中为什么应该用 npm ci 而不是 npm install”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 npm ci 严格按 lockfile 安装、删除 node_modules、不修改锁文件的差异。
围绕“node_modules 中为什么会出现同一包的多份副本,npm dedupe 如何减少重复”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要解释版本区间不兼容导致嵌套安装及 dedupe 重排提升的机制。
围绕“publish 前如何用 npm pack 与 files 字段控制实际发布的包内容”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 files 白名单、.npmignore 与 npm pack --dry-run 预览的组合用法。
围绕“npx 执行未安装包时的查找顺序是什么,为什么它可能被滥用”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明本地 bin 优先、缺失时从 registry 下载执行的行为及包名仿冒风险。
围绕“optionalDependencies 安装失败时 npm 的行为与 dependencies 有何不同”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明失败不导致整体安装中止及代码侧需 try/catch require 的配合。
围绕“package.json 的 overrides 字段如何强制替换间接依赖的版本”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须给出 overrides 针对特定包路径与全局替换的写法及与 resolutions 的生态对应。
围绕“package.json 的 exports 字段相比 main 多解决了什么问题”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须讲清 exports 的子路径映射与封装未列出路径的能力。
围绕“exports 写成字符串和写成对象分别表示什么语义”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明字符串形式等价于 '.' 子路径映射的语法糖及与 main 的回退关系。
围绕“lockfile 中的 integrity 字段如何在安装时防止依赖被篡改”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要解释 Subresource Integrity 哈希在校验 tarball 内容中的作用及 tamper 后的失败表现。
围绕“package.json 的 main 字段在模块解析中扮演什么角色,缺省时如何回退”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 main 的路径语义、缺省回退到 index.js 及与 exports 共存时 exports 优先的规则。
围绕“peerDependencies 在 npm 7+ 被自动安装后,插件包作者需要注意什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明自动安装带来的版本冲突报错行为及 peerDependenciesMeta.optional 的缓解。
围绕“删除 require.cache 后重新 require 能否真正热更新模块,有什么残留风险”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明缓存键是绝对路径、删除后旧导出对象仍被旧引用持有的风险。
围绕“require.extensions 为什么被官方标记为废弃,替代做法是什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明其全局修改模块系统的副作用及推荐的编译前置或 hooks 替代。
围绕“一个包如何在自身代码里用包名引用自己的导出”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明自引用依赖 name 与 exports 同时存在且仅作用于包内部的限制。
围绕“package.json 中 ^1.2.3 与 ~1.2.3 实际允许安装到哪些版本”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须精确给出两者对 0.x 与 1.x 版本的不同边界行为。
围绕“package.json 的 imports 字段(# 前缀说明符)与 exports 有何分工”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 imports 仅对包内部生效、可映射到外部包的能力及与 exports 的解析隔离。