Logo of unenv

unenv

将 JavaScript 代码转换为运行时无关

unenv 是一个与框架无关的系统,可以将 JavaScript 代码转换为平台无关的代码,使其能够在任何环境(包括浏览器、Worker、Node.js 或 JavaScript 运行时)中运行。

安装

# Using npm
npm i -D unenv

# Using yarn
yarn add --dev unenv

# Using pnpm
pnpm add -D unenv

用法

使用 env 工具和内置预设,unenv 将提供一个抽象配置,可用于构建管道(rollup.jswebpack 等)。

import { env } from "unenv";

const { alias, inject, polyfill, external } = env({}, {}, {});

注意: 您可以提供任意数量的预设。unenv 将在内部合并它们,最右侧的预设具有更高的优先级。

预设

node

(查看源代码)

适用于将通用库转换为可在 Node.js 中运行。

  • 添加对全局 fetch API 的支持
  • 将 Node.js 内置模块设置为外部模块
import { env, nodeless } from "unenv";

const envConfig = env(node, {});

nodeless

(查看源代码)

适用于将为 Node.js 创建的库转换为在其他 JavaScript 运行时中运行。

import { env, nodeless } from "unenv";

const envConfig = env(nodeless, {});

deno

(查看源代码)

此预设可用于扩展 nodeless,以使用 Deno 的 Node.js API 兼容性(文档文档)。

此预设是**实验性**的,行为可能会发生变化!
import { env, nodeless, deno } from "unenv";

const envConfig = env(nodeless, deno, {});

cloudflare

(查看源代码)

此预设可用于扩展 nodeless,以使用 Cloudflare Worker Node.js API 兼容性(文档)。

此预设是**实验性**的,行为可能会发生变化!
请务必启用 nodejs_compat 兼容性标志。
import { env, nodeless, cloudflare } from "unenv";

const envConfig = env(nodeless, cloudflare, {});

vercel

此预设可用于扩展 nodeless,以使用 Vercel Edge Node.js API 兼容性(文档)。

此预设是**实验性**的,行为可能会发生变化!
import { env, nodeless, vercel } from "unenv";

const envConfig = env(nodeless, vercel, {});

内置 Node.js 模块

unenv 为所有 Node.js 内置模块提供了替代方案,以实现跨平台兼容性。

模块状态来源
node:assert模拟-
node:async_hooks已垫片化unenv/node/async_hooks
node:buffer已垫片化unenv/node/buffer
node:child_process模拟-
node:cluster模拟-
node:console模拟-
node:constants模拟-
node:crypto已垫片化unenv/node/crypto
node:dgram模拟-
node:diagnostics_channel模拟-
node:dns模拟-
node:domain模拟-
node:events已垫片化unenv/node/events
node:fs已垫片化unenv/node/fs
node:fs/promises已垫片化unenv/node/fs/promises
node:http2模拟-
node:http已垫片化unenv/node/http
node:https已垫片化unenv/node/https
node:inspector模拟-
node:module已垫片化unenv/node/module -
node:net已垫片化unenv/node/net
node:os模拟-
node:path已垫片化unenv/node/path
node:perf_hooks模拟-
node:process已垫片化unenv/node/process
node:punycode模拟-
node:querystring模拟-
node:readline模拟-
node:repl模拟-
node:stream已垫片化unenv/node/stream
node:stream/consumers模拟unenv/node/stream/consumers
node:stream/promises模拟unenv/node/stream/promises
node:stream/web原生unenv/node/stream/web
node:string_decoder已垫片化unenv/node/string_decoder
node:sys模拟-
node:timers模拟-
node:timers/promises模拟-
node:tls模拟-
node:trace_events模拟-
node:tty模拟-
node:url已垫片化unenv/node/url
node:util已垫片化unenv/node/util
node:util/types已垫片化unenv/node/util/types
node:v8模拟-
node:vm模拟-
node:wasi模拟-
node:worker_threads模拟-
node:zlib模拟-

npm 包

unenv 为常见的 npm 包提供了替代方案,以实现跨平台兼容性。

自动模拟代理

import MockProxy from "unenv/runtime/mock/proxy";

console.log(MockProxy().foo.bar()[0]);

上述包在 Node.js 之外无法工作,我们也不需要任何特定于平台的逻辑!当将 os 别名为 mock/proxy-cjs 时,它将使用 Proxy 对象进行自动模拟,该对象可以像 Object 一样递归遍历,像 Function 一样调用,像 Array 一样迭代,或像 Class 一样实例化。

我们使用此代理来自动模拟未实现的内部模块。想象一个包这样做:

const os = require("os");
if (os.platform() === "windows") {
  /* do some fix */
}
module.exports = () => "Hello world";

通过将 os 别名为 unenv/runtime/mock/proxy-cjs,代码将兼容其他平台。

其他垫片

要了解其他垫片,请查看 https://raw.githubusercontent.com/unjs/unenv/main/src/runtime

许可

MIT