Logo of consola

consola

优雅的控制台封装。

优雅的控制台封装器

为何选择 Consola?

👌  易于使用
💅  精美输出,并为极简环境提供回退方案
🔌  可插拔的报告器
💻  一致的命令行界面 (CLI) 体验
🏷  标签支持
🚏  将 consolestdout/stderr 重定向到 consola,并可轻松恢复重定向。
🌐  浏览器支持
⏯  暂停/恢复支持
👻  模拟支持
👮‍♂️  通过限制日志防止垃圾信息
❯  由 clack 提供支持的交互式提示

安装

使用 npm

npm i consola

使用 yarn

yarn add consola

使用 pnpm

pnpm i consola

快速入门

// ESM
import { consola, createConsola } from "consola";

// CommonJS
const { consola, createConsola } = require("consola");

consola.info("Using consola 3.0.0");
consola.start("Building project...");
consola.warn("A new version of consola is available: 3.0.1");
consola.success("Project built!");
consola.error(new Error("This is an example error. Everything is fine!"));
consola.box("I am a simple box");
await consola.prompt("Deploy to the production?", {
  type: "confirm",
});

将在终端中显示

consola-screenshot

您可以使用不带花哨报告器的小型核心构建,以节省 80% 的捆绑包大小

import { consola, createConsola } from "consola/basic";
import { consola, createConsola } from "consola/browser";
import { createConsola } from "consola/core";

Consola 方法

<type>(logObject) <type>(args...)

记录到所有报告器。

示例:consola.info('Message')

await prompt(message, { type })

显示输入提示。类型可以是 textconfirmselectmultiselect 之一。

有关使用示例,请参见 examples/prompt.ts

addReporter(reporter)

  • 别名:add

注册自定义报告器实例。

removeReporter(reporter?)

  • 别名:removeclear

移除已注册的报告器。

如果未传递任何参数,则所有报告器都将被移除。

setReporters(reporter|reporter[])

替换所有报告器。

create(options)

创建新的 Consola 实例,并继承所有父级选项作为默认值。

withDefaults(defaults)

使用提供的默认值创建新的 Consola 实例

withTag(tag)

  • 别名:withScope

使用该标签创建新的 Consola 实例。

wrapConsole() restoreConsole()

全局重定向所有 console.log 等调用到 consola 处理程序。

wrapStd() restoreStd()

全局重定向所有 stdout/stderr 输出到 consola。

wrapAll() restoreAll()

同时封装 std 和 console。

console 在底层使用 std,因此调用 wrapStd 也会重定向 console。此函数的优点是,像 console.info 这样的内容将被正确重定向到相应的类型。

pauseLogs() resumeLogs()

  • 别名:pause/resume

全局暂停和恢复日志。

Consola 会在暂停时将所有日志排队,然后在恢复时将它们发送给报告器。

mockTypes

  • 别名:mock

模拟所有类型。在测试中使用时非常有用。

传递给 mockTypes 的第一个参数应该是一个回调函数,接受 (typeName, type) 并返回模拟值

consola.mockTypes((typeName, type) => jest.fn());

请注意,在上面的示例中,所有内容都是为每种类型独立模拟的。如果您需要一个模拟函数,请在外部创建它

const fn = jest.fn();
consola.mockTypes(() => fn);

如果回调函数返回一个 falsy 值,则该类型将不会被模拟。

例如,如果您只需要模拟 consola.fatal

consola.mockTypes((typeName) => typeName === "fatal" && jest.fn());

注意: 任何继承模拟实例的 consola 实例都将再次应用提供的回调。通过这种方式,`withTag` 作用域的日志记录器无需额外努力即可进行模拟。

自定义报告器

Consola 开箱即用,内置 3 种报告器。默认情况下是一个华丽的彩色报告器,如果使用 unjs/std-env 检测到在测试或 CI 环境中运行,则会回退到基本报告器,并提供一个基本的浏览器报告器。

您可以创建一个新的报告器对象,该对象实现 { log(logObject): () => { } } 接口。

示例: 简单的 JSON 报告器

import { createConsola } from "consola";

const consola = createConsola({
  reporters: [
    {
      log: (logObj) => {
        console.log(JSON.stringify(logObj));
      },
    },
  ],
});

// Prints {"date":"2023-04-18T12:43:38.693Z","args":["foo bar"],"type":"log","level":2,"tag":""}
consola.log("foo bar");

日志级别

Consola 只显示配置的日志级别或更低级别的日志。(默认为 3

可用日志级别

  • 0:致命和错误
  • 1:警告
  • 2:普通日志
  • 3:信息日志,成功、失败、就绪、开始等...
  • 4:调试日志
  • 5:追踪日志
  • -999:静默
  • +999:详细日志

您可以通过以下方式设置日志级别:

  • level 选项传递给 createConsola
  • 在实例上设置 consola.level
  • 使用 CONSOLA_LEVEL 环境变量(浏览器和核心构建不支持)。

日志类型

日志类型以 consola.[type](https://raw.githubusercontent.com/unjs/consola/main/...) 的形式暴露,每种类型都是样式和日志级别的预设。

所有可用内置类型的列表可在此处找到

创建新实例

Consola 有一个全局实例,建议在任何地方使用。如果需要更多控制,请创建一个新实例。

import { createConsola } from "consola";

const logger = createConsola({
  // level: 4,
  // fancy: true | false
  // formatOptions: {
  //     columns: 80,
  //     colors: false,
  //     compact: false,
  //     date: false,
  // },
});

集成

与 jest 或 vitest 集成

describe("your-consola-mock-test", () => {
  beforeAll(() => {
    // Redirect std and console to consola too
    // Calling this once is sufficient
    consola.wrapAll();
  });

  beforeEach(() => {
    // Re-mock consola before each test call to remove
    // calls from before
    consola.mockTypes(() => jest.fn());
  });

  test("your test", async () => {
    // Some code here

    // Let's retrieve all messages of `consola.log`
    // Get the mock and map all calls to their first argument
    const consolaMessages = consola.log.mock.calls.map((c) => c[0]);
    expect(consolaMessages).toContain("your message");
  });
});

与 jsdom 集成

{
  virtualConsole: new jsdom.VirtualConsole().sendTo(consola);
}

控制台工具

// ESM
import {
  stripAnsi,
  centerAlign,
  rightAlign,
  leftAlign,
  align,
  box,
  colors,
  getColor,
  colorize,
} from "consola/utils";

// CommonJS
const { stripAnsi } = require("consola/utils");

许可

MIT