Nodejs 如何判断载入的模块是内建模块还是 npm 安装的其他第三方模块

发布于 1周前 作者 caililin 来自 nodejs/Nestjs

Nodejs 如何判断载入的模块是内建模块还是 npm 安装的其他第三方模块

比如引入了

const fs = require('fs')
const express = require('express')

如何判断 fs 和 express 哪个是内建模块,哪个是第三方模块

12 回复

<br>require.resolve('jquery').includes('node_modules')<br>
这样?

const builtinMods = new Set(Object.keys(process.binding(‘natives’)).filter(x => !/^_|^(internal|v8|node-inspect)/.test(x)))
buildinMods.has(‘fs’)

你是想随便了解一下还是?

这个原理是什么

有道理,这样确实可以

是这样的,我最近在写一份 tslint 的自定义 rule,该 rule 的主要功能就是区分 import 的模块的类型,把模块分类,然后代码格式化

谢谢,刚刚没看到

1 楼那个包的源码,
process.binding returns internal module, like require. It’s not public, so you shouldn’t rely on it in your code, but you can use it to play with node’s low level objects, if you want to understand how things work.

For example, here timer_wrap binding is registered. It exports Timer constructor. In lib/timers.js it’s imported

https://stackoverflow.com/questions/24042861/nodejs-what-does-process-binding-mean

你可以直接看 process.binding(‘fs’)就知道大概他是干嘛的了

  1. require.resolve(x) === x
    2. require.resolve.paths(x) === null 需要 8.9
    3. process.binding(x) 私有接口,还包括一些不能 require 的内部模块

谢谢你的方案,我已经在用了:)

在 Node.js 中,要判断一个模块是内建模块还是通过 npm 安装的第三方模块,可以通过检查模块的路径来实现。内建模块(如 fs, path 等)通常不会存在于项目的 node_modules 目录中,而第三方模块则会。

以下是一个示例代码,展示了如何判断一个模块是内建模块还是第三方模块:

function isBuiltinModule(moduleName) {
    try {
        const modulePath = require.resolve(moduleName);
        return !modulePath.includes('node_modules');
    } catch (err) {
        // 如果模块无法解析,可能是一个拼写错误或根本不存在
        console.error(`Module ${moduleName} not found:`, err);
        return false;
    }
}

// 测试示例
const testModules = ['fs', 'express', 'path', 'nonexistentModule'];

testModules.forEach(mod => {
    console.log(`${mod} is a builtin module:`, isBuiltinModule(mod));
});

在这个代码中,require.resolve(moduleName) 尝试解析模块路径。如果模块是内建的,路径中不会包含 node_modules 字符串。如果模块是第三方模块,路径通常会包含 node_modules

请注意,这个方法假设你的 Node.js 环境没有特殊配置(如全局模块路径的修改)。此外,对于无法解析的模块,会抛出一个错误,我们在 catch 块中捕获并处理这个错误。

运行这个脚本会输出每个测试模块是否为内建模块。

回到顶部