Use process.stdout to "rewrite" stdout and simulate a loader.
- Dots - basic ... loader
- Stars - animate an 8 frame circle loader
- Progress Bar - simulate % completion
| const main = async () => { | |
| cf = 0; | |
| setInterval(() => { | |
| let loader = (num) => { | |
| arr = []; | |
| for (let i = 0; i < num; i++) { | |
| arr.push("."); | |
| } | |
| return arr.join(""); | |
| }; | |
| process.stdout.cursorTo(0); | |
| process.stdout.clearScreenDown(); | |
| process.stdout.write(loader(cf)); | |
| if (cf >= 3) { | |
| cf = 0; | |
| } else { | |
| cf += 1; | |
| } | |
| }, 250); | |
| }; | |
| main(); |
| const main = async () => { | |
| total = 30 | |
| cf = 0; | |
| setInterval(() => { | |
| let loader = (num) => { | |
| arr = [,">"]; | |
| for (let i = 0; i < num; i++) { | |
| arr.unshift("="); | |
| } | |
| let prog = (num/total).toFixed(2).replace(/^0\.+/, '') | |
| if ((num/total) < 1) { | |
| arr.unshift(`[${prog}%]`); | |
| } else { | |
| arr.unshift(`[100%]`); | |
| } | |
| return arr.join(""); | |
| }; | |
| process.stdout.cursorTo(0); | |
| process.stdout.clearScreenDown(); | |
| process.stdout.write(loader(cf)); | |
| if (cf >= total) { | |
| cf = 0; | |
| } else { | |
| cf += 1; | |
| } | |
| }, 250); | |
| }; | |
| main(); |
| const frames = [ | |
| ` | |
| *** | |
| * | |
| `, | |
| ` | |
| *** | |
| * | |
| `, | |
| ` | |
| ** | |
| * | |
| * | |
| `, | |
| ` | |
| * | |
| *** | |
| `, | |
| ` | |
| * | |
| *** | |
| `, | |
| ` | |
| * | |
| * | |
| ** | |
| `, | |
| ` | |
| ** | |
| * | |
| * | |
| `, | |
| ]; | |
| const main = async () => { | |
| cf = 0; | |
| setInterval(() => { | |
| process.stdout.moveCursor(0, -4) | |
| process.stdout.cursorTo(0) | |
| process.stdout.clearScreenDown() | |
| process.stdout.write(`${frames[cf]}\r`) | |
| if (cf >= frames.length - 1) { | |
| cf = 0; | |
| } else { | |
| cf += 1; | |
| } | |
| }, 100); | |
| }; | |
| main(); |