- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) > web開(kāi)發(fā) > JavaScript >
- nodejs利用readline提示輸入內容實(shí)例代碼
最近進(jìn)行小版本發(fā)包測試時(shí)忘記修改版本號了,進(jìn)而想到在打包前提示輸入版本號,然后把版本號打進(jìn)版本說(shuō)明內。最終效果為雙擊bat文件在終端內提示輸入版本號,輸入完成后保存版本號。
雖說(shuō)批處理也可以做這事,但用js來(lái)寫(xiě)更得心應手點(diǎn),故選用js處理。
過(guò)程分為四步
簡(jiǎn)單來(lái)說(shuō)是用bat文件觸發(fā)打包命令進(jìn)行打包。
首先創(chuàng )建兩個(gè)文件buildVersion.bat、buildVersion.js。
buildVersion.bat中使用node運行js文件
@echo off set curpath=%~dp0 %curpath%nodejs\node.exe %curpath%buildVersion.js pause
%~dp0為當前目錄。也可以在js后面傳參數,如--buildType default
使用readline實(shí)現問(wèn)答效果,再用child_process執行打包命令行。
進(jìn)入buildVersion.js文件,先寫(xiě)簡(jiǎn)單的提示輸入效果。
const readline = require('readline'); const rl = readline.createInterface({ input: process.stdin, output: process.stdout, }); rl.question(`請輸入新版本號: `, (name) => { });
這樣達不到效果。我們先顯示之前的版本號,然后再提示輸入新版本號,而且輸入為空時(shí)沿用上次版本號。
// 獲取版本信息,具體實(shí)現在第三步 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)}`);
在終端上效果為
有時(shí)版本號前會(huì )有固定前綴,我們在提示輸入時(shí)把前綴顯示出來(lái),可以隨意刪除
// 寫(xiě)入默認值 rl.write("Version ")
接下來(lái)是運行打包命令。當前項目使用gulp打包。要在終端中顯示gulp的提示信息,選用child_process.spawn
// 解析bat運行傳入的參數 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' });
修改文件我想到的事用fs.writeFile寫(xiě)文件,但這樣對json格式很好處理,對js文件處理很不方便。所以我把版本信息單獨存在json文件中。創(chuàng )建兩個(gè)文件version.js、version.json。
var VersionInfoJson; // 考慮到可能會(huì )在html中引用,做了區分 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è)空的對象,而不是使用{}或者[],這樣可以保持原形鏈的繼承; // 2、用obj.hasOwnProperty(key)來(lái)判斷屬性是否來(lái)自原型鏈上,因為for..in..也會(huì )遍歷其原型鏈上的可枚舉屬性。 // 3、上面的函數用到遞歸算法,在函數有名字,而且名字以后也不會(huì )變的情況下,這樣定義沒(méi)有問(wèn)題。但問(wèn)題是這個(gè)函數的執行與函數名 factorial 緊緊耦合在了一起。為了消除這種緊密耦合的現象,需要使用 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解除與函數名的耦合 } } 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讀取版本號json文件
這一步就簡(jiǎn)單了??梢灾苯右胘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)
做近一步的處理。
到此這篇關(guān)于nodejs利用readline提示輸入內容的文章就介紹到這了,更多相關(guān)nodejs readline提示輸入內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。
Copyright ? 2009-2022 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 特網(wǎng)科技 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 百度云 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站