国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

前端架構(gòu): 腳手架命令行交互核心實(shí)現(xiàn)之inquirer和readline的應(yīng)用教程

這篇具有很好參考價(jià)值的文章主要介紹了前端架構(gòu): 腳手架命令行交互核心實(shí)現(xiàn)之inquirer和readline的應(yīng)用教程。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

命令行交互核心實(shí)現(xiàn)

  • 核心目標(biāo):實(shí)現(xiàn)命令行行交互,如List
  • 命令行的交互呢比命令行的渲難度要更大,因?yàn)樗婕暗募夹g(shù)點(diǎn)會(huì)會(huì)更多
  • 它涉及以下技術(shù)點(diǎn)
    • 鍵盤(pán)輸入的一個(gè)監(jiān)聽(tīng) (這里通過(guò) readline來(lái)實(shí)現(xiàn))
    • 計(jì)算命令行窗口的尺寸
    • 清屏
    • 光標(biāo)的移動(dòng)
    • 輸出流的靜默 (我們輸出的內(nèi)容, 不讓它去輸出到當(dāng)前的這個(gè)終端中)
    • 借助輸入輸出流,引出輸入輸出流的一個(gè)監(jiān)聽(tīng)以及事件庫(kù) events
    • ansi escaped code 轉(zhuǎn)義字符
  • 命行交互其實(shí)是有一定復(fù)雜度的, 在這個(gè)過(guò)程中,最重點(diǎn)的庫(kù)和命行交互最重點(diǎn)庫(kù)是兩個(gè) readlineinquirer

inquirer

  • inquirer 是一個(gè)命令行交互常用的庫(kù),Weekly Downloads 30,375,340 (動(dòng)態(tài)數(shù)據(jù))
  • 作為一個(gè)命令行交互的庫(kù)能做到這個(gè)程度,可以說(shuō)是非常的不簡(jiǎn)單,而且一直在持續(xù)的進(jìn)行維護(hù),目前已經(jīng)達(dá)到9.2.15版本了
  • 安裝 $ npm i -S inquirer
  • 使用示例1:input類(lèi)型演示
    import inquirer from 'inquirer';
    inquirer
      .prompt([
        {
          type: 'input',
          name: 'yourName',
          message: 'your name:',
        }
      ])
      .then((answers) => {
        console.log(answers);
      })
      .catch((error) => {
        if (error.isTtyError) {
          // Prompt couldn't be rendered in the current environment
        } else {
          // Something else went wrong
        }
      });
    
    • 這里根據(jù)文檔上的框架結(jié)構(gòu)
    • 通過(guò) type, name, message 三個(gè)字段即可完成初始化創(chuàng)建
    • 更多,參考文檔:https://www.npmjs.com/package/inquirer#question
inquirer文檔,FE Architecture,前端,前端架構(gòu),腳手架
效果實(shí)例
  • 另外,比較常用的還有
    • default 默認(rèn)值字段
    • validate 字段是一個(gè)回調(diào)
      • 用于對(duì)字段的校驗(yàn),只有校驗(yàn)返回 true的時(shí)候校驗(yàn)才會(huì)結(jié)束
    • transformer 字段用于處理信息展示的回調(diào)
      • 也就是這個(gè)函數(shù)內(nèi)部返回的值是展示的值
      • 返回的值還是之前的 name 字段
      • 更多的像是表單中的 placeholder 僅作為展示
    • filter 字段是一個(gè)回調(diào)
      • 它會(huì)最終改變 answers 最終的結(jié)果
      • 會(huì)最終改變 name 字段
  • 其他: choice 在匹配 List 列表的時(shí)候會(huì)用到
  • 注意,prompt 方法內(nèi)部接受的是一個(gè)數(shù)組,可以寫(xiě)多個(gè)對(duì)象來(lái)收集數(shù)據(jù)
  • 使用示例2: 多字段演示
    import inquirer from 'inquirer';
    
    inquirer
      .prompt([
    	  {
    	  	type: 'input',
    	    name: 'yourName',
    	    message: 'your name:',
    	    default: 'Lee',
    	    validate: function(v) {
    	    	return v === 'Wang'
    	    },
    	    transformer: function(v) {
    	    	return 'your input name: ' + v // 僅作為展示
    	    },
    	    filter: function(v) {
    	    	return v;
    	    	// return v + '123' // 改變最終值
    	    }
    	  },
    	  {
    	  	type: 'number', // 這種,在沒(méi)有 validate 的情況下,如果輸入的是非數(shù)字, 會(huì)變成 NaN
    	  	name: 'num',
    	  	message: 'your number',
    	  },
    	  // ...
      ])
      .then((answers) => {
        console.log(answers); // 最終打印的是一個(gè)對(duì)象,多個(gè)字段
      })
      .catch((error) => {
        if (error.isTtyError) {
          // Prompt couldn't be rendered in the current environment
        } else {
          // Something else went wrong
        }
      });
    
    • 在示例1中已做了詳細(xì)說(shuō)明,這里不再贅述
inquirer文檔,FE Architecture,前端,前端架構(gòu),腳手架
效果實(shí)例
  • 使用示例3: confirm 類(lèi)型演示
    import inquirer from 'inquirer';
    
    inquirer
      .prompt([
    	  {
    	  	type: 'confirm', // 二選一功能
    	    name: 'choice',
    	    message: 'your choice:',
    	    default: false,
    	  },
      ])
      .then((answers) => {
        console.log(answers);
      })
      .catch((error) => {
        if (error.isTtyError) {
          // Prompt couldn't be rendered in the current environment
        } else {
          // Something else went wrong
        }
      });
    
inquirer文檔,FE Architecture,前端,前端架構(gòu),腳手架
效果實(shí)例
  • 使用示例4: list 類(lèi)型演示
    import inquirer from 'inquirer';
    
    inquirer
      .prompt([
    	  {
    	  	type: 'list', // 列表單選
    	    name: 'choice',
    	    message: 'your choice:',
    	    default: 0, // 這里 default 是 下面choices 的索引
    	    choices: [
    	    	{value: 1, name: 'LiLy'},
    	    	{value: 2, name: 'Lucy'},
    	    	{value: 3, name: 'Lee'},
    	    ]
    	  },
      ])
      .then((answers) => {
        console.log(answers);
      })
      .catch((error) => {
        if (error.isTtyError) {
          // Prompt couldn't be rendered in the current environment
        } else {
          // Something else went wrong
        }
      });
    
inquirer文檔,FE Architecture,前端,前端架構(gòu),腳手架inquirer文檔,FE Architecture,前端,前端架構(gòu),腳手架
效果實(shí)例
  • 使用示例5: expend 類(lèi)型演示
    import inquirer from 'inquirer';
    
    inquirer
      .prompt([
    	  {
    	  	type: 'expand', // 簡(jiǎn)寫(xiě)選擇
    	    name: 'choice',
    	    message: 'your choice:',
    	    default: 'red',
    	    choices: [
    	    	{value: 'red', key: 'R'},
    	    	{value: 'green', key: 'G'},
    	    	{value: 'blue', key: 'B'},
    	    ]
    	  },
      ])
      .then((answers) => {
        console.log(answers);
      })
      .catch((error) => {
        if (error.isTtyError) {
          // Prompt couldn't be rendered in the current environment
        } else {
          // Something else went wrong
        }
      });
    
    • 簡(jiǎn)寫(xiě)選擇功能,除了 Rgb 還有一個(gè) h
    • 輸入 h 回車(chē),會(huì)得到 help 提示,列出了所有選項(xiàng)
    • 輸入 r 回車(chē),會(huì)得到 red, 輸入 g 回車(chē),會(huì)得到 green
inquirer文檔,FE Architecture,前端,前端架構(gòu),腳手架inquirer文檔,FE Architecture,前端,前端架構(gòu),腳手架
效果實(shí)例
  • 使用示例6: checkbox 類(lèi)型演示
    import inquirer from 'inquirer';
    
    inquirer
      .prompt([
    	  {
    	  	type: 'checkbox', // 復(fù)選框
    	    name: 'choice',
    	    message: 'your choice:',
    	    default: 0,
    	    choices: [
    	    	{value: 1, name: 'Lily'},
    	    	{value: 2, name: 'Lucy'},
    	    	{value: 3, name: 'Lee'},
    	    ]
    	  },
      ])
      .then((answers) => {
        console.log(answers);
      })
      .catch((error) => {
        if (error.isTtyError) {
          // Prompt couldn't be rendered in the current environment
        } else {
          // Something else went wrong
        }
      });
    
    • 這里提供 a 全選,空格鍵 選中,i 反選的功能
    • 默認(rèn),上下箭來(lái)選擇
inquirer文檔,FE Architecture,前端,前端架構(gòu),腳手架inquirer文檔,FE Architecture,前端,前端架構(gòu),腳手架
效果實(shí)例
  • 使用示例7: password 類(lèi)型演示
    import inquirer from 'inquirer';
    
    inquirer
      .prompt([
    	  {
    	  	type: 'password', // 密碼框
    	    name: 'password',
    	    message: 'your password:',
    	  },
      ])
      .then((answers) => {
        console.log(answers);
      })
      .catch((error) => {
        if (error.isTtyError) {
          // Prompt couldn't be rendered in the current environment
        } else {
          // Something else went wrong
        }
      });
    
inquirer文檔,FE Architecture,前端,前端架構(gòu),腳手架
效果實(shí)例
  • 使用示例8: editor 類(lèi)型演示
    import inquirer from 'inquirer';
    
    inquirer
      .prompt([
    	  {
    	  	type: 'editor', // 編輯器
    	    name: 'editor',
    	    message: 'your editor text:',
    	  },
      ])
      .then((answers) => {
        console.log(answers);
      })
      .catch((error) => {
        if (error.isTtyError) {
          // Prompt couldn't be rendered in the current environment
        } else {
          // Something else went wrong
        }
      });
    
inquirer文檔,FE Architecture,前端,前端架構(gòu),腳手架inquirer文檔,FE Architecture,前端,前端架構(gòu),腳手架inquirer文檔,FE Architecture,前端,前端架構(gòu),腳手架
效果實(shí)例
  • 上面中間的這個(gè)類(lèi)似 vim 的界面,會(huì)在一個(gè)緩存文件中,輸入完以后,緩存文件被刪除掉
  • 我們輸入的結(jié)果會(huì)被保留下來(lái),如上圖
  • 這樣做的好處是在文本編輯器中輸入復(fù)雜的內(nèi)容

readline

  • readline,是 nodejs 當(dāng)中的一個(gè)內(nèi)置庫(kù),主要幫我們?nèi)ス芾頂?shù)據(jù)流的
  • 命令行當(dāng)中要交互的方式,一定是需要用戶提供一些輸入的
  • readline 就可以很好的幫我們?nèi)ヒ淮我淮蔚淖x取這個(gè)輸入流
  • 注意,這個(gè)輸入不僅是指我們輸入一些字符,還包含我們鍵盤(pán)上輸入的一切,如上,下,空格,回車(chē)等
  • 基本使用
    import * as readLine from 'readline';
    
    const rl = readLine.createInterface({
    	input: process.stdin,
    	output: process.stdout,
    });
    
    rl.question('your name: ', (answer) => {
    	console.log(answer);
    	rl.close(); // 關(guān)閉讀取流
    })
    
inquirer文檔,FE Architecture,前端,前端架構(gòu),腳手架
  • readline 主要用途是根據(jù)傳入的輸入流逐行讀取信息
  • 回車(chē)的時(shí)候,會(huì)認(rèn)為這行輸入結(jié)束,并且把所有輸入的內(nèi)容傳遞到輸出流中進(jìn)行展示
  • 這是readline的核心用途
  • 如果調(diào)試 readline 源碼,可知,它內(nèi)部會(huì)強(qiáng)制將函數(shù)轉(zhuǎn)換為構(gòu)造函數(shù)
    if (!(this instanceof Interface)) {
      return new Interface(input, output, completer, terminal);
    }
    
  • 接著是對(duì) StringDecoder的判斷和賦值,這個(gè)也是node的一個(gè)內(nèi)置庫(kù)
    if (StringDecoder === undefined) {
      StringDecoder = require('string_decoder').StringDecoder;
    }
    
  • 再之后,定義了一些列的參數(shù),調(diào)用了 EventEmitter
    EventEmitter.call(this)
    
    • 這個(gè)用途是使用 this 繼承 EventEmitter, this內(nèi)部就會(huì)生成一些列的屬性信息,如 _events, _eventsCount
    • 讓當(dāng)前 Interface 實(shí)例具備事件驅(qū)動(dòng)的能力,因?yàn)閚odejs有單線程,非阻塞IO,事件驅(qū)動(dòng)的特性
    • 也就是說(shuō)事件驅(qū)動(dòng),在單線程的nodejs中是非常重要的
  • 再接著,定義一些參數(shù), 對(duì) input 進(jìn)行判斷,也就是分析 input 參數(shù)
    if (input && input.input) {
      // ....
    }
    
  • 再往后找,看readline是如何做事件監(jiān)聽(tīng)的
    this.output = output; // output: WriteStream 系統(tǒng)輸出流
    this.input = input; // input: ReadStream 系統(tǒng)輸入流
    
    // ...
    
    emitKeypressEvents(input, this) // 這里就是監(jiān)聽(tīng)用戶在終端中的鍵盤(pán)輸入
    
    • 在 emitKeypressEvents 函數(shù)內(nèi)部,會(huì)調(diào)用一個(gè) emitKeys 的方法
    • 這里是核心, 其原理和源碼不在這里進(jìn)行剖析

文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-856231.html

到了這里,關(guān)于前端架構(gòu): 腳手架命令行交互核心實(shí)現(xiàn)之inquirer和readline的應(yīng)用教程的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 前端架構(gòu): 腳手架之Chalk和Chalk-CLI使用教程

    前端架構(gòu): 腳手架之Chalk和Chalk-CLI使用教程

    Chalk Chalk 是粉筆的意思, 它想表達(dá)的是,給我們的命令行中的文本添加顏色類(lèi)似彩色粉筆的功能 在官方文檔當(dāng)中,它的 Highlights 核心特性 它的性能很高,沒(méi)有三方依賴 它能夠支持256以及真彩色的實(shí)現(xiàn) 也就是說(shuō)這個(gè)庫(kù)可以讓你自己去定義它的色彩 并不是說(shuō)命令行中當(dāng)中的25

    2024年02月21日
    瀏覽(97)
  • 實(shí)現(xiàn)一個(gè)簡(jiǎn)單的前端腳手架

    實(shí)現(xiàn)一個(gè)簡(jiǎn)單的前端腳手架

    前端腳手架概念 實(shí)現(xiàn)前端腳手架 隨著前端工程化的概念越來(lái)越深入人心,腳手架應(yīng)運(yùn)而生。簡(jiǎn)單來(lái)說(shuō),「前端腳手架」就是指通過(guò)選擇幾個(gè)選項(xiàng)快速搭建項(xiàng)目基礎(chǔ)代碼的工具 前端腳手架可幫我們做什么? 可以幫助我們快速生成項(xiàng)目的基礎(chǔ)代碼 腳手架工具的項(xiàng)目模板經(jīng)過(guò)了

    2024年02月03日
    瀏覽(29)
  • springcloud-alibaba五大核心組件-后端開(kāi)發(fā)工程(腳手架)搭建

    Gitee倉(cāng)庫(kù)地址 點(diǎn)我 服務(wù)注冊(cè)與發(fā)現(xiàn): nacos 配置中心: nacos 服務(wù)遠(yuǎn)程調(diào)用: openfeign 微服務(wù)網(wǎng)關(guān): gateway 服務(wù)限流降級(jí)熔斷等: sentinel 實(shí)現(xiàn)的功能demo openfeign服務(wù)遠(yuǎn)程調(diào)用 sentinel限流測(cè)試 gateway網(wǎng)關(guān)調(diào)用2個(gè)微服務(wù) nacos的服務(wù)注冊(cè)與發(fā)現(xiàn) 軟件架構(gòu)(環(huán)境) jdk: 1.8 maven: 3.5.2 nacos: 注冊(cè)中心

    2024年02月05日
    瀏覽(88)
  • 和chatgpt學(xué)架構(gòu)01-搭建項(xiàng)目腳手架

    今年3月份以來(lái),chatgpt就熱度不減。有了這種聊天機(jī)器人,就可以很方便的幫助我們提高。無(wú)論是我們獨(dú)立創(chuàng)業(yè)還是做項(xiàng)目外包,擁有一套自己可以把握的腳手架還是必備的能力。 過(guò)去如果靠自己摸索,組裝這么一套腳手架還是費(fèi)事費(fèi)力的。一個(gè)是涉及技術(shù)比較多,既要架構(gòu)

    2024年02月16日
    瀏覽(25)
  • 處理解決運(yùn)行前端腳手架工程報(bào)錯(cuò): ‘vue-cli-service‘ 不是內(nèi)部或外部命令,也不是可運(yùn)行的程序 或批處理文件。附帶 Linux

    處理解決運(yùn)行前端腳手架工程報(bào)錯(cuò): ‘vue-cli-service‘ 不是內(nèi)部或外部命令,也不是可運(yùn)行的程序 或批處理文件。附帶 Linux

    目錄 一、場(chǎng)景介紹 二、處理方式 ? ? ? ? 1、?如果?package.json 配置沒(méi)有?vue-cli-server 那么就安裝它即可,注意安裝完畢需重啟編輯器啟動(dòng)項(xiàng)目,避免依賴添加不生效問(wèn)題 ? ? ? ? 2、如果 package.json 配置有?vue-cli-server 或者安裝了還是沒(méi)好,可以看看 node_modules 工程模塊是否存

    2024年02月22日
    瀏覽(90)
  • 前端如何搭建腳手架并在本地運(yùn)行

    前端如何搭建腳手架并在本地運(yùn)行

    在開(kāi)始搭建前,確保本機(jī)安裝了node,為避免奇奇怪怪的問(wèn)題 建議node版本16以上 使用過(guò)vue ,react,angular的同學(xué)都知道 ,應(yīng)該對(duì)腳手架有一定的理解,比如vue-cli的 vue create myApp ,其中vue 就是vue-cli聲明的一個(gè)命令,下來(lái)我們創(chuàng)建一個(gè)項(xiàng)目并聲明自己的命令。 創(chuàng)建一個(gè)空的文件夾

    2024年02月20日
    瀏覽(29)
  • Vue2向Vue3過(guò)度核心技術(shù)工程化開(kāi)發(fā)和腳手架

    Vue2向Vue3過(guò)度核心技術(shù)工程化開(kāi)發(fā)和腳手架

    1.1 開(kāi)發(fā)Vue的兩種方式 核心包傳統(tǒng)開(kāi)發(fā)模式:基于html / css / js 文件,直接引入核心包,開(kāi)發(fā) Vue。 工程化開(kāi)發(fā)模式:基于構(gòu)建工具(例如:webpack)的環(huán)境中開(kāi)發(fā)Vue。 工程化開(kāi)發(fā)模式優(yōu)點(diǎn): 提高編碼效率,比如使用JS新語(yǔ)法、Less/Sass、Typescript等通過(guò)webpack都可以編譯成瀏覽器識(shí)

    2024年02月11日
    瀏覽(66)
  • Vue的架構(gòu)以及基于腳手架環(huán)境開(kāi)發(fā)vue項(xiàng)目

    Vue的架構(gòu)以及基于腳手架環(huán)境開(kāi)發(fā)vue項(xiàng)目

    M:model 模型層(業(yè)務(wù)邏輯層),主要包含 JS 代碼,用于管理業(yè)務(wù)邏輯的實(shí)現(xiàn)。 V:View 視圖層,主要包括 HTML / CSS代碼,用于管理 UI 的展示。 VM:viewModel (視圖模型層),用于將data與視圖層的 DOM 進(jìn)行動(dòng)態(tài)綁定。 基于腳手架環(huán)境開(kāi)發(fā)Vue項(xiàng)目 制作web 從小作坊狀態(tài)轉(zhuǎn)向工程化開(kāi)

    2024年02月01日
    瀏覽(24)
  • 【前端】Vue2 腳手架模塊化開(kāi)發(fā) -快速入門(mén)

    【前端】Vue2 腳手架模塊化開(kāi)發(fā) -快速入門(mén)

    ??歡迎來(lái)到@邊境矢夢(mèng)°的csdn博文?? ???本文主要梳理Vue2 腳手架模塊化開(kāi)發(fā) ?? ??我是邊境矢夢(mèng)°,一個(gè)正在為秋招和算法競(jìng)賽做準(zhǔn)備的學(xué)生?? ??喜歡的朋友可以關(guān)注一下 ?????? ,下次更新不迷路?? Ps: 月亮越亮說(shuō)明知識(shí)點(diǎn)越重要 (重要性或者難度越大)??????????

    2024年02月10日
    瀏覽(97)
  • 新鮮出爐的 MVVM 腳手架 —— KtArmor-MVVM,面試安卓系統(tǒng)架構(gòu)

    新鮮出爐的 MVVM 腳手架 —— KtArmor-MVVM,面試安卓系統(tǒng)架構(gòu)

    } 通過(guò) @BindViewModel 注解viewModel 變量,KtArmor-MVVM 通過(guò) 反射 ,自動(dòng)創(chuàng)建 LoginViewModel 實(shí)例, 并賦值給 viewModel 變量。直接使用即可! @BaseUrl(API.BASE_URL) // 看這里?。?interface ApiService { @POST(API.LOGIN) suspend fun login(@Query(“username”) username: String, @Query(“password”) password: String): BaseRe

    2024年04月10日
    瀏覽(32)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包