Node 遵循 Commonjs 规范,规范的核心是通过 require 来加载依赖的其他模块。我们已经常习惯于使用社区提供的各种库,但对于模块引用的背后原理知之甚少。...这篇文章通过源码阅读,浅析在 commonjs 规范中 require 背后的工作原理。 require 从哪里来?...大家都知道,在 node js 的模块/文件中,有些“全局”变量是可以直接使用的,比如 require, module, __dirname, __filename, exports。.../helkyle/node_modules', '/Users/node_modules', '/node_modules' 需要注意的是,在使用 npm link 功能的时候,被 link 模块内的...使用方式是在需要被 mock 的文件模块同级目录下的 __mock__ 文件夹添加同名文件,执行测试代码时运行 jest.mock(modulePath),jest 会自动加载 mock 版本的 module
,它告诉系统调用后面声明的解释器,而我们需要调用的解释器是 node,执行 /usr/bin/env node 可以寻找到系统 $PATH 里第一个出现的 node 命令。.../bar 4 实际执行的是 node ./bar 4,第一个参数是解释器命令 node,第二个是被执行的程序路径。而我们这里只需要第三个参数。...(process.argv.slice(2)) console.log(argv) 使用不同的命令执行一下这段代码试试: 之后你便可以灵活地通过 argv 来判断如何输出用户期望的内容了。...这里用 CAC 举个简单的例子,介绍一下如何使用: // 假设把它放在 cli.js 里 const cli = require('cac')() // 定义一个命令 cli.command('hi'.../node_modules/.bin。 这里的命令指程序中的命令,比如 git 程序中有个命令叫 log,你可以通过执行 git log 使用。 ↩
与这些工作在后台的 APIs 相搭配的是,我们要提供一个 回调(callback)函数,用以负责在 Web API 一旦完成后执行相应的 JS 代码。...,是 栈一旦为空的时候 稍倾,栈将会执行 callback 回调函数 下面来看看当我们具体使用 setTimeout Web API 时,所有事情是如何一步接一步工作的。...但在 node 中,能在后台做到几乎大部分的事情,尽管那只是个简单的 JS 程序。但是,这是如何做到的呢?...Node.js 也使用了 Google’s V8 engine 提供 JS 运行时,却没有局限于其事件循环;而是使用 libuv库 (用 C 写的) 与 V8 的事件循环一同工作,从而扩展了可以在后台所做之事...Node 遵循了类似于 Web APIs 的回调机制,并以和浏览器相似的方式工作。 ? 如果比较一下浏览器那张图和上面这张 node 的图,可以看到其相似之处。
中间件的这种“链”使你可以对代码进行划分并创建可重用的中间件。 编写 Express 中间件的要求 你需要安装一些东西来创建、使用和测试 Express 中间件。首先需要 Node 和 NPM。...所有例子都应在 Node ver 8+ 和NPM ver 5+ 下使用。 本文使用了 Express 4.x 版。这很重要,因为从 3.x 版到 4.x 版有重大的更改。...假设你在 web 网络服务器上正在使用 Node.js 和 Express 运行Web应用程序。在此应用中,你需要登录的某些页面。...第三方级别的中间件 在某些情况下,我们将向后端添加一些额外的功能。先安装 Node.js 模块获取所需的功能,然后在应用级别或路由器级别将其加载到你的应用中。...原文:https://www.thirdrocktechkno.com/blog/how-Node-JS-middleware-works/
前言:在服务器软件中,如何处理请求是非常核心的问题。不管是底层架构的设计、IO 模型的选择,还是上层的处理都会影响一个服务器的性能,本文介绍 Node.js 在这方面的内容。...Node.js TCP 服务器的实现 Node.js 服务器的底层是 IO 多路复用 + 非阻塞 IO,所以可以轻松处理成千上万的请求,但是因为 Node.js 是单线程的,所以更适合处理 IO 密集型的任务...下面看看 Node.js 中服务器是如何实现的。 启动服务器 在 Node.js 中,我们通常使用以下方式创建一个服务器。...下面是 Node.js 中创建服务器的例子。...另外 Node.js 本身是不会处理 HTTP 请求体的数据,当 Node.js 解析到请求体时会执行 kOnBody 钩子函数,对应的是 parserOnBody 函数。
我们可以为特定事件添加更多的 listener,而不必修改现有的侦听器或触发事件的应用程序部分。我们所谈论的是观察者模式。 ?...Node的异步事件驱动架构具有一些被称为“emitters”的对象。它们发出命名事件,这些事件会调用被称为“listener”的函数。发出事件的所有对象都是 EventEmitter 类的实例。...使用它,我们可以创建自己的事件: 一个例子 让我们使用内置的 events 模块(我建议你查看这个文档:https://nodejs.org/api/events.html)以获取对 EventEmitter...同样重要的是 当多个 listener 被附加到单个事件时,它们将按照附加的顺序同步执行。...listener 是完全独立的函数。
RESTful API 是基于 REST 架构风格的 API 设计,它使用标准的 HTTP 方法(GET、POST、PUT、DELETE 等)来进行资源的操作和交互。...统一接口:API 应该使用统一的接口规范,包括统一的命名规则、返回数据格式和错误处理方式等。Node.js 提供了丰富的工具和模块,使我们能够轻松地构建符合 RESTful API 设计的应用程序。...安装和设置 Express 框架Express 是一个流行的 Node.js Web 框架,它提供了简洁而灵活的 API,用于构建 Web 应用程序和 RESTful API。...你可以运行以下命令启动服务器:node index.js然后,你可以使用工具(如 Postman)来测试 API 的各个路由和功能。...总结本文介绍了如何使用 Node.js 和 Express 框架构建 RESTful API。
大家好,我是前端西瓜哥。今天我们来研究一下 Node.js 是如何做 GC 的。 GC,Garbage Collection,垃圾回收。...在编程中,一般指的是内存自动回收机制,会定时将不需要用到的数据进行清除。 Node.js 底层使用了 V8 引擎。...堆:存放对象等数据; 堆内存 Node.js 底层使用的是 V8,下面讲解一下 V8 的内存回收机制。 首先 JS 中所有的对象都会保存在堆内存中。...因为 Buffer 是 Node.js 特有的处理二进制的对象,它不是在 V8 中的实现的,是 Node.js 用 C++ 另外实现的,不通过 V8 分配内存,属于堆外内存。...我使用电脑是 macbook pro M1 Pro,Node.js 版本为 v16.17.0,使用的 V8 版本是 9.4.146.26-node.22(通过 process.versions.v8 得到
很多时候,我苦恼于 Node.js 的调试,只会使用 console.log 这种带有侵入性的方法,但是其实 Node.js 也可以做到跟浏览器调试一样的方便。...本文环境: mac Chrome 94.0.4606.81 node v12.12.0 vscode Version: 1.61.1 本文示例 本文示例采用的是之前探索洋葱模型的,仅有一个文件,就是根目录下...这个链接是 Node.js 和 Chrome 之前通信的 websocket 地址,通过 websocket 通信,我们可以在 Chrome 中实时看到 Node.js 的结果。...如何进入 Chrome 的调试界面 第一种方式(自己尝试无效) 打开 http://localhost:8888/json/list,其中 8888 是上面 --inspect 的参数。...总结 本文总结了两种常见的调试 Node.js 的方式。第一种 Node.js 通过 websocket 的方式将信息传递给 Chrome 浏览器,我们直接在 Chrome 中进行调试。
这是一篇为初学者详细介绍如何在 Node.js 中使用 TypeScript的指南。本指南将涵盖基础知识、开发环境的设置以及一些实用的代码示例。...什么是 Node.js?Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时。它允许开发者使用 JavaScript 编写服务器端代码。...的示例在这一部分,我们将通过一个实际的示例来展示如何在 Node.js 项目中使用 TypeScript。...使用 VS CodeVisual Studio Code (VS Code) 是一款非常流行的代码编辑器,特别适合 TypeScript 和 Node.js 开发。...使用 Nodemonnodemon 是一个用于自动重启 Node.js 应用的工具,在开发过程中非常有用。
引言Node.js是一种基于Chrome V8引擎的JavaScript运行时环境,广泛用于构建高性能的服务器端应用程序。...通过使用Node.js,我们可以简化后端开发过程,并利用丰富的npm生态系统来管理和共享代码。本文将介绍如何使用npm创建Node.js项目,并讨论项目初始化、依赖管理和脚本配置等方面的内容。...以下是一个示例:"scripts": { "start": "node index.js", "test": "mocha"}在上述示例中,"start"脚本用于启动应用程序,"test"脚本用于运行测试...总结通过使用npm,我们可以轻松创建和管理Node.js项目。通过初始化项目、安装依赖、配置脚本等操作,可以更好地管理项目的开发过程和依赖关系。...希望本文对你理解如何使用npm创建Node.js项目有所帮助。
由于XML仍然继续用作数据交换格式(主要是在企业应用程序中),因此了解如何以编程方式操纵XML文件的内容可能非常有用。...您可以轻松地在Node.js中编写一个小的脚本来立即进行更改,而不必手动编辑数百行XML。...在 之前的文章中,我们研究了如何通过使用开源 xml2js模块将XML文件转换为Node.js中的JSON对象。 今天,您将学习如何使用Node.js编辑XML文件。...基本设置 首先,通过在终端中键入以下命令,将xml2js模块添加到您的Node.js应用程序中: $ node install xml2js --save 接下来,创建一个名为index.js的新JavaScript...运行上面的代码,您应该在与Node.js脚本文件相同的目录中看到一个由更新的XML生成的新XML文件。
Node.js的基本使用 Vscode中的Node.js代码提示插件: npm install –save-dev @types/node 1....Node客户端与服务端JS的区别: 浏览器JS部分: 变量、运算符、流程控制、数据类型、DOM、BOM 服务端node.js只有一个部分: ECMAScript 在node.js中不能执行DOM、BOM...// 使用node环境下的node命令来执行代码 tab键补全 function fn(x, y) { return x + y } console.log(fn(1, 2)) 2 .模块化开发思想...导入fs模块-fs在node.js中 let fs = require('fs') 2....写入文件 writeFile 参数1: 文件路径 参数2: 要写入的数据 参数3: 文件编码 默认是本身数据格式 参数4: err => {} fs.writeFile('.
本文来讲下 express 框架的使用,变异的环境是 VS Code ,这里我已经配饰了阿里的镜像,所有 npm 指令用 cnpm 代替 首先学会向 Node.js 种引入 express 非常建党只需两步...cnpm install express -save 到此为止 express 救成功导入了 这里介绍一个技巧: 输入: cnpm install -g nodemon 这样一来以后每次测试,救不要关闭 node...现在开始讲 express 的使用: 准备部分(包的导入) var express = require('express'); var app = express(); 最简单的一个使用: 向服务器请求时...(3000);console.log('listening to port 3000'); 搜索:‘ http://localhost:3000/api/69999/next/dkshkjh ’,输出的是...app.listen(3000);console.log('listening to port 3000'); 关于发送数据: 这里介绍一下 Postman 大家可以自行根据网上教程下载 基本使用到这里为止
大家好,我是前端西瓜哥,今天我们来看看 Node.js 模块查找的原理。 模块种类 模块有三种来源。 核心模块:Node.js 内置的包。比如 http、fs、path; 自定义模块:NPM 包。...比如 axios、express,位于 node_modules 目录下的同名目录,并通过 package.json 的 main 字段指定入口文件; 文件模块:项目自己的模块文件,使用路径的写法。...后缀按顺序添加为:.js 、.json、.node,找到就立即返回。若一个文件没有后缀但被匹配到了,它会被当作 js 文件。 上面没说缓存的情况,其实我们会对模块做缓存,下面详细说明一下。...Node.js 内置的模块也需要缓存,但它不会记录到 Module._cache 中,而是保存在 Module....下面是一个例子,index.js 导入了 a.js,a.js 下引入了 lodash.get 包,模块缓存结果为: 因为缓存的存在,所以 一个模块文件只会被执行一次,然后将 module.exports
作者:张挺(作者授权转载) 地址:https://mp.weixin.qq.com/s/Pb51aYdrxAALM_wR4asDgg 日志,是开发者排查问题的非常重要的手段,有时候甚至是唯一的,所以如何合理并正确的打印日志...$ DEBUG=* node app.js 由于 debug 模块由 TJ 出品,并且在非常早的时候就投入,使用过于广泛,至今仍有非常多的模块使用了它。...,使用的是 NODE_DEBUG 环境变量,应该是特意和 debug 模块做了区分。...$ NODE_DEBUG=foo node app.js 被动记录的方式 除了上面提到的类 console 等方式,我们常见的就是各种日志库默认记录的日志,由于这些日志平时只是默默的记录,并不会过多关注...这样一套下来,相信你对 Node.js 打印日志的方式更加的了解,也在排错时游刃有余了。
日志,是开发者排查问题的非常重要的手段,有时候甚至是唯一的,所以如何合理并正确的打印日志,成了开发时的重中之重。...Node.js 中打日志的方式,一般有几种: 1、主动展示 2、被动记录 这两种方式都可以由不同的模块来实现,我们接下去就来看看怎么选择。...$ DEBUG=* node app.js 由于 debug 模块由 TJ 出品,并且在非常早的时候就投入,使用过于广泛,至今仍有非常多的模块使用了它。...,使用的是 NODE_DEBUG 环境变量,应该是特意和 debug 模块做了区分。...$ NODE_DEBUG=foo node app.js 被动记录的方式 除了上面提到的类 console 等方式,我们常见的就是各种日志库默认记录的日志,由于这些日志平时只是默默的记录,并不会过多关注
本文所有的代码均基于 node.js 14 LTS 版本分析 概念 进程是对正在运行中的程序的一个抽象,是系统进行资源分配和调度的基本单位,操作系统的其他所有内容都是围绕着进程展开的 线程是操作系统能够进行运算调度的最小单位...由于对于开发者来说是单线程,所以在 Node.js 日程开发中通常不会存在线程竞争的问题和线程锁的一些概念 子进程 从上面的单线程机制可知 Node.js 使用事件循环机制来实现高并发的 I/O...; }) .listen(8000); } 如何解决多个工作进程监听一个端口的问题 从 js 层面分析 入口区分 - 子进程环境变量含NODE_UNIQUE_ID,在创建子进程时传入...#Server - lib/_http_server.js#Server 继承于 TCP 的lib/net.js#Server listen方法调用的是lib/net.js#Server // lib/...如果是则关闭与客户端的连接,并让其与工作进程进行通信。
Node.js 的事件驱动模型是由事件循环机制实现的,本文将详细介绍 Node.js 的事件循环原理、工作流程和一些常见问题。什么是事件循环?事件循环是一种处理和调度异步操作的机制。...事件循环的工作流程Node.js 的事件循环由几个主要组件组成,包括事件队列、触发器、回调函数和事件循环本身。...以下是事件循环的工作流程:初始化:启动 Node.js 程序后,事件循环会进行初始化操作,包括设置定时器、注册事件处理器等。...而在 Node.js 中,事件循环是单线程的,只使用一个主线程来处理所有的事件和回调函数。这使得 Node.js 具有更高的性能和可扩展性,并避免了线程切换的开销。...本文详细介绍了事件循环的原理、工作流程和常见问题,希望能帮助你理解和应用 Node.js 的事件循环机制。
Goroutines的通常用法是根据需要创建尽可 能的Groutines,成百上千甚至上万的。这种用法对于那些习惯了使用C++或Java的程序员来讲可能会有些奇怪。...创建这么多 goroutines势必要付出不菲的代价?一个操作系统线程使用固定大小的内存作为它的执行栈,当线程数增多时,线程间切换的代价也是相当的 高。...最后,虽然你无法直接控制Go运行时创建的线程的数量,但可以通过调用runtime.GOMAXPROCS(n)方法设置变量GOMAXPROCS来设 定使用的处理器核的数量。...提高使用的处理器核数未必能提升你的程序的性能,这取决于程序的设计。程序剖析诊断工具(profiling tool)可以用来检查你的程序使用处理器核数的真实情况。 © 2014, bigwhite....本文来自:Tony Bai 感谢作者:bigwhite 查看原文:Goroutine是如何工作的
领取专属 10元无门槛券
手把手带您无忧上云