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

2018-07-23 14:08:47 +08:00
 zzhbbdbbd

比如引入了

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

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

4439 次点击
所在节点    Node.js
11 条回复
yangg
2018-07-23 14:13:10 +08:00
Tonni
2018-07-23 14:13:23 +08:00
```
require.resolve('jquery').includes('node_modules')
```
这样?
yangg
2018-07-23 14:19:00 +08:00
const builtinMods = new Set(Object.keys(process.binding('natives')).filter(x => !/^_|^(internal|v8|node-inspect)/.test(x)))
buildinMods.has('fs')
123s
2018-07-23 14:25:01 +08:00
你是想随便了解一下还是?
zzhbbdbbd
2018-07-23 14:29:08 +08:00
@yangg 这个原理是什么
zzhbbdbbd
2018-07-23 14:29:25 +08:00
@Tonni 有道理,这样确实可以
zzhbbdbbd
2018-07-23 14:30:27 +08:00
@123s 是这样的,我最近在写一份 tslint 的自定义 rule,该 rule 的主要功能就是区分 import 的模块的类型,把模块分类,然后代码格式化
zzhbbdbbd
2018-07-23 14:31:37 +08:00
@yangg 谢谢,刚刚没看到
yangg
2018-07-23 14:45:36 +08:00
@zzhbbdbbd 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')就知道大概他是干嘛的了
kfll
2018-07-23 14:55:39 +08:00
1. require.resolve(x) === x
2. require.resolve.paths(x) === null 需要 8.9
3. process.binding(x) 私有接口,还包括一些不能 require 的内部模块
zzhbbdbbd
2018-07-23 19:54:12 +08:00
@kfll 谢谢你的方案,我已经在用了:)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/473300

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX