当我开始学习 Node.js 时,我意识到了一件事:它不仅仅是关于“如何在 Node 中编写代码”,而是关于了解事物内部是如何运作的。
为了探索这种好奇心,我构建了我的第一个小型(作业级别)项目:NanoNode ——Node.js CLI 的一个迷你克隆。
您可以运行:
nanonode path_to_file.js ...它将执行该文件,就像你输入的那样:
node path_to_file.js 👉(在npm上查看:)
它很简单。它对任何人都没用。但它很酷,因为它帮助我把理论和实践以一种持久的方式联系起来。
🌱 火花:模块为何存在? 一切都始于一个问题: 💭 为什么首先需要模块系统?
如果没有模块,所有内容都会存在于一个巨大的文件中。 共享和重用代码变得痛苦。 模块化使得大型系统易于维护。 这自然而然地让我想到: 为什么我们同时拥有 CommonJS 和 ES6 模块?
在 JavaScript 出现之前,CommonJS 就是 Node 的解决方案。 ES6 模块成为 JavaScript 的原生标准。 随着技术的发展,两者共存,但历史不会在一夜之间消失。
🔍 追寻神秘module 当我第一次看到的时候module.exports,我很困惑:
💭这个module物体到底是从哪里来的?
它不在我的代码里。是谁放在那里的?
经过挖掘,我发现:
-Node.js 实际上将每个文件都包装在一个函数中(模块包装器)。- 这就是为什么像module、require、exports这样的参数__dirname会神奇地存在。- 这就是为什么顶级变量是本地的,而不是真正的全局的。
以下是每次在 Node.js 中运行文件时发生的情况的简化框架:
IIFE - Immediately Invoked Function Expression (function (exports, require, module, __filename, __dirname) {
// 👇 Your code goes here console.log("Hello World");
// By default, module.exports = {} })( // the argument values here); 这也解释了为什么:
每个文件都可以安全地拥有自己的module.exports。 require(path)作品 定位文件 将其包装在此函数中 执行它 返回module.exports 那一刻,我终于能在脑海里勾勒出函数内部是如何require运作的了。那一刻,我恍然大悟。
🔧 我从构建 NanoNode 中学到的东西 为了将这份好奇心转化为现实,我编写了 pari.js,一个模拟 Node CLI 的脚本。在此过程中,我学到了:
Shebang(#!/usr/bin/env node)→允许您直接运行脚本,无需node前缀。 环境变量和 PATH →当您键入命令时系统如何找到可执行文件。 可执行权限→为什么chmod +x file重要。 npm 发布 →如何让包能够全局安装npm install -g。 所有这些都来自一个只需运行文件的东西。😅
为什么这个小项目很重要 这个项目本身很小,但收获却很大:
我现在了解了 Node 如何在后台引导代码。 我练习了打包和发布 npm 模块。 我了解了 Node 中本地范围和真正全局范围之间的区别。——最重要的是:理论变得实用,因为我将它与目标联系起来。 正如夏洛克所说,这些学习现在都存储在我的思维殿堂🏰中。
👀 下一步:一个有用的 CLI 工具 如果 NanoNode 是我的系统级 hello-world,那么我的下一个项目就是解决实际问题的东西:
⚡ Snapi:用于测试 HTTP 请求的快速、轻量级 CLI
我们都使用 Postman 或 Insomnia 之类的工具进行 API 测试。它们功能强大,但是:
它们很重。 它们需要时间来加载。 如果您只是想测试一个快速请求,那么它们就太过分了。 所以我想:为什么不构建一个快速、轻量级、基于终端的请求测试器?
类似于:
req-test GET
并立即看到:
响应状态 标题 JSON 主体(美观打印) 🎯 它为什么应该存在 因为开发人员通常只需要一些快速且最少的功能——没有 UI 开销,没有额外的点击,只需输入命令即可查看结果。
与Postman相比轻量级。 原生于终端工作流程。 对于动态调试 API很有用。 这次,与 NanoNode 不同,它真的很有用。😉
请继续关注——我的下一篇博文将会讨论这个主题!
✨ 结束语 构建 NanoNode 让我明白,小项目可以带来大见解。
有时候,你不需要构建下一个独角兽应用程序。即使是一个很小的实用程序也能将你的理解提升到一个新的水平。
👉 NanoNode 链接www.xzsgwhzx.cn/category-11…
下次,我将分享我构建 Snapi(一个 CLI 请求测试器)的历程。相信我,你一定会想用这个。