欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

nodejs利用readline提示輸入內容實例代碼

 更新時間:2021年07月15日 12:09:05   作者:微妙  
這篇文章主要給大家介紹了關于nodejs利用readline提示輸入內容的相關資料,Readline是Node.js里實現(xiàn)標準輸入輸出的封裝好的模塊,通過這個模塊我們可以以逐行的方式讀取數(shù)據(jù)流,需要的朋友可以參考下

前言

最近進行小版本發(fā)包測試時忘記修改版本號了,進而想到在打包前提示輸入版本號,然后把版本號打進版本說明內。最終效果為雙擊bat文件在終端內提示輸入版本號,輸入完成后保存版本號。

雖說批處理也可以做這事,但用js來寫更得心應手點,故選用js處理。

過程分為四步

  • bat執(zhí)行js
  • 終端提示輸入版本號、執(zhí)行打包命令
  • 修改版本號文件
  • gulp讀取版本號json文件

簡單來說是用bat文件觸發(fā)打包命令進行打包。

1. bat執(zhí)行js

首先創(chuàng)建兩個文件buildVersion.bat、buildVersion.js。

buildVersion.bat中使用node運行js文件

@echo off
set curpath=%~dp0
%curpath%nodejs\node.exe %curpath%buildVersion.js
pause

%~dp0為當前目錄。也可以在js后面?zhèn)鲄?shù),如--buildType default

2. 終端提示輸入版本號、執(zhí)行打包命令

使用readline實現(xiàn)問答效果,再用child_process執(zhí)行打包命令行。

進入buildVersion.js文件,先寫簡單的提示輸入效果。

const readline = require('readline');
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout,
});
rl.question(`請輸入新版本號: `, (name) => {

});

這樣達不到效果。我們先顯示之前的版本號,然后再提示輸入新版本號,而且輸入為空時沿用上次版本號。

// 獲取版本信息,具體實現(xiàn)在第三步
var versionInfo;
const versionInfoUrl = './src/config/version/version.js';
function getVersion() {
    var buildVersion = "";
    try {
        versionInfo = require(versionInfoUrl);
        buildVersion = versionInfo.version;
    } catch (error) {

    }
    return buildVersion;
}

提示輸入變成這樣

const chalk = require('chalk');  // 引入顏色庫
rl.question(`${chalk.cyan("當前版本號: ")}${chalk.bold.red(getVersion())} \n請輸入新版本號: `, (name) => {
    !name && (name=versionInfo?versionInfo.version:"");
    console.log(`${chalk.cyan("新版本號是: ")}${chalk.bold.yellow(name)}`);

在終端上效果為

有時版本號前會有固定前綴,我們在提示輸入時把前綴顯示出來,可以隨意刪除

// 寫入默認值
rl.write("Version ")

接下來是運行打包命令。當前項目使用gulp打包。要在終端中顯示gulp的提示信息,選用child_process.spawn

// 解析bat運行傳入的參數(shù)
var minimist = require('minimist');
var argv = minimist(process.argv.slice(2), {
    string: ["name"]
});

const child_process = require('child_process');
rl.question(`${chalk.cyan("當前版本號: ")}${chalk.bold.red(getVersion())} \n請輸入新版本號: `, (name) => {
    !name && (name=versionInfo?versionInfo.version:"");
    console.log(`${chalk.cyan("新版本號是: ")}${chalk.bold.yellow(name)}`);
    // 記錄新版本號
    changeVersion(name);
    
    var buildType = argv.buildType || "build"  // 命令為gulp中配置好的

    var gulpCmd = `gulp ${buildType} --buildVersion "${name}" --color --f ${__dirname}/gulpfile.js`;
    console.log(gulpCmd);
    let spawnProcess = child_process.spawn(gulpCmd, [], {
        shell: true
    });
    spawnProcess.stdout.on('data', (data) => {
        console.log(`${data.toString()}`);
    });
    spawnProcess.stderr.on('data', (data) => {
        console.log(`stderror: ${data}`);
    });
    spawnProcess.on('close', (code) => {
        if (code !== 0) {
            console.log(`close: $[code]`);
        }
    });
    spawnProcess.on('exit', (code) => {
        // console.log(`exit: ${code.toString()}`);
        console.log(chalk.bold.yellow("-----------------  完成  --------------------"));
    });
});

function changeVersion(params) {
    if (versionInfo && versionInfo.changeVersion) {
        versionInfo.changeVersion(params);
    }
}

在終端上效果為

使用其他打包工具可以這樣

let exec = require('child_process').execSync;
exec('vue-cli-service --mode dev build', {
    stdio: 'inherit'
});

3. 修改版本號文件

修改文件我想到的事用fs.writeFile寫文件,但這樣對json格式很好處理,對js文件處理很不方便。所以我把版本信息單獨存在json文件中。創(chuàng)建兩個文件version.js、version.json。

var VersionInfoJson;
// 考慮到可能會在html中引用,做了區(qū)分
if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {
    getVersionInfo(true);
} else {
    if (typeof define === 'function' && define.amd) {
        getVersionInfo(false);
    } else {
        getVersionInfoLocal();
    }
}

function getVersionInfo(isModule) {
    try {
        VersionInfoJson = require("./version.json");
    } catch (error) {
        VersionInfoJson = {};
    }
    VersionInfoJson.buildTime = getNowFormatDate();
    VersionInfoJson.changeVersion = changeVersion;

    if (isModule) {
        module.exports = VersionInfoJson;
    }else{
        define([], function () {
            return VersionInfoJson;
        });
    }
}

async function getVersionInfoLocal() {
    try {
        VersionInfoJson = await getVersionJson();
    } catch (error) {
        VersionInfoJson = {};
    }
    VersionInfoJson.buildTime = getNowFormatDate();
    window.VersionInfo = VersionInfoJson;
}

function getVersionJson() {
    return new Promise((resolve, reject)=>{
        var request = new XMLHttpRequest();
        request.open("get", "config/version/version.json");
        request.send(null);
        request.onload = function () {
            if (request.status == 200) {
                var json = JSON.parse(request.responseText);
                resolve(json);
            }else{
                var json = {};
                resolve(json);
            }
        }
    });
}

function changeVersion(version) {
    var copyVersion = cloneObj(VersionInfoJson);
    copyVersion.version = version;
    if (copyVersion.hasOwnProperty("changeVersion")) {
        delete copyVersion["changeVersion"]
    }
    // console.log(copyVersion, __dirname, __filename)
    let fs = require('fs');
    fs.writeFile(__dirname + "/version.json", JSON.stringify(copyVersion), (err) => {

    });
}

// 1、用new obj.constructor ()構造函數(shù)新建一個空的對象,而不是使用{}或者[],這樣可以保持原形鏈的繼承;
// 2、用obj.hasOwnProperty(key)來判斷屬性是否來自原型鏈上,因為for..in..也會遍歷其原型鏈上的可枚舉屬性。
// 3、上面的函數(shù)用到遞歸算法,在函數(shù)有名字,而且名字以后也不會變的情況下,這樣定義沒有問題。但問題是這個函數(shù)的執(zhí)行與函數(shù)名 factorial 緊緊耦合在了一起。為了消除這種緊密耦合的現(xiàn)象,需要使用 arguments.callee。
function cloneObj(obj) {
    if (obj === null) return null
    if (typeof obj !== 'object') return obj;
    if (obj.constructor === Date) return new Date(obj);
    if (obj.constructor === RegExp) return new RegExp(obj);
    var newObj = new obj.constructor(); //保持繼承鏈
    for (var key in obj) {
        if (obj.hasOwnProperty(key)) { //不遍歷其原型鏈上的屬性
            var val = obj[key];
            newObj[key] = typeof val === 'object' ? arguments.callee(val) : val; // 使用arguments.callee解除與函數(shù)名的耦合
        }
    }
    return newObj;
}

function getNowFormatDate() {
    var date = new Date();
    var seperator1 = "-"; // 年月日間隔
    var seperator2 = ":"; // 時分秒間隔
    var month = date.getMonth() + 1;
    var strDate = date.getDate();
    if (month >= 1 && month <= 9) {
        month = "0" + month;
    }
    if (strDate >= 0 && strDate <= 9) {
        strDate = "0" + strDate;
    }
    var currentdate = date.getFullYear() + seperator1 + month + seperator1 + strDate +
        " " + date.getHours() + seperator2 + date.getMinutes() +
        seperator2 + date.getSeconds();
    return currentdate;
}

4. gulp讀取版本號json文件

這一步就簡單了??梢灾苯右胘son。

const versionInfo = require('./src/config/version/version.js');

也可以從gulp命令中拿到版本號。

var minimist = require('minimist');
var argv = minimist(process.argv.slice(2), {
    string: ["name"]
});

console.log(argv.buildVersion)

做近一步的處理。

總結

到此這篇關于nodejs利用readline提示輸入內容的文章就介紹到這了,更多相關nodejs readline提示輸入內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • NodeJS?Express使用ORM模型訪問關系型數(shù)據(jù)庫流程詳解

    NodeJS?Express使用ORM模型訪問關系型數(shù)據(jù)庫流程詳解

    這篇文章主要介紹了NodeJS?Express使用ORM模型訪問關系型數(shù)據(jù)庫流程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2023-01-01
  • Linux CentOS系統(tǒng)下安裝node.js與express的方法

    Linux CentOS系統(tǒng)下安裝node.js與express的方法

    這篇文章主要給大家介紹了在Linux CentOS系統(tǒng)下安裝node.js與express的方法,文中介紹的非常詳細,相信對大家具有一定的參考價值,需要的朋友們下面來一起看看吧。
    2017-04-04
  • NodeJs通過async/await處理異步的方法

    NodeJs通過async/await處理異步的方法

    本篇文章主要介紹了NodeJs通過async/await處理異步的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • Node server生成Swagger接口文檔步驟詳解

    Node server生成Swagger接口文檔步驟詳解

    本文介紹使用NodeJs搭建的后端server快速生成Swagger接口文檔的技巧,本文有詳細的步驟講解,通過代碼示例給大家介紹的非常詳細,具有一定的參考價值,需要的朋友可以參考下
    2024-01-01
  • node.js文件的復制、創(chuàng)建文件夾等相關操作

    node.js文件的復制、創(chuàng)建文件夾等相關操作

    這篇文章主要給大家介紹了node.js文件的復制、創(chuàng)建文件夾等相關操作,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-02-02
  • 淺談Node.js CVE-2017-14849 漏洞分析(詳細步驟)

    淺談Node.js CVE-2017-14849 漏洞分析(詳細步驟)

    這篇文章主要介紹了淺談Node.js CVE-2017-14849 漏洞分析(詳細步驟),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11
  • Node服務端實戰(zhàn)之操作數(shù)據(jù)庫示例詳解

    Node服務端實戰(zhàn)之操作數(shù)據(jù)庫示例詳解

    這篇文章主要為大家介紹了Node服務端實戰(zhàn)之操作數(shù)據(jù)庫示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • node.js事件循環(huán)機制及與js區(qū)別詳解

    node.js事件循環(huán)機制及與js區(qū)別詳解

    這篇文章主要為大家介紹了node.js事件循環(huán)機制及與js區(qū)別詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • Node.js調用java之node-java問題

    Node.js調用java之node-java問題

    這篇文章主要介紹了Node.js調用java之node-java問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • node運行js獲得輸出的三種方式示例詳解

    node運行js獲得輸出的三種方式示例詳解

    這篇文章主要介紹了node運行js獲得輸出的三種方式,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07

最新評論