Node.js技术原理分析系列8——将Node.js内置模块外置

Rust与Node.js在URL短链服务中的性能与镜像体积对比 URL短链服务作为高并发IO密集型应用的典型代表,其性能优化和资源效率一直是开发者关注的焦点。在容器化部署场景下,Docker镜像体积直接影响部署密度和启动速度,而运行时性能则决定了服务的吞吐能力。通过对比Rust和Node.js两种技术栈的实现方案,发现Rust凭借静态编译特性可生成仅23MB的超小镜像,而Node.js虽然镜像体积较大,但其事件循环优化和集群模式却带来了2.8倍的QPS优势。这种反直觉的结果揭示了技术选型时需要平衡镜像体积优化与运行时性能的关系,特别是在处理轻量级HTTP请求时,Node 阅读详情

Node.js 是一个开源的、跨平台的JavaScript运行时环境,它允许开发者在服务器端运行JavaScript代码。Node.js 是基于Chrome V8引擎构建的,专为高性能、高并发的网络应用而设计,广泛应用于构建服务器端应用程序、网络应用、命令行工具等。

本系列将分为9篇文章为大家介绍 Node.js 技术原理:从调试能力分析到内置模块新增,从性能分析工具 perf_hooks 的用法到 Chrome DevTools 的性能问题剖析,再到 ABI 稳定的理解、基于 V8 封装 JavaScript 运行时、模块加载方式探究、内置模块外置以及 Node.js addon 的全面解读等主题,每一篇都干货满满。

在上一节中我们探讨了Node.js模块加载方式分析的相关内容,在本节中则主要分享《Node.js内置模块外置》相关内容,本文内容为本系列第8篇,由体验技术团队屈金雄原创,以下为正文内容。

前言

本人最近的工作涉及 Node.js 的定制开发,直白点说就是,需要修改 Node.js 源码。

一般来说,Node.js 源码修改后,需要重新构建才能生效。如果频繁修改,频繁构建,就很费时间。

这时,我们可以用内置模块外置这种办法,避免重新构建。

什么叫内置模块外置?

我们知道 node 源码主要是由 C++ 和 js 两部分组成。其中 js 代码都在 lib 目录下。

普通方式构建的 node,lib 代码是打包到构建产物中的。node 工程运行时,所用的 js 源码也取自构建产物。如果修改了 lib 代码,只有重新构建才能生效。

为了方便开发和调试,我们在进行 node 构建配置的时候可使用 --node-builtin-modules-path 参数。

./configure --node-builtin-modules-path "$(pwd)"

有了这个参数,构建产物不会包含 lib 代码。node 工程运行需要导入 lib 中的 js 模块时,会从构建时指定的目录查找,在示例中就是运行./configure 命令的目录(pwd)。

这样我们就将 lib 下的 js 代码外置了。

内置模块是 node 的一部分,有些是纯 js 的,有些外层是 js,底层是 C++。其 js 代码自然也都在 lib 目录下。所以本节讲的 lib 代码外置,同样适用于内置模块的 js 代码。

当我们将内置模块的 js 代码外置时,就是将内置模块外置。

构建 lib 外置的 node

关于 node 构建,请参考官方文档的 BUILDING.md 文件,这里只是简单列出主要步骤。

以 Ubuntu 操作系统为例,简明构建过程如下:

// 1.环境准备
apt install python3 g++ make python3-pip

// 2.清除旧版配置(源码准备步骤已省略)
make clean

// 3.配置
./configure --node-builtin-modules-path "$(pwd)"

// 4.构建
make -j32

验证外置 lib 是否生效

按步骤进行如下操作:

  1. 准备一个待运行的 node 工程
    创建一个单文件 node 工程,命名为 test.js,代码如下。
    为方便起见,将 test.js 直接放在 node 源码的根目录下。
// test.js

const { createServer } = require('node:http');

const hostname = '127.0.0.1';
const port = 3000;

const server = createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello World');
});

server.listen(port, hostname, async () => {
console.log(`Server running at http://${hostname}:${port}/`);
});
  1. 更改 http 模块的 createServer 方法的 js 源码,如下图!
    在这里插入图片描述

  2. 运行
    在这里插入图片描述

如图所示,先用了安装在环境中的普通版本 node,运行 test.js,没有额外的打印信息;然后用外置标准库版本的 node 运行 test.js,打印出了预期的信息,而我们上一步改过代码后,并未重新构建 node。说明此时 node 运行,使用的 lib 代码确实是外置的。

验证外置标准库是否可调试

我们首先验证的是 vscode launch 模式,有未解决报错。 之后又尝试,vscode attach 模式,结果成功了,现将流程分享给大家。如果对调试细节有疑问,请阅读Node.js 调试能力分析。1. 按《Node.js 调试能力分析》这一节中第 1 步操作2. 配置 vscode launch.json 文件
注意,要将 program 指向我们先前编译好的外置标准库版的 node。vscode 2020 年 11 月之后的版本支持了这种外置标准库的断点调试。接下来我们验证一下,调试是否能走通。按如下步骤操作:

{
  "version":"0.2.0",
"configurations":[
    {
      "name":"node:attach",
      "port":9229,
      "request":"attach",
      "skipFiles":[
        // "<node_internals>/**"
      ],
      "type":"node"
    },
    {
      "type":"cppdbg",
      "request":"launch",
      "name":"cppdbg:node",
      "program":"${workspaceFolder}/out/Debug/node",
      "args":[
        "--inspect-brk",
        "test.js"
      ],
      "cwd":"${workspaceFolder}"
    }
]
}
  1. 修改一段 lib 代码
    这里我们继续使用之前的 createServer 中的修改。

  2. 启动 test.js
    选择 cppdbg:node 后,点击绿色三角,启动 test.js。
    注意我们 launch.json 中配置了--inspect-brk参数,这个参数会让我们的调试器在业务代码第一行停住。
    在这里插入图片描述

  3. 连接调试服务器
    选择 node:attach 后,点击绿色三角,启动 test.js。
    在这里插入图片描述

  4. 结果展示
    上一步操作完成后,调试器停在第一行代码处,这时点击下一步来到 createServer 处,然后点击下钻(step into),即可来到我们先前修改的 createServer 代码处,如下图所示。至此,我们验证通过了外置 lib 的调试。
    在这里插入图片描述


下一节,将分享《Node.js addon》相关内容,请大家持续关注本系列内容~学习完本系列,你将获得:

  • 提升调试与性能优化能力
  • 深入理解模块化与扩展机制
  • 探索底层技术与定制化能力

同时欢迎大家一起参与OpenTiny开源共建:朋友你好,一起加入OpenTiny社区吧~

关于OpenTiny

欢迎加入 OpenTiny 开源社区。添加微信小助手:opentiny-official 一起参与交流前端技术~
OpenTiny 官网:https://opentiny.design
OpenTiny 代码仓库:https://github.com/opentiny
TinyVue 源码:https://github.com/opentiny/tiny-vue
TinyEngine 源码:https://github.com/opentiny/tiny-engine
欢迎进入代码仓库 Star🌟TinyEngine、TinyVue、TinyNG、TinyCLI、TinyEditor~ 如果你也想要共建,可以进入代码仓库,找到 good first issue标签,一起参与开源贡献~

JavaScript生产级快速排序:从V8内存限制到工程化实现 快速排序(Quick Sort)作为经典的分治算法,其核心原理是通过分区(partition)与递归/迭代实现高效排序。在JavaScript中,它不仅是算法题考点,更是前端性能优化的关键技术——受限于单线程、固定调用栈深度(V8默认约1000层)和动态数组机制,原生arr.sort()在大数据量或复杂比较函数下易触发'JavaScript heap out of memory'或'Maximum call stack size exceeded'错误。本文聚焦工程落地,解析三数取中pivot选择、Hoar 阅读详情

相关推荐

WorkBuddy工程化实践:Node.js+Git+CC Switch构建可审计AI编程工作流

AI编程辅助已从概念验证进入工程落地阶段,核心挑战在于将大模型能力(如Claude Code)嵌入现有开发流程,实现可追溯、可审查、可治理的稳定集成。其底层依赖HTTP/2协议通信、本地进程协调与Prompt版本化管理等基础能力,技术价值体现在规避API密钥泄露、统一错误处理、支持CI/CD校验及团队协作审计。典型应用场景包括VS Code插件集成、前端脚手架生成、TypeScript代码重构等。本文聚焦WorkBuddy这一轻量级协调器的设计本质——它并非独立AI工具,而是以Node.js为运行时、Git

weixin_30500473的博客 558

vue执行npm run build打包,控制台一直卡在node build/build.js的解决方案

如图,注释掉该段代码即可:

是我的温柔啊 3488

Cocos Creator+微信小游戏:如何用wxDownloader实现资源动态加载与热更新

本文深入探讨了在Cocos Creator开发微信小游戏时,如何利用wxDownloader有效应对主包体积限制,实现资源的动态加载与热更新。文章详细介绍了从项目配置、资源标记到初始化加载的完整流程,并重点解析了基于MD5 Cache的缓存策略与版本控制方案,旨在帮助开发者构建稳健高效的资源管理体系,优化游戏启动速度与更新体验。

css33的专栏 823

「随手一记」「Vue.js篇」「npm run dev(build)配置开发、测试、生产环境」

在开发及线上(打包)过程中,经常会遇到根据不同的环境(开发、测试、生产)进行项目的发布。因此本文章主要介绍使用 npm run dev 和 npm run build 进行配置开发、测试、生产环境的切换,这只是切换方式之一(当然还有其他的方式,这里不做介绍)。 本文章介绍的方法有点繁琐,仅供参数,若有哪里写错或不足的地方,请指教。 项目介绍 开发工具:Visual Studio Code 构建脚支架:webpack 项目名称:VUE-DEMO 涉及目录及文件 主要涉及目录及默认文件:b..

一一丁点的博客 8385

Ubuntu 20.04下大陆ARS408毫米波雷达点云数据采集与RVIZ实时可视化全流程解析

本文详细解析了在Ubuntu 20.04系统下,如何实现大陆ARS408毫米波雷达的点云数据采集与RVIZ实时可视化全流程。内容涵盖硬件连接、ROS Noetic环境搭建、CAN接口配置、数据验证及自动化脚本编写,为机器人感知、自动驾驶等领域的开发者提供了一套稳定、实用的实战方案。

bash7scripter的博客 699

一、永磁同步电机矢量控制——电机数学模型

本文介绍了永磁同步电机(PMSM)的数学模型构建方法,重点分析了不同坐标系(三相静止、α-β静止、d-q旋转)下的电压方程、磁链表达式及电磁转矩计算方法。通过Clark和Park变换简化非线性耦合系统,推导了表贴式(SPMSM)与内置式(IPMSM)电机的电压方程差异,并给出α-β和d-q坐标系下的转矩公式,强调磁链与电流的正交性对转矩的影响。全文基于理想假设,为后续电机控制算法(如FOC、DTC)提供理论基础。

惊鸿一现 1928

npm run build卡在node build/build.js

npm run build执行打包一直卡在node build/build.js处不动 解决:在build/check-versions.js里注释如下代码 if (shell.which('npm')) { versionRequirements.push({ name: 'npm', currentVersion: exec('npm --version'), versionRequirement: packageConfig.engines.npm }) } ...

qq_40664253的博客 6075

SAP GR(Group Reporting)合并报表内容及功能简介(五)-合并和抵消

随着合并和收购数量的显著增加,企业在全球经济中面临着诸多挑战。其中最常见的是法律实体与子公司之间缺乏透明度,导致无法以经济高效的方式对账法律实体与子公司之间的公司间交易,从而造成结算出现重大延迟。公司间匹配和对账功能允许用户在关账过程中进行早期分析,以避免公司间差异,并缩短关账时的延迟。公司间匹配和对账功能交易级别匹配和实时对账基于各种组织维度(如公司、利润中心和合并单位)的灵活建模自动差异解决。应用内通信和工作流。与公司间抵销集成。

weixin_43853754的博客 4400

Node.js技术原理分析系列2——如何在Node.js中新增一个内置模块

作为 Node.js 的使用者,想必同学们对“内置模块”这个概念并不陌生:Node.js 内置模块也叫核心模块,预置在 Node.js 运行时中,这些内置模块不需要额外下载安装,可以在 js 代码中通过 require 引入。常用的内置模块包括 fs、http 等对于这些天天使用的功能,大家有没有好奇过它们是怎么开发出来的呢?为了更好地了解 Node.js 的底层实现,我把这套流程自己走了一遍。这里可以跟大家分享一下:如何基于 Node.js 开源代码定制开发,添加一组新的内置模块。

OpenTiny的博客 1466

Plecs电力电子仿真专业教程-第一季 补充课程 Plecs的安装教程与软件下载

PLECS4.1.64免安装版本–点我下载 Plecs.Standalone-3.7.2版本--关注加私信给我可以提供下载链接 补充课程 Plecs的安装教程与软件下载 详细介绍Plecs软件的安装过程

1万+

点云处理实操(四) -PCL中的点云三角化

点云处理实操(四) -PCL中的点云三角化

cangqiongxiaoye的博客 939

Node.js技术原理分析系列1——Node.js调试能力分析

本文由体验技术团队屈金雄原创。Node.js 是一个开源的、跨平台的 JavaScript 运行时环境,它允许开发者在服务器端运行 JavaScript 代码。Node.js 是基于 Chrome V8引擎构建的,专为高性能、高并发的网络应用而设计,广泛应用于构建服务器端应用程序、网络应用、命令行工具等。

OpenTiny的博客 1813

将 SAP BTP ABAP environment 与 SAP S/4HANA Cloud 公有云版集成:从架构理念到落地实战

本文探讨了在SAP云环境中实现ABAP扩展应用与S/4HANA Cloud系统集成的技术方案。通过建立标准化的远程通信通道,开发者可在SAP BTP ABAP环境中开发扩展应用,同时安全访问S/4HANA Cloud的核心业务数据和服务。文章详细介绍了整体架构设计、开发实现步骤(包括定义通信场景、生成服务消费模型和编写调用代码)以及管理员在S/4HANA侧的配置工作(创建通信安排和技术用户)。通过一个业务伙伴自助注册平台的案例,展示了如何在不修改标准系统的情况下实现云扩展,体现了SAP"干净核心&

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 241

Node.js技术原理分析系列6——基于 V8 封装一个自己的 JavaScript 运行时

Google 推出的 V8 引擎,自 2008 年随 Chrome 浏览器面世以来,大幅提升了 JavaScript 性能,重新定义了其应用范畴。作为 Chrome 和 Node.js 的核心动力,V8 推动 JavaScript 成为了一个跨越前后端的全栈开发语言。但是 V8 本身只是一个 JavaScript 解释器,能够对 JavaScript 语言进行解释,并不具备与操作系统,或者其他软件或者资源交互的能力。但是在代码执行中, 我们往往根据我们的需要调用计算机的某些资源或者和其他软件发生交互。

OpenTiny的博客 1095

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Node.js技术原理分析系列7——Node.js模块加载方式分析

如今,Node.js 同时实现了 CJS(CommonJS)和 ESM(ECMAScript Module)两套规范,来进行模块管理。由于早期 JS 没有自己的官方模块规范,在很长一段时间以来 Node.js 一直使用非官方的 CJS 规范。直到 2015 年 ES6 发布,里面定义了 ESM 的规范,各种构建工具和浏览器才逐渐兼容它,而 Node.js 更是在 2019 年的 node 13.2.0 版本才开始正式支持 ESM 特性。

OpenTiny的博客 1341

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Node.js 技术原理分析系列9——Node.js addon一文通

开发者完成 addon 开发后,可以将其发布到各种仓库,供后续自己或其他开发者使用。不同于纯 JS 模块,addon 模块中有 C/C++代码,必须编译后才能使用。addon 开发者可以只发布 C/C++ 源码,让它在用户 npm install 装包的时候自动进行编译构建;也可以把编译产物也一起发布,让用户侧省去编译构建的步骤。如下图所示,是 addon 生命周期。其中,预构建是个可选环节,是否使用取决于 addon 开发者根据特定 addon 自身情况的选择。

OpenTiny的博客 1748

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Node.js 技术原理分析系列5——理解 Node.js 中的 ABI 稳定

首先,我们需要明确的是,并非所有 node 用户都需要关注“ABI 稳定”这一概念。如果一个用户对 node 的使用,只包含纯 JS 代码,那么用户没必要理解这个概念。但是如果直接或间接使用了 V8 ABI,例如使用 addon、libnode、electron 等技术,就需要对这个概念有所理解。本文主要以 addon 场景为例,对这个概念进行介绍。ABI(Application Binary Interface)直译过来是应用程序二进制接口。与常说的 api 类似,都是用于程序之间的交互。

OpenTiny的博客 1035

Node.js技术原理分析系列3——Node.js的perf_hooks模块作用和用法

在 Node.js 中,如何测量一段代码的耗时呢?比如 for 循环遍历 100 次的耗时。让我们带着这个问题,开始本文的讲解。1.用Date.now()很容易就能想到,在循环前后分别取一个时间,再相减不就行了i < 100;i ++) {运行多次后发现,结果永远是 0。原因是Date.now()只能精确到毫秒级别,无法用于计算零点几毫秒这种的耗时。2.用和。

OpenTiny的博客 1137

Node.js 技术原理分析系列 4—— 使用 Chrome DevTools 分析 Node.js 性能问题

Chrome DevTools 中的 Performance 面板和 Chrome 开发者工具中的 Performance 面板不是同一个,前者用于 Node.js 性能分析,后者用于 web 前端性能分析。操作区时间轴:包括从记录开始到记录结束这个时间段。概览区:目前只能看主线程活动,以后也许能看更多内容。详情区:详情区的内容会随鼠标左键选中的目标变化而变化。

OpenTiny的博客 1000

Node.js 技术原理分析系列 6—— 基于 V8 封装一个自己的 JavaScript 运行时

Google 推出的 V8 引擎,自 2008 年随 Chrome 浏览器面世以来,大幅提升了 JavaScript 性能,重新定义了其应用范畴。作为 Chrome 和 Node.js 的核心动力,V8 推动 JavaScript 成为了一个跨越前后端的全栈开发语言。但是 V8 本身只是一个 JavaScript 解释器,能够对 JavaScript 语言进行解释,并不具备与操作系统,或者其他软件或者资源交互的能力。但是在代码执行中, 我们往往根据我们的需要调用计算机的某些资源或者和其他软件发生交互。

2401_83574175的博客 1085

Node.js应用Windows便携化:pkg打包与一键构建实战

在软件部署领域,绿色软件和便携化部署是提升用户体验的关键技术。其核心原理在于将应用程序及其运行时环境、依赖库和配置文件封装为一个独立单元,实现解压即用,无需复杂的安装和环境配置。这一技术对于交付企业级应用、快速演示和降低用户使用门槛具有重要价值,尤其适用于需要分发给技术背景多样用户的场景。通过工具链整合与自动化脚本,开发者可以将Node.js项目高效打包为Windows便携包,实现开箱即用的部署体验。本文以pkg打包工具为核心,结合路径隔离与配置外置等热词技术,详细解析了从代码改造到一键构建的完整实现路径。

weixin_34327761的博客 407

Node.js集群原理与实战:从单进程瓶颈到生产级水平扩展

Node.js单线程模型在高并发或CPU密集场景下易出现响应延迟、服务卡死等问题,其本质是事件循环无法并行处理阻塞操作。集群(clustering)通过主从架构启动多个独立进程,共享端口并分发请求,实现原生水平扩展。该方案依托操作系统IPC机制与V8实例隔离,兼顾性能、稳定与轻量性,是Express等框架进入生产环境的必备能力。结合Redis会话共享、Nginx反向代理及PM2进程管理,可构建抗压、可观测、可运维的分布式Web服务。本文聚焦cluster模块底层原理与工程落地细节。

cqbh2011的博客 404

Node.js事件循环与单线程真相:I/O密集型架构核心解析

Node.js常被误读为‘单线程阻塞模型’,实则是基于事件驱动的异步I/O调度系统。其核心在于事件循环(Event Loop)协调JavaScript主线程、V8引擎、libuv线程池与操作系统内核四层协作,将耗时操作卸载至后台,实现高并发低延迟。这种设计天然适配I/O密集型场景——如实时通信、API网关、流式数据处理,但不擅CPU密集型任务。理解event loop阶段(timers、poll、check等)与微任务/宏任务执行顺序,是避免回调地狱、定时器失准、长尾延迟等生产问题的关键。结合V8内存机制与

weixin_30765505的博客 332
上一篇: 直播分享|TinyVue 多端实战与轻量图标库分享
下一篇: TinyVue v3.22.0 正式发布:深色模式上线!集成 UnoCSS 图标库!TypeScript 类型支持全面升级!
OpenTiny社区
博客等级 码龄4年 1540粉丝 266原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值