前端架构师-week5-理解命令行交互原理和inquirer的应用

news/2024/11/22 18:25:16/

项目创建准备阶段——判断当前目录是否为空功能开发

// commands/init/lib/index.js 文件部分内容class InitCommand extends Command {......async exec() {try {// 1. 准备阶段this.prepare();// 2. 下载模板// 3. 安装模板} catch (e) {log.error(e.message);}}......async prepare() {// 1. 判断当前目录是否为空if (!this.isCwdEmpty()) {// 1.1 询问是否继续创建}// 2. 是否启动强制更新// 3. 选择创建项目或组件// 4. 获取项目的基本信息}isCwdEmpty() {// 获取当前文件目录// console.log(path.resolve('.'))const localPath = process.cwd();let fileList = fs.readdirSync(localPath);// 文件过滤的逻辑fileList = fileList.filter(file => (!file.startsWith('.') && ['node_modules'].indexOf(file) < 0));return !fileList || fileList.length <= 0;}
}

 inquirer 基本用法和常用属性入门

        作用:命令行交互库

npm install --save inquirer@^8.0.0
const inquirer = require('inquirer');inquirer.prompt([/* Pass your questions in here *//* 参考文档 Objects Question A question object is a hash containing question related values: */{type: 'input',name: 'yourName',message: 'your name:',default: 'noname',validate: function(v) {return v === 'sam'},transformer: function(v) { //作补充信息的,备注说明,不会影响最终结果。return 'name:' + v},filter: function(v) {  // 会改变最终结果。console.log(v);}},{ ...... }]).then((answers) => {// Use user feedback for... whatever!!console.log(answers.yourName)}).catch((error) => {if (error.isTtyError) {// Prompt couldn't be rendered in the current environment} else {// Something else went wrong}});

inquirer 其他交互形式演示

type: 'confirm'  二选一 Y/N

type: 'list'  需要提供 choices: [{value: xx, name: xx}]

type: 'rawlist'  和上面类似

type: 'expand'  需要提供 choices: [{value: xx, key: xx}],会显示key的首字母拼接如Rgbh

type: 'checkbox'  需要提供 choices: [{value: xx, name: xx}],会有多选功能

type: 'number'  非数字会返回 NaN

type: 'password'  

type: 'editor'  和vim效果类似

强制清空当前目录功能开发

lerna add inquirer commands/init/lerna add fs-extra commands/init/# core/cli 引用了 commands/init/,commands/init/加入新包时,core/cli 要 npm link
// commands/init/lib/index.js 文件内容//命令行中 --force,有两层含义。一:强制清空目录后安装,二:有文件时,直接安装模版async exec() {try {// 1. 准备阶段const ret = await this.prepare();if (ret) {// 2. 下载模板// 3. 安装模板}} catch (e) {log.error(e.message);}}async prepare() {// 1. 判断当前目录是否为空const localPath = process.cwd();if (!this.isDirEmpty(localPath)) {let ifContinue = false;if (!this.force) {// 询问是否继续创建ifContinue = (await inquirer.prompt({type: 'confirm',name: 'ifContinue',default: false,message: '当前文件夹不为空,是否继续创建项目?',})).ifContinue;if (!ifContinue) {return;}}// 是否启动强制更新if (ifContinue || this.force) {// 给用户做二次确认const { confirmDelete } = await inquirer.prompt({type: 'confirm',name: 'confirmDelete',default: false,message: '是否确认清空当前目录下的文件?',});if (confirmDelete) {// 清空当前目录// fse.removeSync()// 不会把当前目录删除fse.emptyDirSync(localPath)}}}}

获取项目基本信息功能开发

项目名称和版本号合法性校验

lerna add semver commands/init/
  async getProjectInfo() {function isValidName(v) {return /^[a-zA-Z]+([-][a-zA-Z][a-zA-Z0-9]*|[_][a-zA-Z][a-zA-Z0-9]*|[a-zA-Z0-9])*$/.test(v);}const TYPE_PROJECT = 'project'const TYPE_COMPONENT = 'component'let projectInfo = {};// 1. 选择创建项目或组件const { type } = await inquirer.prompt({type: 'list',name: 'type',message: '请选择初始化类型',default: TYPE_PROJECT,choices: [{name: '项目',value: TYPE_PROJECT,}, {name: '组件',value: TYPE_COMPONENT,}],});log.verbose('type', type);if (type === TYPE_PROJECT) {const o = await inquirer.prompt([{type: 'input',name: 'projectName',message: `请输入项目名称`,default: '',validate: function(v) {// 根据文档,可对用户输入做提示const done = this.async();setTimeout(function() {// 1.首字符必须为英文字符// 2.尾字符必须为英文或数字,不能为字符// 3.字符仅允许"-_"if (!isValidName(v)) {done(`请输入合法的项目名称`);return;}done(null, true);}, 0);},filter: function(v) {return v;},},{type: 'input',name: 'projectVersion',message: `请输入项目版本号`,default: '1.0.0',validate: function(v) {// 根据文档,可对用户输入做提示const done = this.async();setTimeout(function() {// semver.valid() 可以format版本号,不规范的返回nullif (!(!!semver.valid(v))) {done('请输入合法的版本号');return;}done(null, true);}, 0);},filter: function(v) {if (!!semver.valid(v)) {return semver.valid(v);} else {return v;}},}]);} else if (type === TYPE_COMPONENT) {}}

 


http://www.ppmy.cn/news/62706.html

相关文章

为什么要交叉编译?

一、什么是交叉编译、为什么要交叉编译 1、什么是交叉编译&#xff1f; 交叉编译&#xff1a;是在一个平台上生成另一个平台上的可执行代码。比如我们在 x86 平台上&#xff0c;编写程序并编译成能运行在 ARM 平台的程序&#xff0c;编译得到的程序在 x86 平台上是不能运行的…

Jackson 注解汇总:轻松处理 JSON 序列化与反序列化

Jackson 是 Java 中最流行的 JSON 处理库之一&#xff0c;它提供了许多注解来简化 JSON 的序列化和反序列化过程。这篇文章将介绍一些 Jackson 常用的注解&#xff0c;以帮助您更轻松地处理 JSON 数据。 1. JsonProperty JsonProperty 注解用于自定义 JSON 属性名称&#xff…

python连接oracle并自动发送邮件

文章目录 1 导入所需模块2连接ORACLE3 抽取结果3.1 抽取员工形象3.2 抽取门店形象3.3 抽取明细汇总 4 合并结果5 删除3中的结果6 写入总表6.1 明细汇总总表6.2 大区排名总表6.3 扣款总表 7 自动发送邮件 1 导入所需模块 #用于连接oracle数据库 import cx_Oracle as cx #用操作…

NetSuite .id的用法

我们必须认清一个事实&#xff0c;NetSuite Saved Search是一个被封装化的SQL查询工具。在NetSuite的早期版本中&#xff0c;可以利用Formula字段做很多SQL语句上的灰色应用。但是慢慢的&#xff0c;灰色应用范围被压缩了。目前只剩下一个“.id”的应用了。 今朝我们就谈谈.id…

训练计划安排(练一休一训练分化+倒金字塔训练法)【了解即可,一般人容量不用练一休一,看抖音@孙悟饭桶】

目录 练一休一训练分化每次训练的组数12-15组 &#xff08;4-5个动作&#xff09;QA 倒金字塔训练法倒金字塔热身正式组常见误区&#xff1a; 训练补剂bcaa咖啡因肌酸蛋白粉 如何降低皮质醇水平如何提升睾酮水平文献出处睡眠8h摄入适量脂肪&#xff08;0.8g每公斤体重&#xff…

关于并发编程与线程安全的思考与实践 | 京东云技术团队

作者&#xff1a;京东健康 张娜 一、并发编程的意义与挑战 并发编程的意义是充分的利用处理器的每一个核&#xff0c;以达到最高的处理性能&#xff0c;可以让程序运行的更快。而处理器也为了提高计算速率&#xff0c;作出了一系列优化&#xff0c;比如&#xff1a; 1、硬件…

MySQL优化二索引使用

1、索引分类 类型解释全局索引(FULLTEXT)全局索引&#xff0c;目前只有 MyISAM 引擎支持全局索引&#xff0c;它的出现是为了解决针对文本的模糊查询效率较低的问题&#xff0c;并且只限于 CHAR、VARCHAR 和 TEXT 列哈希索引(HASH)哈希索引是 MySQL 中用到的唯一 key-value 键…

OJ练习第94题——编辑距离

编辑距离 力扣链接&#xff1a;72. 编辑距离 题目描述 给你两个单词 word1 和 word2&#xff0c; 请返回将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作&#xff1a; 插入一个字符 删除一个字符 替换一个字符 示例 示例 1&#xff1a; …