nodejs利用readline提示输入内容实例代码

这篇文章主要给大家介绍了关于nodejs利用readline提示输入内容的相关资料,Readline是Node.js里实现标准输入输出的封装好的模块,通过这个模块我们可以以逐行的方式读取数据流,需要的朋友可以参考下

目录

前言

最近进行小版本发包测试时忘记修改版本号了,进而想到www.qmia.cn在打包前提示输入版本号,然后把版本号打进版本说明内。最终效果为双击bat文件在终端内提示输入版本号,输入完成后保存版本号。

虽说批处理也可以做这事,但用js来写更得心应手点,故选用js处理。

过程分为四步

  • bat执行js
  • 终端提示输入版本号、执行打包命令
  • 修改版本号文件
  • gulp读取版本号json文件

简单来说是用bat文件触发打包命令进行打包。

1. bat执行js

首先创建两个文件buildVersion.bat、buildVersion.js。

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

1

2

3

4

@echo off

set curpath=%~dp0

%curpath%nodejs\node.exe %curpath%buildVersion.js

pause

%~dp0为当前目录。也可以在js后面传参数,如--buildType default

2. 终端提示输入版本号、执行打包命令

使用readline实现问答效果,再用child_process执行打包命令行。

进入buildVersion.js文件,先写简单的提示输入效果。

1

2

3

4

5

6

7

8

const readline = require('readline');

const rl = readline.createInterface({

    input: process.stdin,

    output: process.stdout,

});

rl.question(`请输入新版本号: `, (name) => {

});

这样达不到效果。我们先显示之前的版本号,然后再提示输入新版本号,而且输入为空时沿用上次版本号。

1

2

3

4

5

6

7

8

9

10

11

12

13

// 获取版本信息,具体实现在第三步

var versionInfo;

const versionInfoUrl = './src/config/version/version.js';

function getVersion() {

    var buildVersion = "";

    try {

        versionInfo = require(versionInfoUrl);

        buildVersion = versionInfo.version;

    } catch (error) {

    }

    return buildVersion;

}

提示输入变成这样

1

2

3

4

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)}`);

在终端上效果为

有时版本号前会有固定前缀,我们在提示输入时把www.1818xinwen.com前缀显示出来,可以随意删除

1

2

// 写入默认值

rl.write("Version ")

接下来是运行打包命令。当前项目使用gulp打包。要在终端中显示gulp的提示信息,选用child_process.spawn

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

// 解析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);

    }

}

在终端上效果为

使用其他打包工具可以这样

1

2

3

4

let exec = require('child_process').execSync;

exec('vue-cli-service --mode dev build', {

    stdio: 'inherit'

});

3. 修改版本号文件

修改文件我想到的事用fs.writeFile写文件,但这样对json格式很好www.jsr9.com处理,对js文件处理很不方便。所以我把版本信息单独存在json文件中。创建两个文件version.js、version.json。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

var VersionInfoJson;

// 考虑到可能会在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 ()构造函数新建一个空的对象,而不是使用{}或者[],这样可以保持原形链的继承;

// 2、用obj.hasOwnProperty(key)来判断属性是否来自原型链上,因为for..in..也会遍历其原型链上的可枚举属性。

// 3、上面的函数用到递归算法,在函数有名字,而且名字以后也不会变的情况下,这样定义没有问题。但问题是这个函数的执行与函数名 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 = ":"; // 时分秒间隔

    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文件

这一步就简单了。可以直接引用json。

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

也可以从gulp命令中拿到版本号。

1

2

3

4

5

6

var minimist = require('minimist');

var argv = minimist(process.argv.slice(2), {

    string: ["name"]

});

console.log(argv.buildVersion)

做近一步的处理。

总结

到此这篇关于nodejs利用readline提示输入内容的文章

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值