ESM (MJS)
了解如何在 ESM 应用程序中运行 Sentry。
不确定是否应使用此安装方法?请查看我们的 安装方法。
当在 ESM 模式下运行应用程序时,你不能使用 require()
来加载模块。相反,你需要使用 --import
命令行选项在应用程序启动之前加载模块。
你需要创建一个名为 instrument.mjs
的文件,该文件导入并初始化 Sentry:
instrument.mjs
Copied
import * as Sentry from "@sentry/node";
// Ensure to call this before importing any other modules!
Sentry.init({
dsn: "https://examplePublicKey@o0.ingest.sentry.io/0",
// Add Tracing by setting tracesSampleRate
// We recommend adjusting this value in production
tracesSampleRate: 1.0,
});
调整你的 Node.js 调用以使用 --import 参数,并指向 instrument.mjs
,其中包含你的 Sentry.init()
代码:
Copied
# Note: This is only available for Node v18.19.0 onwards.
node --import ./instrument.mjs app.mjs
如果无法将 --import
标志传递给 Node.js 二进制文件,你可以使用 NODE_OPTIONS
环境变量,如下所示:
Copied
NODE_OPTIONS="--import ./instrument.mjs" npm run start
我们不支持 Node 版本 18.19.0 之前的 ESM。
默认情况下,所有包都会通过 import-in-the-middle 在内部包装,以帮助仪器化它们。
如果 import-in-the-middle
在包装某个包时遇到问题,你可能会在运行时看到语法错误或在控制台中看到日志错误:
Copied
SyntaxError: The requested module '...' does not provide an export named '...'
(node:3368) Error: 'import-in-the-middle' failed to wrap 'file://../../path/to/file.js'
要确认这些错误是由 import-in-the-middle
引起的, 可以通过将 registerEsmLoaderHooks
设置为 false
来禁用它。请注意,这也会 禁用跟踪仪器化:
instrument.mjs
Copied
import * as Sentry from "@sentry/node";
Sentry.init({
registerEsmLoaderHooks: false,
});
如果你通过 --import
启动 Sentry,可以指示 import-in-the-middle
仅包装 Sentry 特定仪器化的包。为此,可以将 onlyIncludeInstrumentedModules
设置为 true
:
instrument.mjs
Copied
import * as Sentry from "@sentry/node";
Sentry.init({
registerEsmLoaderHooks: {
onlyIncludeInstrumentedModules: true,
},
});