前端開發過程中常見的CLI有:
create-react-app
vue-cli
webpack-cli
prettier-cli
基本復雜一點的工具都在集成CLI,為啥都要搞成CLI呢?
因為CLI可以提供更強大的功能:
通過命令搭配實現不同的功能
管理項目模版
啟動本地服務
生成模版文件
對代碼進行格式化
我們先搭建一個最簡單的CLI來體驗下,然后逐步實現復雜點的功能。
首先新建項目作為CLI源代碼地址
mkdir cli-demo cd cli-demo npm init 復制代碼
yargs文檔配置:該插件將用戶通過終端輸入的參數解析成對象,可以配置各種參數。
yarn add yargs 復制代碼
命令使用語法:
.command(cmd, desc, [builder], [handler]) 復制代碼
下面的配置說明:
配置命令get
聲明信息make a get HTTP request
并配置了參數url
信息
最后callback函數獲取用戶執行的參數
具體使用:編輯index.js
,第一行一定要加注釋,表明運行在node環境下
#!/usr/bin/env node const yargs = require('yargs/yargs') const { hideBin } = require('yargs/helpers') yargs(hideBin(process.argv)) .command( 'get', 'make a get HTTP request', function (yargs) { return yargs.options({ url: { alias: 'u', describe: 'the URL to make an HTTP request to' } }) }, function (argv) { console.log("callback", argv.url) } ) .help() .argv 復制代碼
執行命令,可以獲取輸入的參數
這里get就是定義的指令,url是指令下的key值,用--url輸入,alias就是別名,用-u表示,后面跟要輸入的參數。
接著我們發布下npm,然后一個CLI就完成了。
登陸npm倉庫,沒有的話去注冊一個,地址
npm login 復制代碼
選擇一個中意的cli名字,查一下是否存在,這里我們起個名字cli-demo3
執行npm version patch && npm publish --registry=https://registry.npmjs.org
,不出意外的話,就發布成功了。
然后我們本地使用下,首先下載到本地,全局下載npm install -g cli-demo3
cli-demo3是我們前期測試使用寫的CLI,后面繼續使用我正常部署的CLI:u-amin-cli,原理是一樣的
# 這里使用4版本,升級到5版本不再支持require方式導入 yarn add log-symbols@4.1.0 復制代碼
使用方法
使用效果
# 這里使用4版本,升級到5版本不再支持require方式導入 yarn add chalk@4.1.2 復制代碼
1、支持傳入string,array和模版字符串
使用方法
console.log(chalk.blue("this is blue")) console.log(chalk.blue('Hello', 'World!', 'Foo', 'bar', 'biz', 'baz')); console.log(` CPU: ${chalk.red('90%')} RAM: ${chalk.green('40%')} DISK: ${chalk.yellow('70%')} `); 復制代碼
使用效果
2、支持修改背景色、各種顏色格式、指定不同文本的顏色
使用方法
console.log(chalk.blue.bgRed.bold('Hello world!')); console.log(chalk.red('Hello', chalk.underline.yellowBright('world') + '!')); console.log(chalk.hex('#DEADED').underline('Hello, world!')) console.log(chalk.rgb(15, 100, 204).inverse('Hello!')) 復制代碼
使用效果
3、支持自行封裝一些顏色
使用方法
const error = chalk.bold.red; const warning = chalk.hex('#FFA500'); // Orange color console.log(error('Error!')); console.log(warning('Warning!')); 復制代碼
使用效果
# 這里使用5版本,升級到6版本不再支持require方式導入 yarn add ora@5.4.1 復制代碼
使用方法
const ora = require('ora'); const spinner = ora('Loading unicorns').start(); setTimeout(() => { spinner.color = 'yellow'; spinner.text = 'Loading rainbows'; }, 1000); 復制代碼
使用效果
使用方法
var inquirer = require('inquirer'); inquirer .prompt([ { name: "templateType", type: "list", default: "vue", choices: [ { name: "React", value: "react", }, ], message: "Select the template type.", } ]) .then((answers) => { // Use user feedback for... whatever!! }) .catch((error) => { if (error.isTtyError) { // Prompt couldn't be rendered in the current environment } else { // Something else went wrong } }); 復制代碼
使用效果
這樣就可以給客戶提示選擇來處理邏輯。
使用方法
const download = require("download-git-repo"); download('direct:https://gitlab.com/flippidippi/download-git-repo-fixture.git#my-branch', 'test/tmp', { clone: true }, function (err) { console.log(err ? 'Error' : 'Success') }) 復制代碼
還有很多類似的插件,來豐富cli的功能,根據需要添加即可
open 打開瀏覽器
yargs/commander 執行cli命令
get-port 獲取當前端口號
啟動文件index.js
const yargs = require('yargs/yargs') const { hideBin } = require('yargs/helpers') const config = require('./config') const yargsCommand = yargs(hideBin(process.argv)) config.forEach(commandConfig => { const { command, descriptions, options, callback } = commandConfig yargsCommand.command( command, descriptions, yargs => yargs.options(options), (argv, ...rest) => { callback(argv, ...rest); } ) }) yargsCommand.help().argv 復制代碼
指令文件config.js
const commandOptions = [ { command: "create", descriptions: "拉取一個項目模版", options: { name: { alias: "n", type: "string", require: true, describe: "項目名稱", }, }, callback: async (argv) => { create({name: argv.name}) } }] 復制代碼
提取配置,就很清晰了
前端工程化:Prettier+ESLint+lint-staged+commitlint+Hooks+CI 自動化配置處理
上一步我們對配置進行了提取,接著根據配置生成使用文檔,如下
使用方法
yarn add json2md@1.12.0 -D 復制代碼
const json2md = require("json2md") // 按json2md需要的數據格式組合 const data = json2md([ { h1: "JSON To Markdown" } , { blockquote: "A JSON to Markdown converter." } ])) // 寫入Readme.md文檔 fs.writeFile(path.join(__dirname, "../Readme.md"), json2md(data), (err) => { if (err) throw err; console.log("update docs success"); }); 復制代碼
{ command: "create", descriptions: "拉取一個項目模版", options: { name: { alias: "n", type: "string", require: true, describe: "項目名稱", }, }, callback: async (argv) => { create({name: argv.name}) } } 復制代碼
const map = { vue: "https://github.com/luchx/ECHI_VUE_CLI3.0.git", react: "git@github.com:richLpf/antd-template-demo.git#main" } 復制代碼
1、inquirer提示用戶選擇對應的模版,具體可以看前面用法
2、通過download下載模版文件
module.exports = function downloadFromRemote(url, name) { return new Promise((resolve, reject) => { download(`direct:${url}`, name, { clone: true }, function (err) { if (err) { reject(err); return; } resolve(); }); }); }; 復制代碼
3、通過ora在下載過程中展示loading
這是主要的下載邏輯,關于日志,我們可以更好的展示,也可以配置更復雜的命令:替換下載的項目名稱,刪除.git目錄,修改package.json配置
前端在開發的過程中,總會遇到后端接口無法按時提供的情況,這種情況下有很多解決方案,常見的通過客戶端生成模擬api,在項目中引入Mock。
這里我們通過CLI來實現一個更加簡單好用的模擬方案
通過CLI啟動一個或多個服務器,通過Express做路由轉發本地的JSON文件
首先我們配置mock命令,設定參數type
、port
、create
分別代表API類型、啟動Http服務器端口號,默認9000,create
是否自動生成接口數據JSON文件。
{ command: "mock", descriptions: "啟動一個本地服務,模擬返回接口數據", options: { type: { alias: "t", type: "string", default: "action", describe: "選擇API類型", choices: ['action', 'restful'] }, port: { alias: "P", type: "number", default: 9000, describe: "選擇啟動的端口號", }, create: { alias: "c", type: "boolean", default: false, describe: "如果mock目錄不存在是否自動創建,默認不自動創建" }, }, callback: async (argv) => { mock({ ...argv }) } 復制代碼
const app = express() app.use(bodyParser.json({limit: '50mb'})) app.use(express.urlencoded({ extended: true })); app.all('*', (req, res, next) => { res.header('Access-Control-Allow-Origin', '*'); //訪問控制允許來源:所有 res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept'); //訪問控制允許報頭 X-Requested-With: xhr請求 res.header('Access-Control-Allow-Metheds', 'PUT, POST, GET, DELETE, OPTIONS'); //訪問控制允許方法 res.header('X-Powered-By', 'nodejs'); //自定義頭信息,表示服務端用nodejs res.header('Content-Type', 'application/json;charset=utf-8'); next(); }); const filePath = path.join(process.cwd(), `./mock/`) app.listen(port, () => console.log(`Mock api listening on port ${port}!`)); 復制代碼
比如請求url為:
http://localhost:9000/acl 復制代碼
請求體為:
{ Action: "GetUsers" } 復制代碼
此時在CLI執行的目錄,新建mock/acl/GetUsers.json
GetUsers.json內容為返回的json數據
{ "RetCode": 0, "Message": "this is error", "Data": [] } 復制代碼
然后通過fs
模塊讀取json文件的數據,直接返回模擬的數據,因為是實時讀取的,所以更新json數據不需要重啟服務。主要邏輯如下
app.post('*', async(req, res) => { const key = req.params[0].substring(1) const { Action } = req.body const file = `${filePath}${key}/${Action}.json`; fs.readFile(file, 'utf-8', function(err, data) { if (err) { res.send(NotFoundResponse); } else { res.send(data); } }) }) 復制代碼
比如請求url為:
http://localhost:9000/acl/users 復制代碼
post請求體為:
{ limit: 10 } 復制代碼
此時在CLI執行的目錄,新建mock/acl/users/post.json
post.json內容為返回的json數據
{ "RetCode": 0, "Message": "get users", "Data": [] } 復制代碼
如果是get請求,只需要添加get.json
就可以了。
然后同樣通過fs
讀取對應的json數據
app.all("*", async(req, res) => { const key = req.params[0] const method = req.method const file =`${filePath}${key}/${method}.json` console.log("file", file) fs.readFile(file, 'utf-8', function(err, data) { if (err) { res.send(NotFoundResponse); } else { res.send(data); } }) }) 復制代碼
這樣就完成了CLI啟動一個模擬的http服務,用起來很方便,并且可以支持直接在項目中使用。
具體可以試試看u-admin-cli
對于大部分mock來說,復雜的配置是不需要的,這里僅僅是用了固定的json數據,我覺得就夠用了,當然還可以自行處理數據,引入Mock規則,自行定義生成數據類型等
以上就是搭建一個CLI的過程,我們從最簡單的開始構建了一個基礎CLI,在這個基礎上進行了交互優化,然后實際開發了CLI的兩個功能:
1、通過CLI管理部門內的模版項目
2、通過CLI啟動Http服務器,模擬接口生成
CLI地址:www.npmjs.com/package/u-a…
碼字不易,歡迎點贊????,有問題請留言。
作者:前端中后臺
鏈接:https://juejin.cn/post/7090001607596703758
來源:稀土掘金
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/127965.html
摘要:以下閱讀將花費分鐘前言日常開發中,我們都只專注在業務上的開發,拿起一套開箱即用的模板項目就直接開搞了,不知道大家有沒有思考過,平時我們使用的腳手架里面到底做了什么,并且如果是自己來搭一套腳手架,應該怎么去搭呢在本博客中,將記錄作者搭建腳手架 (以下閱讀將花費10分鐘) 前言 日常開發中,我們都只專注在業務上的開發,拿起一套開箱即用的模板項目就直接開搞了,不知道大家有沒有思考過,平時我們...
摘要:后來經過排查你會發現是由于目前還沒有版本。可以使用該方式解決。這就是我為什么不推薦你使用創建腳手架的原因此文的受眾是想要進階中級的初級前端人員。 最近在知乎看到一個問題,原問題如下: 很奇怪,為什么現在能找到自己手動創建vue腳手架的文章非常少,而且大家似乎對webpack4的熱情并不高,對于想基于vue2.0+webpack4搭建一個腳手架的我來說資料真是少得可憐。難道現在一般的做...
摘要:如何在下搭建多模塊單模塊多路由骨架屏前言骨架屏的用戶感知比更好,此前看過很多專欄以及文章,此次實踐中還是遇到需要學習的部分。包括因為可能信息面不全,對插件源碼進行了詳細解讀,希望對于將要在項目中搭建骨架屏的小伙伴們有所幫助。 如何在webpack+vue+vue-cli下搭建多模塊/單模塊多路由骨架屏 前言 骨架屏的用戶感知比loading更好,此前看過很多專欄以及文章,此次實踐中還是...
摘要:如何在下搭建多模塊單模塊多路由骨架屏前言骨架屏的用戶感知比更好,此前看過很多專欄以及文章,此次實踐中還是遇到需要學習的部分。包括因為可能信息面不全,對插件源碼進行了詳細解讀,希望對于將要在項目中搭建骨架屏的小伙伴們有所幫助。 如何在webpack+vue+vue-cli下搭建多模塊/單模塊多路由骨架屏 前言 骨架屏的用戶感知比loading更好,此前看過很多專欄以及文章,此次實踐中還是...
摘要:之所以寫這篇如何運用腳手架自動化構建出一個項目的大架構,主要是面向想入門的小伙伴。之前,我第一次接觸,一直摸不著頭腦,想在網上搜個接地氣的教程都找不到。 WHY 之所以寫這篇如何運用腳手架自動化構建出一個項目的大架構,主要是面向想入門vue的小伙伴。之前,我第一次接觸vue,一直摸不著頭腦,想在網上搜個接地氣的教程都找不到。SO,我以如何搭建結構為開始,向想入門vue的童鞋們把我僅有的...
閱讀 289·2024-11-07 18:25
閱讀 130366·2024-02-01 10:43
閱讀 868·2024-01-31 14:58
閱讀 828·2024-01-31 14:54
閱讀 82766·2024-01-29 17:11
閱讀 3048·2024-01-25 14:55
閱讀 1985·2023-06-02 13:36
閱讀 3033·2023-05-23 10:26