搜索

pdf文档 Node 的设计错误

767.84 KB 28 页 0 下载 134 浏览 0 评论 0 收藏
语言 格式 评分
中文(简体)
.pdf
3
摘要
文档主要讨论了Node.js在设计过程中的一些关键错误决策。首先,Node.js使用了GYP作为构建系统,这是一个导致长期问题的主要原因。其次,作者在2009年引入了Promise,但在2010年将其移除,导致异步API严重老化。此外,Node_modules的设计初衷良好,但在实践中带来了模块解析的复杂性。作者还反思了require函数不使用.js扩展名的决定,认为这不符合浏览器JavaScript的工作方式。最后,文档提到了Node.js在安全性方面的不足,尽管V8本身是一个很好的安全沙箱,但某些应用程序的安全性考虑不够。
AI总结
### Node.js 设计错误总结 这篇文档由 Node.js 的创造者 Ryan Dahl 在 2018 年的 JS Conf 柏林会议上发表,总结了 Node.js 在设计和实现过程中的一些主要遗憾和错误。以下是核心观点和关键信息的总结: --- #### 1. **构建系统(GYP)** - **问题**:GYP(Google YAML build)是 Node.js 的构建系统,但它是一个复杂的内部界面,暴露给试图绑定到 V8 的人,导致用户体验较差。GYP 被称为“披着 Python 外衣的假 JSON”,对用户来说是一个可怕的经历。 - **影响**:GYP 成为了 Node 核心最大的问题之一。由于 Chrome 放弃了 GYP,Node 成为了唯一的 GYP 用户,进一步加剧了问题。 - **建议**:作者本应提供一个核心的外部功能接口(FFI),而不是要求用户编写 C++ 代码来绑定到 V8。许多早期建议迁移到 FFI(例如 Cantrill 的建议)被忽视了。 --- #### 2. **不遵守“诺言”** - **问题**:Promise 在 2009 年被引入 Node,但在 2010 年被愚蠢地删除。Promise 是 async/await 的关键抽象,统一使用 Promise 可能会加快标准化和 async/await 的交付。 - **影响**:由于 Promise 的移除,Node 的许多异步 API 严重老化,导致开发体验和代码质量下降。 --- #### 3. **Node_modules 的复杂性** - **问题**:Node_modules 的模块解析算法过于复杂,偏离了浏览器 JavaScript 的语义。默认情况下,Node 会检查多个目录,而不是仅依赖 `NODE_PATH`。 - **影响**:这种设计偏离了浏览器的模块加载方式,增加了不必要的复杂性。 - **反思**:作者承认这是自己的错误,并表示很抱歉,但无法撤销这一设计。 --- #### 4. **require() 的设计问题** - **问题**:require() 函数在加载模块时省略了扩展名(如 `.js`),导致模块加载器需要额外猜测用户的意图。 - **影响**:这种设计不符合浏览器 JavaScript 的规范,增加了模块加载的不明确性和复杂性。 --- #### 5. **package.json 的设计** - **问题**:虽然 package.json 的大部分内容由 Isaac Z. 发明,但 Node 的 require() 函数通过检查 package.json 的 `main` 字段来加载模块,使得 NPM 成为了事实上的标准。 - **影响**:这种设计导致了一个模块化存储库的出现,可能对依赖管理造成影响。 --- #### 6. **安全性** - **问题**:V8 本身是一个非常安全的沙箱,但 Node 的设计没有充分利用这一点。例如,代码检查工具(如 linter)不应该拥有完全的系统和网络访问权限。 - **影响**:这可能导致 Node 在安全性方面失去一些其他语言无法获得的优势。 --- #### 7. **构建系统的持续问题** - **问题**:构建系统(GYP)的设计和实现非常困难且重要,但 Node 的构建系统最终成为了其核心问题之一。 - **影响**:V8 通过 Chrome 使用 GYP,Node 也切换到 GYP,但 Chrome 后来放弃了 GYP,使得 Node 成为了唯一的 GYP 用户,进一步暴露了问题。 --- ### 总结 Node.js 的设计初衷是创建一个用户友好的非阻塞框架,用于事件驱动的 HTTP 服务器。尽管它在一定程度上实现了目标,但作者 Ryan Dahl 在演讲中反思了 Node 的一些主要设计错误,包括: 1. **构建系统的复杂性(GYP)**:导致用户体验差,难以维护。 2. **Promise 的移除**:影响了异步 API 的标准化和 async/await 的发展。 3. **Node_modules 的复杂性**:偏离了浏览器 JavaScript 的语义。 4. **require() 的设计问题**:增加了模块加载的不明确性和复杂性。 5. **安全性问题**:未能充分利用 V8 的安全特性。 这些设计错误对 Node 的发展和用户体验造成了深远的影响。
P1
P2
P3
P4
P5
P6
P7
下载文档到本地,方便使用
- 可预览页数已用完,剩余 21 页请下载阅读 -
文档评分
请文明评论,理性发言.