CLI介绍
命令行界面(英语:command-line interface,缩写:CLI),是在图形用户界面得到普及之前使用最为广泛的用户界面,它通常不支持鼠标,用户通过键盘输入指令,计算机接收到指令后,予以执行。
目前前端开发中,CLI是常用的工具。前端三大框架Vue、React、Angular都有对应的CLI,包括现在最流行的前端工程化的打包工具Webpack,也有对应的webpack-cli。
在现代的前端开发中,CLI提高了开发的效率。让相应的前端开发者免去了大量的重复性操作,节省了大量的时间。CLI可以完成的功能,包括但不限于初始化生成对应的项目模板、执行特定的脚本文件、在项目中创建新的模块 。下面来介绍一下前端工程师如何使用node.js来完成一个CLI。
创建项目
打开终端,创建moka-cli的目录
mkdir moka-cli
进入目录,初始化项目
cd moka-cli npm init -y
根目录下新建bin目录,并新建index.js文件,此时目录结构如下
|-- moka-cli |-- package.json |-- bin |-- index.js
开发cli需要借助commander、inquirer、chalk三个库
npm install commander inquirer chalk --save
修改package.json文件,使用es moudle,并新增moka命令
package.json { "name": "moka-cli", "version": "1.0.0", "description": "", "main": "index.js", + "type": "module", + "bin": { + "moka": "./bin/index.js" + }, "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "", "license": "ISC", "dependencies": { "chalk": "^4.1.0", "commander": "^6.2.1", "inquirer": "^7.3.3" } }
接下来需要在/bin/index.js中编程,在第一行添加如下代码,这行代码是告诉系统要用node来执行这个文件。
#!/usr/bin/env node
再添加下面代码
#!/usr/bin/env node console.log('moka-cli run!')
然后在项目根目录下全局安装项目
npm install -g
到这里,一个简单的CLI就完成了,可以打开终端,在任意目录下输入moka,控制台就会打印出对应的消息。
$ moka moka-cli run!
第三方库介绍
moka-cli希望实现可以创建前端开发模板的功能,可以使用moka命令来创建一个vue或react项目。
先来介绍一下使用到到第三方的库
commander
文档地址
用来实现命令的库,在moka-cli中会用来实现create命令,实现用下面的命令行来创建一个vue-demo的项目
moka create vue vue-demo
inquirer
文档地址
实现用户和终端交互的库,在moka-cli中使用create指令的时候会询问是否覆盖已有项目
$ moka create vue moka-demo "_blank" href="https://github.com/chalk/chalk#usage" rel="external nofollow" >文档地址可以在终端界面显示出多种颜色的文本和背景
核心功能
在根目录创建actions和templates目录,目录结构如下
|-- moka-cli |-- package-lock.json |-- package.json + |-- actions + | |-- create.js |-- bin | |-- index.js + |-- templates + |-- react + | |-- app.js + | |-- index.js + | |-- src + | |-- index.js + |-- vue + |-- app.js + |-- index.js + |-- src + |-- index.jstemplats下面用来存放通过CLI要生成的项目的模板,在这里先随便创建几个文件展示一下。
修改/bin/index.js文件
#!/usr/bin/env node import create from '../actions/create.js'; import commander from 'commander'; const { program } = commander; program.version('0.0.1'); program .command('create <template> [name]') .description('新建项目') .action(create); program.parse(process.argv);修改./actions/create.js文件
import fs from 'fs'; import path from 'path'; import chalk from 'chalk'; import inquirer from 'inquirer'; import { fileURLToPath } from 'url'; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); const TEMPLATES = ['vue', 'react']; const targetPath = process.cwd(); function createTemplate(template, name) { const templatePath = path.join(__dirname, '../', `templates/${template}`); function readAndCopyFile(parentPath, tempPath) { let files = fs.readdirSync(parentPath); files.forEach((file) => { let curPath = `${parentPath}/${file}`; let stat = fs.statSync(curPath); let filePath = `${targetPath}/${tempPath}/${file}`; if (stat.isDirectory()) { fs.mkdirSync(filePath); readAndCopyFile(`${parentPath}/${file}`, `${tempPath}/${file}`); } else { const contents = fs.readFileSync(curPath, 'utf8'); fs.writeFileSync(filePath, contents, 'utf8'); } }); } readAndCopyFile(templatePath, name); } function deleteTemplate(path) { if (fs.existsSync(path)) { fs.readdirSync(path).forEach(function (file, index) { var curPath = path + '/' + file; if (fs.lstatSync(curPath).isDirectory()) { // recurse deleteTemplate(curPath); } else { // delete file fs.unlinkSync(curPath); } }); fs.rmdirSync(path); } } export default function create(template, name) { if (!TEMPLATES.includes(template)) { console.log(chalk.red(`No ${template} Template`)); return; } const projectPath = path.resolve(targetPath, name); if (fs.existsSync(projectPath)) { inquirer .prompt([ { name: 'template-overwrite', type: 'confirm', message: `Template named ${name} is already existed, are you sure to overwrite"htmlcode">npm install -g随便找一个路径,运行moka create <template> [name]命令来生成项目
moka create react react-demo效果如下,会在该目录下生成一个react-demo的文件夹,里面存放的就是moka-cli项目中/templates/react下的所有
$ moka create react react-demo react template has been created successfully!如果在该目录下继续创建一个同名的项目,就会提示是否覆盖,输入y后继续执行
$ moka create react react-demo ? Template named react-demo is already existed, are you sure to overwrite? Yes Template already existed , removing! react template has been created successfully!create命令的核心逻辑是通过node的fs模块来复制/templates下的文件,然后将其放到指定的路径下,具体实现直接看代码就可以来。
总结
CLI是提示前端开发效率的重要工具,如果有长期维护的项目,开发一个CLI来完成一些重复性的工作,是一个不错的选择。
moka-cli还没有上传github,等过段时间完善一些/templates下的项目模板,我会在文章里补充项目地址。
nodejs开发cli
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]