从创建一个命令行小工具 来了解nodejs

452 阅读2分钟

项目初始化

yarn init -y
//初始化一个package.json

创建一个cli.js , 用于给命令行调用

console.log('this is cli.js')

运行 node cli 即可打印。

commander

commander被广泛运用于命令行开发

comamnder有几个常用的api

  1. program.version

program.version可以是用户了解到当前的版本,我们可以通过package.json来直接对其动态赋值

const pkg = require('./package.json');
program.version(pkg.version);
  1. process.argv

process.argv 是一个数组,可以用来获取用户输入的命令

我们可以通过 process.argv.length 来了解到用户输入了几个单词

  1. program.option
program.option('-x, --xxx', 'wait the x')

program.option 一般用于需要用户输入 “-” 的命令

  1. program.command
program
  .command('clear')
  .description('清除所有任务')
  .action(() => {
    //.....
  });

program.command 用于设置用户不需要输入 “-” 的命令,他可以处理一些复杂的逻辑。

node中的导入导出

nodejs与js不同,他有特殊的导出方法

//导出
const obj = {}
module.exports = obj

//导入
const obj = require('...')

home目录与拼接路径

  1. 获取home路径
const homedir = process.env.HOME || require('os').homedir();
// process.env.HOME 获取环境变量中的 home路径
// require('os').homedir() 获取系统的home路径
  1. 拼接路径
const p = require('path')
const dbpath = p.join(homedir, '.todo2')

fs文件系统

通过node中的fs,我们可以进行 读取/写入 等操作

  1. fs.readFile
fs.readFile(path, {flag: 'a+'}, (err, data) => {
  //xxxxx
})

{flag: 'a+'} 表示:若无该文件,则创建一个

  1. fs.writeFile
fs.writeFile(path, data, (error) => {
 //xxxxx
})

由于上述的方法为异步操作,我们可以使用Promise与其配合,通过回调函数进行一些操作。

inquirer

inquirer 是命令行中的一个类似菜单的一个库

需要注意:inquirer 中的 choice 可以是 数组,对象,函数。当其为对象时,value最好为字符串(而不是数字),否则可能会有bug

发布到npm

  1. package.json
  • name 必须为唯一值
  • bin 发布以后的命令
  • files 命令行用到的文件
  • main 程序的主文件入口

  1. 需要在cli文件中加入shebang
  • #!/usr/bin/env node
  1. 在项目文件中指向 chmod +x xxx.js 加入可执行权限

  2. 使用 nrm use npm 将npm源切换到原始源

  3. npm adduser 登录npm

  4. npm publish 发布

如何发布一个TS npm包

  1. 全局安装typescript
  2. 运行tsc --init 初始化一个tsconfig.json
  3. 创建一个dist目录,将config中的outDir改为 "dist/"
  4. 运行 tsc -p .
  5. 将package.json 中的 files 改为 ["dist/**/*.js"]
  6. 其余和发布普通包一样