@eggjs/utils

中文文档
5.1.0发布于 2026/10/07MITTypeScriptES Module构建来源已验证近 30 天下载 4.9万

Utils for all egg projects

原始使用文档
文档目录10 节
  1. Installation
  2. API
  3. getPlugins(options)
  4. getLoadUnits(options)
  5. getConfig(options)
  6. getFrameworkPath(options)
  7. setBundleModuleLoader(loader)
  8. Bundle / snapshot module-loading hooks
  9. License
  10. Contributors

@eggjs/utils

NPM version npm download Node.js Version

Utils for all egg projects.

Installation

npm i @eggjs/utils

API

getPlugins(options)

  • {String} baseDir - the current directory of application
  • {String} framework - the directory of framework
  • {String} env - egg environment

getLoadUnits(options)

  • {String} baseDir - the current directory of application
  • {String} framework - the directory of framework
  • {String} env - egg environment

getConfig(options)

  • {String} baseDir - the current directory of application
  • {String} framework - the directory of framework
  • {String} env - egg environment

getFrameworkPath(options)

  • {String} baseDir - the current directory of application
  • {String} framework - the directory of framework

setBundleModuleLoader(loader)

Register a module loader hook for bundled Egg apps. The hook runs before the normal importModule() resolution path.

  • {Function | undefined} loader - a synchronous function that receives the original filepath argument passed to importModule() after POSIX separator normalization, or a virtual specifier. It does not receive the resolved absolute file path from importResolve(). Return undefined to fall back to the normal import path.

The bundle loader is stored on globalThis, so bundled and external copies of @eggjs/utils share the same loader. Non-undefined results follow the same default export unwrapping rules as importModule(), including importDefaultOnly.

Bundle / snapshot module-loading hooks

importModule() resolves a module through the following hooks, in order. The first one that produces a value wins; otherwise it falls back to the native import() / require() path:

  1. globalThis.__EGG_BUNDLE_MODULE_LOADER__ — set via setBundleModuleLoader(). Looks up a module already inlined into the bundle (typically a static bundle map emitted by egg-bundler). Runs before on-disk resolution and receives the POSIX-normalized importModule() filepath or a virtual specifier. Return undefined to fall through.
  2. Snapshot module loader — set via setSnapshotModuleLoader(). This is a module-local hook (not a globalThis global) used by the V8 snapshot entry generator to serve pre-bundled modules synchronously, keyed by the resolved path. Once registered it handles every load that reaches it, so the importer below is not consulted while it is active.
  3. globalThis.__EGG_MODULE_IMPORTER__ — an async (or sync, since the value is awaited) importer that receives the resolved file path (the importResolve() result, with OS-native separators — not normalized). When set, and the two hooks above did not resolve the module, it replaces the native await import(filePath).

The bundle loader and importer globals are typed in @eggjs/typings (BundleModuleLoader / ModuleImporter); import @eggjs/typings/global to pick up the declare global augmentation. These hooks are the contract that egg-bundler's generated entry relies on. @eggjs/core's ManifestLoaderFS consults __EGG_BUNDLE_MODULE_LOADER__ directly; its importer/native fallback is reached through @eggjs/loader-fs, which calls back into importModule(). The tegg loader (LoaderUtil.loadFile) consults both globals directly, passing the loader filepath with separators normalized to POSIX.

__EGG_MODULE_IMPORTER__ has two main uses:

  • Bundler-based test runners (e.g. Vitest): route module loading through the runner's own module graph so the loader and the test file share a single module instance (otherwise ctx.getEggObject(ClassRef) fails with "can not get proto").
  • V8 startup-snapshot restore: the deserialized main function runs without a host dynamic-import callback, so native import() throws. The snapshot entry installs a synchronous require()-based importer (createRequire() over the bundle output dir); require() can load ESM on Node >= 22, so modules resolve without dynamic import.

License

MIT

Contributors

Contributors

Made with contributors-img.

版本与发布记录

@eggjs/utils 共发布 92 个版本,首次发布于 2023/05/28;过去 12 个月发布了 36 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
5.1.0latest2026/10/071 个月前
5.0.22026/10/061 个月前
5.0.2-rc.1rc2026/10/061 个月前
5.0.2-rc.02026/09/231 个月前
5.0.2-beta.27beta2026/09/201 个月前
5.0.2-beta.262026/08/073 个月前

关于 @eggjs/utils 的常见问题

@eggjs/utils 是什么?

Utils for all egg projects

如何安装 @eggjs/utils?

在项目目录运行 npm install @eggjs/utils,或使用 pnpm add / yarn add / bun add。

@eggjs/utils 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@eggjs/utils 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@eggjs/utils 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >=22.18.0。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@eggjs/utils 可以商用吗?

@eggjs/utils 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@eggjs/utils 的下载量有多少?

根据 npm 官方下载统计,@eggjs/utils 在 2026/10/13 – 2026/11/11 这 30 天内被下载 48,885 次,日均约 1,630 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@eggjs/utils 还在维护吗?

最新版本 5.1.0 发布于 2026/10/07(1 个月前);至今共发布 92 个版本,其中过去 12 个月发布了 36 个;首次发布于 2023/05/28。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。