Skip to content
0

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')

但是通过这种方式创建的 requireESM 的不完全相同,区别主要:这种使用独立缓存,不会与全局缓存冲突,因为这个 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

Released under the MIT License.