首页菜鸟笔记深入理解nodejs中的module API
Created At : 2021-11-11

深入理解nodejs中的module API

即Module是一个对象。提供了与 Module 的实例交互时的实用方法,module 变量常见于 CommonJS 模块中。 通过 import 'module' 或 require('module') 访问。其有三个内置的属性,如下:

module.builtinModules

Node.js 提供的所有模块的名称列表。 可用于验证模块是否由第三方维护。

实例如下:

//test.js
import { builtinModules as builtin } from 'module';
console.log(builtin)

// 执行node test.js,输出如下:
[
  '_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',
  'async_hooks',       'buffer',              'child_process',
  'cluster',           'console',             'constants',
  'crypto',            'dgram',               'diagnostics_channel',
  'dns',               'domain',              'events',
  'fs',                'fs/promises',         'http',
  'http2',             'https',               'inspector',
  'module',            'net',                 'os',
  'path',              'perf_hooks',          'process',
  'punycode',          'querystring',         'readline',
  'repl',              'stream',              'string_decoder',
  'sys',               'timers',              'tls',
  'trace_events',      'tty',                 'url',
  'util',              'v8',                  'vm',
  'worker_threads',    'zlib'
]

module.createRequire(filename)

  • filename: 用于构造 require 函数的文件名。 必须是 a file URL object, file URL string, or absolute path string.
  • Returns: 返回:require 函数(require())

例如:

// test.js
import { createRequire } from 'module';
//import.meta.url 返回当前模块的 URL 路径
//注意,Node.js 环境中,import.meta.url返回的总是本地路径,即是file:URL协议的字符串.
//例如本实例中,返回:file:///../../my_test.js 的绝对路径
console.log(import.meta.url)
const require = createRequire(import.meta.url);

// ./test1.js 是 CommonJS module.
const siblingModule = require('./test1.js');

module.syncBuiltinESMExports()

updates all the live bindings for builtin ES Modules to match the properties of the CommonJS exports. It does not add or remove exported names from the ES Modules.

即更新内置的ES Mudules的实时绑定,以匹配CommonJs导出的属性。但是不会从 ES 模块中添加或删除导出的名称。

import fs from 'fs';
import assert  from 'assert' ;
import { syncBuiltinESMExports }  from 'module';

fs.readFile = newAPI;

delete fs.readFileSync;

function newAPI() {
  // ...
}

fs.newAPI = newAPI;

syncBuiltinESMExports();

import('fs').then((esmFS) => {
  // console.log(esmFS)
  // It syncs the existing readFile property with the new value
  assert.strictEqual(esmFS.readFile, newAPI);
  // readFileSync has been deleted from the required fs
  assert.strictEqual('readFileSync' in fs, false);
  // syncBuiltinESMExports() does not remove readFileSync from esmFS
  assert.strictEqual('readFileSync' in esmFS, true);
  // syncBuiltinESMExports() does not add names
  assert.strictEqual(esmFS.newAPI, undefined);
});