Skip to content

js 文件中的全局 module 变量为:

js
console.log(module)
// Module {
//   id: '.',
//   path: '/Users/xxx/Desktop/learn-nodejs/scripts/30.modules-module-api',
//   exports: {},
//   filename: '/Users/xxx/Desktop/learn-nodejs/scripts/30.modules-module-api/index.js',
//   loaded: false,
//   children: [],
//   paths: [
//     '/Users/xxx/node_modules',
//     '/Users/node_modules',
//     '/node_modules'
//   ]
// }

本节,我们总结 node:module 模块的部分API:

  1. nodeModule.builtinModules 内置模块
  2. nodeModule.createRequire
  3. nodeModule.isBuiltin
js
// 1.builtinModules
import nodeModule from 'node:module'
console.log(nodeModule.builtinModules)
js
// 2.createRequire
import { createRequire } from 'node:module'
const require = createRequire(import.meta.url)
console.log(import.meta.url)
// sibling-module.js is a CommonJS module.
const siblingModule = require('../31.modules-packages/3.entry.cjs')
js
// 3.isBuiltin
import { isBuiltin } from 'node:module'
console.log(isBuiltin('node:fs')) // true
console.log(isBuiltin('fs')) // true
console.log(isBuiltin('wss')) // false

createRequire

module.createRequireNode.js 中的一个方法,用于在 ES 模块(ECMAScript Modules,简称 ESM)环境中创建一个 CommonJS 样式的 require 函数。

这在需要在 ES 模块中加载 CommonJS 模块或 JSON 文件时特别有用。

主要用途:

  1. ES 模块中使用 CommonJS 模块: ES 模块通常使用 import 语句来加载其他模块,但 import 不支持动态加载,也不支持直接加载 JSON 文件或某些类型的 CommonJS 模块。

module.createRequire 允许你在 ES 模块中创建一个 require 函数,从而兼容加载这些模块。

  1. 加载 JSON 文件: ES 模块不支持直接通过 import 加载 JSON 文件(在早期版本中),但通过 module.createRequire 创建的 require 函数可以加载 JSON 文件。

  2. 动态加载模块: import 语句在 ES 模块中是静态的,而 require 可以在代码运行时动态决定加载哪个模块。

module.createRequire 允许在需要动态加载模块的情况下使用 require

应用场景:

  1. ES 模块中需要加载现有的 CommonJS 模块或第三方依赖时。
  2. 动态加载模块或 JSON 文件时,import 语句无法满足需求。
js
// 假设这是一个 ES 模块文件(使用 .mjs 扩展名或 "type": "module" 的 package.json)
import { createRequire } from 'module'
const require = createRequire(import.meta.url)

// 使用 require 加载 CommonJS 模块
const lodash = require('lodash')

// 加载 JSON 文件
const packageData = require('./package.json')

console.log(lodash)
console.log(packageData)