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,
  },
});