最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

nodejs利用readline提示輸入內(nèi)容實(shí)例代碼

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

前言

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

雖說(shuō)批處理也可以做這事,但用js來(lái)寫(xiě)更得心應(yīng)手點(diǎn),故選用js處理。

過(guò)程分為四步

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

簡(jiǎn)單來(lái)說(shuō)是用bat文件觸發(fā)打包命令進(jìn)行打包。

1. bat執(zhí)行js

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

buildVersion.bat中使用node運(yùn)行js文件

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

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

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

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

進(jìn)入buildVersion.js文件,先寫(xiě)簡(jiǎn)單的提示輸入效果。

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

});

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

// 獲取版本信息,具體實(shí)現(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');  // 引入顏色庫(kù)
rl.question(`${chalk.cyan("當(dāng)前版本號(hào): ")}${chalk.bold.red(getVersion())} \n請(qǐng)輸入新版本號(hào): `, (name) => {
    !name && (name=versionInfo?versionInfo.version:"");
    console.log(`${chalk.cyan("新版本號(hào)是: ")}${chalk.bold.yellow(name)}`);

在終端上效果為

有時(shí)版本號(hào)前會(huì)有固定前綴,我們?cè)谔崾据斎霑r(shí)把前綴顯示出來(lái),可以隨意刪除

// 寫(xiě)入默認(rèn)值
rl.write("Version ")

接下來(lái)是運(yùn)行打包命令。當(dāng)前項(xiàng)目使用gulp打包。要在終端中顯示gulp的提示信息,選用child_process.spawn

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

const child_process = require('child_process');
rl.question(`${chalk.cyan("當(dāng)前版本號(hào): ")}${chalk.bold.red(getVersion())} \n請(qǐng)輸入新版本號(hào): `, (name) => {
    !name && (name=versionInfo?versionInfo.version:"");
    console.log(`${chalk.cyan("新版本號(hào)是: ")}${chalk.bold.yellow(name)}`);
    // 記錄新版本號(hào)
    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. 修改版本號(hào)文件

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

var VersionInfoJson;
// 考慮到可能會(huì)在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 ()構(gòu)造函數(shù)新建一個(gè)空的對(duì)象,而不是使用{}或者[],這樣可以保持原形鏈的繼承;
// 2、用obj.hasOwnProperty(key)來(lái)判斷屬性是否來(lái)自原型鏈上,因?yàn)閒or..in..也會(huì)遍歷其原型鏈上的可枚舉屬性。
// 3、上面的函數(shù)用到遞歸算法,在函數(shù)有名字,而且名字以后也不會(huì)變的情況下,這樣定義沒(méi)有問(wèn)題。但問(wèn)題是這個(gè)函數(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 = ":"; // 時(shí)分秒間隔
    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讀取版本號(hào)json文件

這一步就簡(jiǎn)單了??梢灾苯右胘son。

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

也可以從gulp命令中拿到版本號(hào)。

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

console.log(argv.buildVersion)

做近一步的處理。

總結(jié)

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

相關(guān)文章

  • Nodejs實(shí)現(xiàn)多文件夾文件同步

    Nodejs實(shí)現(xiàn)多文件夾文件同步

    這篇文章主要為大家介紹了Nodejs實(shí)現(xiàn)多文件夾文件同步,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-10-10
  • 詳解如何實(shí)現(xiàn)自由切換Node.js版本

    詳解如何實(shí)現(xiàn)自由切換Node.js版本

    作為開(kāi)發(fā)者,我們經(jīng)常在不同的項(xiàng)目中需要使用不同版本的 Node.js,有時(shí)舊項(xiàng)目需要舊版本,而新項(xiàng)目則可能依賴最新的 Node.js 版本,本文將介紹幾種常用的方法來(lái)自由切換 Node.js 版本,需要的朋友可以參考下
    2024-10-10
  • Nodejs 搭建簡(jiǎn)單的Web服務(wù)器詳解及實(shí)例

    Nodejs 搭建簡(jiǎn)單的Web服務(wù)器詳解及實(shí)例

    這篇文章主要介紹了Nodejs 搭建簡(jiǎn)單的Web服務(wù)器詳解及實(shí)例的相關(guān)資料,并附實(shí)例代碼和實(shí)現(xiàn)效果圖,需要的朋友可以參考下
    2016-11-11
  • Node.js中對(duì)通用模塊的封裝方法

    Node.js中對(duì)通用模塊的封裝方法

    這篇文章主要介紹了Node.js中對(duì)通用模塊的封裝方法,封裝方法參考了Underscore.js的實(shí)現(xiàn),需要的朋友可以參考下
    2014-06-06
  • 進(jìn)階之初探nodeJS

    進(jìn)階之初探nodeJS

    本文主要介紹了nodeJS的相關(guān)知識(shí)。具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-01-01
  • Express服務(wù)器端代碼熱加載的實(shí)現(xiàn)代碼

    Express服務(wù)器端代碼熱加載的實(shí)現(xiàn)代碼

    這篇文章主要介紹了Express服務(wù)器端代碼熱加載的實(shí)現(xiàn),文中通過(guò)代碼示例給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-01-01
  • Node中使用ES6語(yǔ)法的基礎(chǔ)教程

    Node中使用ES6語(yǔ)法的基礎(chǔ)教程

    隨著google和firfox以及node6.0對(duì)es6的支持,es6語(yǔ)法的定稿使它越來(lái)越受到關(guān)注,尤其是react項(xiàng)目基本上都是用es6來(lái)寫(xiě)的。下面這篇文章主要給大家介紹了關(guān)于Node中使用ES6語(yǔ)法的基礎(chǔ)教程,需要的朋友可以參考下。
    2018-01-01
  • Node.js包管理工具(npm、yarn、cnpm)

    Node.js包管理工具(npm、yarn、cnpm)

    本文主要介紹了Node.js包管理工具,包含npm、yarn、cnpm者三種,借助包管理工具,可以快速開(kāi)發(fā)項(xiàng)目,提升開(kāi)發(fā)效率,下面就來(lái)具體介紹一下如何使用,感興趣的可以了解一下
    2024-08-08
  • Thinkjs3新手入門(mén)之添加一個(gè)新的頁(yè)面

    Thinkjs3新手入門(mén)之添加一個(gè)新的頁(yè)面

    Thinkjs 是一個(gè)快速、簡(jiǎn)單的基于MVC和面向?qū)ο蟮妮p量級(jí)Node.js開(kāi)發(fā)框架,下面這篇文章主要給大家介紹了關(guān)于Thinkjs3新手入門(mén)之添加一個(gè)新的頁(yè)面的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。
    2017-12-12
  • node.js中的events.emitter.removeAllListeners方法使用說(shuō)明

    node.js中的events.emitter.removeAllListeners方法使用說(shuō)明

    這篇文章主要介紹了node.js中的events.emitter.removeAllListeners方法使用說(shuō)明,本文介紹了events.emitter.removeAllListeners 的方法說(shuō)明、語(yǔ)法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12

最新評(píng)論

大化| 灯塔市| 璧山县| 宣武区| 桃源县| 泽库县| 定陶县| 鹰潭市| 盐源县| 泸水县| 蓬溪县| 横峰县| 柳江县| 柘城县| 临海市| 蓬溪县| 泰安市| 乌审旗| 美姑县| 张家川| 盈江县| 青阳县| 博湖县| 巧家县| 宜兰县| 闽清县| 读书| 清丰县| 文登市| 合川市| 深圳市| 于都县| 金秀| 买车| 祁阳县| 久治县| 焦作市| 仙游县| 天门市| 区。| 阿拉尔市|