Node.js 命令行加载动画工具库。
- 50+ 内置动画样式
- 支持自定义动画帧
- 可配置前缀、后缀、动画速度
- 支持进度百分比显示
- 链式 API
- 内置 succeed/fail/warn/info 彩色输出
- 零依赖
npm install spinner-utilsconst Spinner = require('spinner-utils');
// 创建并启动
const spinner = new Spinner({
frames: 'braille',
prefix: 'Loading',
interval: 100,
autoStart: true
});
// 或者使用快捷方法
const spinner = Spinner.spin('dots', 'Please wait');const Spinner = require('spinner-utils');
const spinner = new Spinner({
frames: 'braille', // 动画预设或自定义数组
prefix: 'Loading', // 前缀文字
suffix: '', // 后缀文字
interval: 100, // 动画间隔(毫秒)
autoStart: true // 自动开始动画
});
// 完成后调用
spinner.succeed('Done!');| 预设名 | 示例输出 |
|---|---|
| braille | Loading - / \ |
| moon | Loading - ... |
| dots | Loading - ... |
| line | Loading / | \ - |
| arrow | Loading - ... |
| plus | Loading + ++ +++ |
| equal | Loading = == === |
| box | Loading - ... |
| pulse | Loading - ... |
| triangle | Loading - ... |
| loading | Loading L Lo Loa |
| wait | Loading wait wait. |
| dash | Loading - -- --- |
const spinner = new Spinner({
frames: ['<', '<-', '<--', '<---', '----'],
prefix: 'Uploading',
autoStart: true
});const spinner = new Spinner({
frames: 'box',
prefix: 'Downloading',
autoStart: true
});
let percent = 0;
const timer = setInterval(() => {
percent += 10;
spinner.setProgress(percent);
if (percent >= 100) {
clearInterval(timer);
spinner.succeed('Download complete!');
}
}, 300);const spinner = Spinner.spin('moon', 'Loading files...');
spinner.succeed('All files loaded!');spinner.succeed('Operation completed!'); // 绿色勾选
spinner.fail('Operation failed!'); // 红色叉
spinner.warn('Warning: low disk space!'); // 黄色警告
spinner.info('Info: 3 files processed'); // 青色信息new Spinner()
.setFrames('braille')
.setPrefix('Processing')
.setProgress(0)
.start();
.setProgress(50)
// ...
.succeed('Complete!');# 全局安装或使用 npx
npm install -g spinner-utils
# 基本用法
spinner "Processing..."
# 自定义动画
spinner -f moon "Loading..."
# 查看所有预设
spinner --list
spinner -l
# 自定义间隔
spinner -i 50 "Fast loading..."创建 Spinner 实例。
参数:
frames(string|string[]): 动画帧或预设名称。默认:'braille'prefix(string): 前缀文字。默认:'Loading'suffix(string): 后缀文字。默认:''interval(number): 动画间隔(毫秒)。默认:100stream(stream): 输出流。默认:process.stdoutautoStart(boolean): 自动开始动画。默认:false
| 方法 | 描述 |
|---|---|
| start() | 开始动画 |
| stop() | 停止并清除动画 |
| pause() | 暂停(保留最后帧) |
| resume() | 恢复暂停的动画 |
| setPrefix(text) | 设置前缀 |
| setSuffix(text) | 设置后缀 |
| setProgress(percent) | 设置进度百分比 |
| setMessage(msg) | 设置消息 |
| setFrames(frames) | 切换动画 |
| succeed(msg) | 显示成功并停止 |
| fail(msg) | 显示错误并停止 |
| warn(msg) | 显示警告并停止 |
| info(msg) | 显示信息并停止 |
| 方法 | 描述 |
|---|---|
| Spinner.spin(frames, prefix, interval) | 快捷创建并启动 |
| Spinner.presets | 获取所有预设名称 |
| Spinner.preset(name) | 获取预设动画帧 |
编辑 frames.js 文件添加新预设:
// frames.js
module.exports = {
// 现有预设...
// 新增动画:
mySpinner: ['A', 'B', 'C', 'D'],
};使用:
const spinner = new Spinner({ frames: 'mySpinner', autoStart: true });function fetchData() {
return new Promise((resolve) => {
const spinner = new Spinner({ prefix: 'Fetching data', autoStart: true });
setTimeout(() => {
spinner.succeed('Data fetched!');
resolve({ data: [1, 2, 3] });
}, 2000);
});
}const Spinner = require('spinner-utils');
const files = ['a.txt', 'b.txt', 'c.txt'];
const spinner = new Spinner({
frames: 'equal',
prefix: 'Processing files',
autoStart: true
});
let processed = 0;
files.forEach((file, i) => {
setTimeout(() => {
processed++;
spinner.setSuffix(` (${processed}/${files.length})`);
if (processed === files.length) {
spinner.succeed(`Processed ${files.length} files!`);
}
}, (i + 1) * 500);
});MIT