process.dlopen(module, filename[, flags])
module
<Object>filename
<string>flags
<os.constants.dlopen> 默认值:os.constants.dlopen.RTLD_LAZY
process.dlopen()
方法允许动态加载共享对象。
require()
主要用于加载 C++ 插件,除非特殊情况,否则不应直接使用。
换句话说,require()
应该优先于 process.dlopen()
,除非有特定的原因,例如自定义 dlopen 标志或从 ES 模块加载。
flags
参数是整数,允许指定 dlopen 行为。
有关详细信息,请参阅 os.constants.dlopen
文档。
调用 process.dlopen()
时的一个重要要求是必须传入 module
实例。
然后可以通过 module.exports
访问由 C++ 插件导出的函数。
下面的示例显示了如何加载名为 local.node
的 C++ 插件,该插件导出 foo
函数。
通过传入 RTLD_NOW
常量,在调用返回之前加载所有符号。
在此示例中,假定常量可用。
import { dlopen } from 'node:process';
import { constants } from 'node:os';
import { fileURLToPath } from 'node:url';
const module = { exports: {} };
dlopen(module, fileURLToPath(new URL('local.node', import.meta.url)),
constants.dlopen.RTLD_NOW);
module.exports.foo();
const { dlopen } = require('node:process');
const { constants } = require('node:os');
const { join } = require('node:path');
const module = { exports: {} };
dlopen(module, join(__dirname, 'local.node'), constants.dlopen.RTLD_NOW);
module.exports.foo();
module
<Object>filename
<string>flags
<os.constants.dlopen> Default:os.constants.dlopen.RTLD_LAZY
The process.dlopen()
method allows dynamically loading shared objects. It is
primarily used by require()
to load C++ Addons, and should not be used
directly, except in special cases. In other words, require()
should be
preferred over process.dlopen()
unless there are specific reasons such as
custom dlopen flags or loading from ES modules.
The flags
argument is an integer that allows to specify dlopen
behavior. See the os.constants.dlopen
documentation for details.
An important requirement when calling process.dlopen()
is that the module
instance must be passed. Functions exported by the C++ Addon are then
accessible via module.exports
.
The example below shows how to load a C++ Addon, named local.node
,
that exports a foo
function. All the symbols are loaded before
the call returns, by passing the RTLD_NOW
constant. In this example
the constant is assumed to be available.
import { dlopen } from 'node:process';
import { constants } from 'node:os';
import { fileURLToPath } from 'node:url';
const module = { exports: {} };
dlopen(module, fileURLToPath(new URL('local.node', import.meta.url)),
constants.dlopen.RTLD_NOW);
module.exports.foo();
const { dlopen } = require('node:process');
const { constants } = require('node:os');
const { join } = require('node:path');
const module = { exports: {} };
dlopen(module, join(__dirname, 'local.node'), constants.dlopen.RTLD_NOW);
module.exports.foo();