node:module
createRequire
在 CJS 中,可以通过 request.resolve 来获得模块的绝对路径
const pkgPath = request.resolve("../package.json")
// /path/to/your/project/package.json上面的例子不够有说服力,因为也可以通过类似 path.resolve 的方式来获取,
因为启动的是 NodeJs 的原生模块查找算法,可以帮我们精确定位文件的位置,所以这在获取第三方包的位置的时候尤其有用,或者用来判断模块是否存在:
const glob = request.resolve('glob')
// /path/to/your/project/node_modules/.pnpm/glob@7.2.0/node_modules/glob/glob.js在 ESM 中,也可以做到,需要用到 node:module 模块但是需要先模拟 require:
import { createRequire } from 'node:module';
const require = createRequire(import.meta.url);
const glob = request.resolve('glob')但是通过这种方式创建的 require 和 ESM 的不完全相同,区别主要:这种使用独立缓存,不会与全局缓存冲突,因为这个 require 是根据指定的文件路径单独创建的
builtinModules
通过 builtinModules 我们可以知道所有 nodejs 内置的模块,进而不让打包工具进行解析
import { builtinModules } from 'node:module'
defineConfig({
// external: [...builtinModules, ...other]
})
console.log(builtinModules)
/*
[
'_http_agent', '_http_client', '_http_common',
'_http_incoming', '_http_outgoing', '_http_server',
'_stream_duplex', '_stream_passthrough', '_stream_readable',
'_stream_transform', '_stream_wrap', '_stream_writable',
'_tls_common', '_tls_wrap', 'assert',
'assert/strict', 'async_hooks', 'buffer',
'child_process', 'cluster', 'console',
'constants', 'crypto', 'dgram',
'diagnostics_channel', 'dns', 'dns/promises',
'domain', 'events', 'fs',
'fs/promises', 'http', 'http2',
'https', 'inspector', 'module',
'net', 'os', 'path',
'path/posix', 'path/win32', 'perf_hooks',
'process', 'punycode', 'querystring',
'readline', 'repl', 'stream',
'stream/consumers', 'stream/promises', 'stream/web',
'string_decoder', 'sys', 'timers',
'timers/promises', 'tls', 'trace_events',
'tty', 'url', 'util',
'util/types', 'v8', 'vm',
'wasi', 'worker_threads', 'zlib'
]
*/isBuiltin
使用 isBuiltin 判断函数是否是原生包
import { isBuiltin } from 'node:module'
isBuiltin('url') // true
isBuiltin('node:url') // true
isBuiltin('glob') //false