获取 git 仓库所有 tags 的原理 3. 学会调试看源码 4. 学会面试高频考点 promisify 的原理和实现 5. 等等 刚开始先不急着看上千行、上万行的源码。...用最新的VSCode 打开项目,找到 package.json 的 scripts 属性中的 test 命令。鼠标停留在test命令上,会出现 运行命令 和 调试命令 的选项,选择 调试命令 即可。...接下来重点讲述下这个函数的实现。 promisify函数是把 callback 形式转成 promise 形式。 我们知道 Node.js 天生异步,错误回调的形式书写代码。...接着我们来看 Node.js 源码中 promisify 的实现。...建议读者克隆我的仓库[11]动手实践调试源码学习。 后续也可以看看 es6-promisify[12] 这个库的实现。
Nodejs 8 有一个新的工具函数 util.promisify()。他将一个接收回调函数参数的函数转换成一个返回Promise的函数。...1、util.promisify()小例子 如果你给以下命令传入文件路径,则会输出文件内容 // echo.js const {promisify} = require('util'); const...directory, ··· } 2、使用async函数 同样的功能,但是通过async函数实现 // echoa.js const {promisify} = require('util');...因此不推荐传入一个非标准的回调函数,也不应该去转换我们自己实现的回调(ps:自己就直接写Promise就好了。。。)...安装 npm install util.promisify 使用方式有两种 第一种,检查是否有内置实现(Node 8)或者使用 polyfill (旧的Node版本) const promisify
可以看到Node中可能阻塞事件循环的任务,如:未提供异步API的I/O操作及CPU密集型任务会委托给worker thread pool来处理,不会影响到事件循环。 ?...Node event loop vs Browser event loop vs JavaScript event loop 不同的宿主环境有着各自的事件循环实现,下面一段摘录自JavaScript Event...实现Pomise.all 了解了异步方法调度原理,针对文章开头的场景,自己实现一个简化版的PromiseAll: async function PromiseAll(values) { // console.log...从流程图中可以比较清晰的看到,PromiseAll之所以会更快的得到结果,是因为func1和func2近似并行执行。...对比其它语言中的异步 其它编程平台如:.NET、Python也提供了async/await特性。在.NET中默认基于线程池来执行异步方法,Python则和JavaScript一样使用了协程。
工作中对于一些老项目,有 callback 的通常也会使用 util.promisify 进行转换,之前更多是知其然不知其所以然,本文会从基本使用和对源码的理解实现一个类似的函数功能。 1....Promisify 简单版本实现 在介绍 util.promisify 的基础使用之后,实现一个自定义的 util.promisify 函数的简单版本。...3.1 util.promisify 中的基本使用 和上面区别的地方在于 .then 接收到的是一个对象 { address, family } 先明白它的基本使用,下面会展开具体是怎么实现的 const...实现一个完整的 promisify 上面第一、第二节我们自定义实现的 mayJumPromisify 分别实现了含有 (err, result) => ... 和自定义 Promise 函数功能。...转 Promise、自定义 Promise 函数重写 util.promisify 返回值、Promisify 回调函数的多参转换三个方面进行了讲解,在理解了其实现之后自己也可以实现一个类似的函数。
以加法为例,现有远程API的模拟实现 addRemote const addRemote = async (a, b) => new Promise(resolve => { setTimeout(...() => resolve(a + b), 1000) }) 请实现本地的add方法,调用addRemote,能最优的实现输入数字的加法。...async function add(...inputs) { // 你的实现 } nodejs utils.promisify 接受error first的回调函数为参数异步函数转换为可以返回promise...的函数 // fs.loadFile 使用演示 fs.loadFile('..../xxxx.md').then(data => {}).catch(err => {}); 请实现 // 请实现 utils.promisify = function (fn) {
这种配有图文的图片,就比单单给一个硬邦邦的二维码要吸引人得多啦!你是不是也想试试做这种分享图呢?我们今天就来讨论一下如何实现这样的分享图。 实现这种合并图文的方案,选择无外乎就是在前端做还是在后端做。...如果在后端做的话,可选的技术方案还是挺多的,各种后端语言都有自己的绘图工具库,比如nodejs里可以用node-canvas来做,或者也可以通过调用一些图片编辑软件(如ImageMagic)来实现。...而在前端做的话,由于微信小程序也提供了一系列基于canvas的绘图相关API,所以绘制这样的图片还是比较简单易上手的,且调试起来也比较方便直观。所以,决定先在小程序前端这边来实现了。...保存到系统相册 接着,我们要把它保存进用户的系统相册中去,实现这个功能,我们主要靠wx.canvasToTempFilePath和wx.saveImageToPhotosAlbum这两个API。...const wxCanvasToTempFilePath = promisify(wx.canvasToTempFilePath) const wxSaveImageToPhotosAlbum = promisify
常用的方式 child_process(原生) Nodejs下引入模块child_process实现调用shell 调用的两种方式 child_process.exec(command[, options...方法,返回一个promise,如const { stdout, stderr } = await exec('rm -rf build') const exec = util.promisify(child_process.exec...`, { cwd: appPath }); } runClean(); 注意 util.promisify是在node.js 8.x版本中新增的一个工具,用于将老式的Error first...await使用 它封装并支持了很多git的方法,比如clone、commit、status、pull等等,将cmd命令和参数,传入即可 甚至可以用git.raw(),解析前端输入的git命令 安装 npm...: child_process 原生nodeAPI,需根据需要选型 shelljs Node的一个扩展插件、兼容性好,推荐使用 simple-git 专为git命令打造的插件,轻量好用 常用的命令 NodeJS
Node.js 10 中已经实现了对应的部分,BigInt 的正式支持有助于我们能够更加精确地去处理大整数类问题。...node_bash_completion 完成后,当我们在当前 bash 输入 node -- 后基于可以通过 TAB 键进行命令补全了。...值得一提的是,这个功能是在 PR 20713 里面实现的,有兴趣的同学可以看下实现过程。...经过作者和 V8 团队的探索,最终在 Node 内核里面直接引入 V8 相应的能力,来实现上述的功能,将极大的提升开发者体验。...{ promisify } = require('util'); const readFile = promisify(fs.readFile); content = readFile('package.json
本文将采用docker技术部署一个简单的nodejs应用,它包括一个简单的前置网关nginx、redis服务器以及业务服务器。...首先,运行一个简单的容器: docker run -it node:8-slim node run命令,根据某个版本的node镜像运行容器,同时执行 “node”命令,进入node命令行交互模式。...对于镜像的tag,则根据业务需求进行判断是否需要完整版的系统。如nodejs镜像,仅仅需要node基础环境而不需要其他的系统预装命令,因此选择了 node:-slim 版本。...Dockerfile文件中可以执行命令定制化镜像,如 “FROM、COPY、ADD、ENV、EXPOSE、RUN、CMD”等,具体dockerfile的配置可参考相关文档。...的抓发规则文件,映射至容器的nginx配置目录下实现快速高效的测试。
本篇主要介绍了 Node.js 如何与 Consul 进行集成,Consul 只是服务注册的一种实现,还有其它的例如 Zookeeper、Etcd 等,服务注册发现在微服务架构中扮演这一个重要的角色,伴随着服务的大量出现...,服务与服务之间的配置管理、运维管理也变的难以维护,通过 Consul 可以解决这些问题,实现服务治理、服务监控。...以下是我为 Consul 管控台配置的数据,如下图所示: 服务配置中心实现 Consul 的 Key/Value 功能可以做为服务的配置中心,对于项目中一些可变化的参数信息,可配置在 Consul 中,...在Nodejs中进行测试 以下为一个简单的 Demo 展示了在 Node.js 如何与 Consul 之间进行服务注册、健康检查及配置中心的应用,可以很好的将上面讲解的理论知识进行实践。...更新之后重新获取配置 可以看到使用 Consul 做为配置中心之后,在我的项目没有重启的情况下也是可以实现数据动态变更的。
作者简介:五月君,Software Designer,公众号「Nodejs技术栈」作者。...Node.js 小知识 记录一些工作中或 “Nodejs技术栈” 交流群中大家遇到的一些问题,有时一个小小的问题背后也能延伸出很多新的知识点,解决问题和总结的过程本身也是一个成长的过程,在这里与大家共同分享成长...使用 JavaScript/Node.js 的开发者如果遇到需要实现延迟的任务,可能会有疑问?️...方法实现,一种快捷方式,感兴趣的可参见笔者这一篇文章 util.promisify 实现原理解析 const { promisify } = require('util'); const sleep...= promisify(setTimeout); 因为是基于定时器与 Promise 所以也自然是异步的方式了,使用时也要注意,如下所示: // async await 的方式 async function
通过流我们可以将一大块数据拆分为一小部分一点一点的流动起来,而无需一次性全部读入,在 Linux 下我们可以通过 | 符号实现,类似的在 Nodejs 的 Stream 模块中同样也为我们提供了 pipe...Nodejs Stream pipe 基本示例 选择 Koa 来实现这个简单的 Demo,因为之前有人在 “Nodejs技术栈” 交流群问过一个问题,怎么在 Koa 中返回一个 Stream,顺便在下文借此机会提下...1.1 未使用 Stream pipe 情况 在 Nodejs 中 I/O 操作都是异步的,先用 util 模块的 promisify 方法将 fs.readFile 的 callback 形式转为 Promise...2.1 顺藤摸瓜 在应用层我们调用了 fs.createReadStream() 这个方法,顺藤摸瓜找到这个方法创建的可读流对象的 pipe 方法实现,以下仅列举核心代码实现,基于 Nodejs v12...第二部分仍以 Nodejs Stream pipe 方法为题,查找它的实现,以及对源码的一个简单分析,其实 pipe 方法核心还是要去监听 data 事件,向可写流写入数据,如果内部缓冲大于创建流时配置的
,在不同的地方有不同的实现。...浏览器和NodeJS基于不同的技术实现了各自的 Event Loop。 可以简单理解为不断执行的死循环 浏览器的Event Loop是在 html5 的规范中明确定义。...NodeJS的Event Loop是基于libuv实现的。可以参考 Node 的官方文档以及 libuv 的官方文档。...libuv已经对Event Loop做出了实现,而HTML5规范中只是定义了浏览器中Event Loop的模型,具体的实现留给了浏览器厂商。...模块中,项目中有如下代码: 如何实现的呢?
以及很多其他优秀的工具,都是实现了这样的功能,帮助我们在处理老项目的时候,不必费神将各种代码使用Promise再重新实现一遍。...所以为了实现正确的结果,我们可能需要手动实现对应的Promise函数,但是自己实现了以后并不能够确保使用方不会针对你的函数调用promisify。...,将其所有参数存放到一个Object对象中进行返回,比如child_process.exec的返回值抛开error以外会包含两个,stdout和stderr,一个是命令执行后的正确输出,一个是命令执行后的错误输出...: promisify(exec)('ls').then(console.log) // -> { stdout: 'XXX', stderr: '' } 或者我们故意输入一些错误的命令,当然了,这个只能在...catch模块下才能够捕捉到,一般命令正常执行stderr都会是一个空字符串: promisify(exec)('lss').then(console.log, console.error) //
开发脚手架的基本思路 开发脚手架的思路很简单。 第一:先写好项目的模板,放到远程git仓库上。 第二:通过命令行执行初始化项目命令。...这个过程会从远端模板仓库中下载对应的模板到本地,生成本地项目 第三:初始化完成后,安装对应的NPM依赖包即可进行本地开发 第四:如果这个脚手架足够强大,那么开发完成后执行对应的命令即可实现持续集成。...如果我们开发的东西比较复杂,比如需要同时管理多个包,则需要整个工具 shelljs nodejs 执行shell命令工具。...shelljs是阿里的一个人(花名huofeng)自己开发的,用在dawn这个框架中。同样功能的包有commander,cmdline,或者使用nodejs的内置exec功能。...isDeepStrictEqual isNull isNumber isString isUndefined isRegexp isObject isError isDate isFunction isPrimitive log promisify
你可以在 这里[1] 下载最新版,或者使用 UNIX 上的 Node 版本管理器[2] 运行 nvm install 16 命令进行安装。...稳定的 Timers Promises API Timers Promises API 提供了另一组返回 Promise 对象的定时器函数,不再需要使用 util.promisify()。...Node.js 15 最近发布的一些特性,也将在 Node.js 16 中可用,包括: 标准 Web Crypto API[8] 的实验实现 npm 7(Node.js v16.0.0 中为 npm 7.10.0...) Node-API v8 稳定的 Source Map v3 Web 平台 atob(buffer.atob(data))和btoa(buffer.btoa(data))实现,以兼容遗留的 Web 平台...这些二进制文件的生产版本得以实现,要感谢 MacStadium 为该项目提供了必要的硬件。 在我们基于 linux 的平台上,构建 Node.js 16 的最低 GCC 版本将是 GCC 8.3。
访问 https://nodejs.org/en/download/current/ 下载安装新版本,也可通过版本管理工具 nvm install v16 安装最新版本。...了解 Node.js 版本管理相关知识,参见文章 “3N 兄弟” 助您完成 Node.js 环境搭建 一般奇数版本为当前版本通常在每年的 4 月份,偶数版本为 LTS 长期支持的版本通常在每年的 10...v9.0[2] 定时器 Promise API,无需在使用 util.promisify 包装,也支持使用异步迭代器,参见之前文章 新 feature — Node.js timers 模块引入 setInterval...异步迭代器 基于 AbortController Web API 的中控器 AbortController 实现,参见之前文章介绍 新特性 — 控制器对象 AbortController 在 Node.js...v16.0.0 npm 版本已升至 v7.10.0 标准 Web Crypto API[3] 的试验性实现 Stable Source Maps v3,不知道没关系,学习下 Source maps in
背景介绍 我们知道在浏览器中 JavaScript 是单线程运行的,而回调函数曾经是 JavaScript 中实现异步函数的主要方式,面对这样的嵌套回调,处理错误也会变得非常困难:你必须在“金字塔”的每一级处理错误...注意:打开环境后发现缺少项目代码,请复制下述命令至命令行进行下载。...要求规定 请按照给出的步骤操作,切勿修改默认提供的文件名称、文件夹路径等。 判分标准 本题完全实现题目目标得满分,否则得 0 分。...; // 请勿删除该行代码 代码解析 整体功能概述 这段 Node.js 代码的主要目的是演示如何将一个遵循错误优先回调风格的函数(如 fs.readFile)转换为返回 Promise 的函数,以便使用...4. promisify 函数的实现 const promisify = (fn) => { return function (...args) { return new Promise
# node 如何获取命令行传来的参数 process 是一个全局变量,它提供当前 Node.js 进程的有关信息,而 process.argv 属性则返回一个数组,数组中的信息包括启动 Node.js...process.argv[1] 当前执行的文件的 JS 文件路径 process.argv.splice(2) 命令行参数 关于获取命令行传来的参数还可以结合 commander 的 commander.parse...() node 命令时所在的文件夹的绝对路径 ./ 当前目录 ../ 相对路径,上级目录 # node 相关的 path API path.dirname(): 返回 path 的目录名 path.join...():所有给定的 path 片段连接到一起,然后规范化生成的路径 path.resolve():方法会将路径或路径片段的序列解析为绝对路径,解析为相对于当前目录的绝对路径,相当于 cwd 命令 join...# node 如何利用多核 CPU 以及创建集群 nodejs 是基于 V8 引擎构建的,一个 nodejs 进程只能使用一个 CPU(一个 CPU 运行一个 node 实例),如果有多核 CPU,可以启动多个进程来利用多核
如果嵌套 promises,我们又回到了 Node.js api 中流行的冗长而又相当麻烦的错误优先回调(https://nodejs.org/api/errors.html#errors_error_first_callbacks...如果我们不小心,可能会出现某些不可预见的副作用--比如内存泄漏。在 Node.js 环境中,util.promisify 函数的存在就是为了解决这个问题。...顾名思义,util.promisify可以做兼容和简化基于回调的 API 的包装。它假定给定函数像大多数 Node.js API 一样接受错误优先的回调作为其最终参数。...如果存在特殊的实现细节[3],则库作者还可以提供 自定义 promisifier[4]。...(以下使用 Promise.all 来实现并发,译者注) import { promisify } from 'util'; const sleep = promisify(setTimeout);