摘要:引子很多使用開發(fā)的工具都會(huì)提供一個(gè)命令行操作界面,這些工具在執(zhí)行的過(guò)程中會(huì)實(shí)時(shí)更新執(zhí)行進(jìn)度或數(shù)據(jù)的下載解壓縮進(jìn)度等,例如,這些信息會(huì)再終端的同一行的同一位置顯示,而不是一行一行逐次打印顯示那么其是怎么實(shí)現(xiàn)的有沒有相應(yīng)地模塊提供這個(gè)功能呢嗯,
引子
很多使用nodejs開發(fā)的工具都會(huì)提供一個(gè)命令行操作界面(CLI),這些工具在執(zhí)行的過(guò)程中會(huì)實(shí)時(shí)更新執(zhí)行進(jìn)度或數(shù)據(jù)的下載解壓縮進(jìn)度等,例如10%,20%,30%...
這些信息會(huì)再終端的同一行的同一位置顯示,而不是一行一行逐次打印顯示......
那么其是怎么實(shí)現(xiàn)的?nodejs有沒有相應(yīng)地模塊提供這個(gè)功能呢?
嗯,NodeJS中有的,它就是readline模塊,這個(gè)模塊提供了正行數(shù)據(jù)讀取寫入,終端提示符位置控制等API
實(shí)現(xiàn)的功能本文章提供一個(gè)樣例代碼,主要說(shuō)明終端提示符位置控制問(wèn)題,把需要注意的點(diǎn)都列在其中了
終端字符顯示寬度問(wèn)題
終端界面能夠顯示的字符區(qū)域大小問(wèn)題
終端當(dāng)前提示符的位置問(wèn)題
終端相同位置上內(nèi)容實(shí)時(shí)更新的問(wèn)題
這些問(wèn)題在樣例中都有涉及及說(shuō)明到
使用nodejs的readline模塊對(duì)命令行控制終端的提示符位置進(jìn)行控制
模擬詢問(wèn)用戶是否啟動(dòng)應(yīng)用
啟動(dòng)應(yīng)用后實(shí)時(shí)更新運(yùn)行進(jìn)度信息從1%~100%,此信息顯示同一行的同一個(gè)位置
var readline = require("readline"); var util=require("util"); var inputStream=process.stdin; var outputStream=process.stdout; var rl = readline.createInterface({ input: inputStream, output: outputStream, terminal:true }); var promptStr="MyApp> "; //獲得字符串實(shí)際長(zhǎng)度,中文2,英文1 //控制臺(tái)中中文占用2個(gè)英文字符的寬度 var getDisplayLength=function(str) { var realLength = 0, len = str.length, charCode = -1; for (var i = 0; i < len; i++) { charCode = str.charCodeAt(i); if (charCode >= 0 && charCode <= 128) realLength += 1; else realLength += 2; } return realLength; }; //計(jì)算一個(gè)字符串在當(dāng)前控制臺(tái)中占用的行數(shù)和列數(shù)信息 //outputStream.rows及outputStream.columns屬性為當(dāng)前控制臺(tái)的顯示的窗口的大寫 var getStrOccRowColumns=function(str){ //str=promptStr+str; var consoleMaxRows=outputStream.rows; var consoleMaxColumns=outputStream.columns; var strDisplayLength=getDisplayLength(str); var rows=parseInt(strDisplayLength/consoleMaxColumns,10); var columns=parseInt(strDisplayLength-rows*consoleMaxColumns,10); return { rows:rows, columns:columns } }; //console.log(getDisplayLength(promptStr)); rl.setPrompt(promptStr); rl.prompt(); rl.question("你想要個(gè)啟動(dòng)應(yīng)用處理嗎?", function(answer) { rl.prompt(); rl.write(util.format("啟動(dòng)應(yīng)用得到的回復(fù)為:%s ", answer)); //更新同一個(gè)位置顯示的字符信息,每1秒更新1一次,一直到100% var k= 0,max=100,prevOutputContent,outputContent, cursorDx=0,cursorDy= 0,dxInfo; //計(jì)算 rl.prompt(); var interval=setInterval(function(){ if(k
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/86031.html
摘要:級(jí)版目錄進(jìn)入退出三種模式光標(biāo)移動(dòng)文本修改查找替換設(shè)置環(huán)境進(jìn)入退出進(jìn)入命令示例說(shuō)明進(jìn)入編輯器,類似于打開文本編輯器軟件用編輯器打開文件 ?級(jí)版 目錄1. 進(jìn)入退出2. 三種模式3. 光標(biāo)移動(dòng)4. 文本修改5. 查找替換6. 設(shè)置環(huán)境1. 進(jìn)入退出進(jìn)入命令示例說(shuō)明vi進(jìn)入vi編輯器,類...
摘要:按屏幕往后移動(dòng)半頁(yè)。按移動(dòng)到光標(biāo)所在行的行首按光標(biāo)跳到下個(gè)字的開頭按光標(biāo)跳到下個(gè)字的字尾按光標(biāo)回到上個(gè)字的開頭按光標(biāo)移到該行的第個(gè)位置,如。例如,,表示移動(dòng)光標(biāo)至文章的第行行首。 01:查找和替換 例1:要找about字符串 /about 在命令行輸入/后接要查找的字符串,下一個(gè)匹配按n(ext),上一個(gè)是N?about 在當(dāng)前位置找,n跳到前一個(gè)匹配/about$ 匹配行尾的a...
閱讀 2664·2019-08-30 15:53
閱讀 2880·2019-08-29 16:20
閱讀 1087·2019-08-29 15:10
閱讀 1028·2019-08-26 10:58
閱讀 2198·2019-08-26 10:49
閱讀 640·2019-08-26 10:21
閱讀 708·2019-08-23 18:30
閱讀 1640·2019-08-23 15:58