consola
优雅的控制台封装。
优雅的控制台封装器
为何选择 Consola?
👌 易于使用
💅 精美输出,并为极简环境提供回退方案
🔌 可插拔的报告器
💻 一致的命令行界面 (CLI) 体验
🏷 标签支持
🚏 将 console
和 stdout/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",
});
将在终端中显示
您可以使用不带花哨报告器的小型核心构建,以节省 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 })
显示输入提示。类型可以是 text
、confirm
、select
或 multiselect
之一。
有关使用示例,请参见 examples/prompt.ts。
addReporter(reporter)
- 别名:
add
注册自定义报告器实例。
removeReporter(reporter?)
- 别名:
remove
、clear
移除已注册的报告器。
如果未传递任何参数,则所有报告器都将被移除。
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