教你用 Node 創建 CLI 工具

2020-12-14 前端學習棧

準備工作

1. 創建工程

mkdir my-clicd my-clinpm init -ynpm i commander download-git-repo ora handlebars figlet clear chalk open watch -S複製代碼2. 創建 bin 目錄

package.json 添加 bin 欄位,將自定義的命令軟連到全局環境,同時執行 npm link 創建連結。"bin": { "wbiao": "./bin//index.js" }複製代碼在根目錄下創建 bin 文件夾,新建 index.js 文件,行首增加一行#!/usr/bin/env node指定當前腳本由 node.js 進行解析。#!/usr/bin/env nodeconsole.log("Hello World!!!");複製代碼命令行執行npm link,相當於把這個包連接到全局。如果 npm link 報錯,windows/mac 嘗試使用管理員身份輸入。

在命令行執行wbiao

2. 搭建命令行界面

識別命令行 - commander

command 後面可跟一個 name,用空格隔開。

alias: 定義一個更短的命令行指令description:描述,他在 help 裡展示action:註冊一個回調函數parse:解析命令行const program = require("commander");program.version(require("../package.json").version);program .command("init <name>") .alias("i") .description("init project") .action((name) => {console.log(`項目名稱為:${name}`); });// 解析主進程的參數program.parse(process.argv);複製代碼輸出歡迎界面 - figlet/clear/chalk

輸入 wbiao init 就會輸出以下歡迎界面,那麼需要什麼工具?

工具:

figlet: 創建字符圖案clear: 清屏chalk: 改變 log 顏色的工具做法:

新建文件夾 lib,新建 init.jsconst { promisify } = require("util");const figlet = promisify(require("figlet")); // 字符畫const clear = require("clear"); // 清屏const chalk = require("chalk"); // 改變輸出log顏色的工具const log = (content) => console.log(chalk.green(content)); // 封裝consolemodule.exports = async (name) => { clear();// 輸出歡迎界面const figlet_data = await figlet("WBIAO"); log(figlet_data);};複製代碼加載進度 - ora

asyncfunctionclone(repo, desc) {const download = promisify(require("download-git-repo")); // 從git下載倉庫const ora = require("ora"); // 命令行顯示加載效果const process = ora(`downing ${repo}....`); process.start();await download(repo, desc); process.succeed();}複製代碼從 git 下載倉庫 - download-git-repo / ora

download-git-repo 有一個 clone 方法,用法如下:

clone(repository, destination, options, callback);複製代碼

在下載倉庫的過程中需要添加加載的過程,可以使用 ora 庫。

const ora = require("ora");const spinner = ora("Loading unicorns").start();setTimeout(() => { spinner.color = "yellow"; spinner.text = "Loading rainbows";}, 1000);複製代碼顯示的效果是:

此時我們封裝一個 download 方法,用作下載倉庫並顯示進度

asyncfunctionclone(repo, desc) {const download = promisify(require("download-git-repo")); // 從git下載倉庫const ora = require("ora"); // 命令行顯示加載效果const process = ora(`downloading ${repo}....`); process.start();await download(repo, desc); process.succeed();}複製代碼在 init 裡引入

module.exports = async (name) => { ...// 2. 下載項目 log("創建項目:" + name);await clone("github:hopkinson/vue-mock-demo", name);};複製代碼選取模板下載倉庫 - inquirer

我們如果有多個模板的情況下需要選擇一個,那就不能寫固定下載地址,而是根據需要選擇模板。那麼可以用 inquirer 庫。

基本用法:

const inquirer = require("inquirer");const promptList = [ { type: "list", name: "type", message: "請選擇拉取的模板類型: ", choices: [ { name: "pc", value: { url: "hopkinson/vue-mock-demo", gitName: "vue-mock-demo", val: "PC端模版", }, }, ], },];inquirer.prompt(promptList).then((answers) => {console.log(answers); // 返回的結果});複製代碼在腳手架裡,在 init 裡引入選擇模板並下載:

var promptList = [ { type: "list", name: "type", message: "請選擇拉取的模板類型: ", choices: [ { name: "pc", value: { url: "hopkinson/vue-mock-demo", gitName: "vue-mock-demo", val: "PC端模版", }, }, { name: "mobile", value: { url: "littleTreeme/vue-web-template.git", gitName: "vue-web-template", val: "PC端模版", }, }, ], },];inquirer.prompt(promptList).then(async (result) => {const { url, gitName, val } = result.type;await clone(`github:${url}`, name); log(`已下載${gitName}(${val})項目,正在安裝依賴...`);});複製代碼3. 安裝依賴 - spawn

封裝 spawn 函數,通過子線程來做我們的安裝依賴;

const spawn = async (...args) => {const { spawn } = require("child_process"); //原生包的子進程returnnewPromise((resolve) => {const proc = spawn(...args); proc.stdout.pipe(process.stdout); //子進程的輸出流與主進程相對接 為了列印子進程的日誌 proc.stderr.pipe(process.stderr); //錯誤流 proc.on("close", () => { resolve(); }); });};複製代碼然後再引入到 init 裡。

注意的是:window10 中,在 spawn 中執行 npm 報錯 [Error: spawn ENOENT]」 errors。解決方法是:加入的判斷process.platform === "win32" ? "npm.cmd" : "npm"

module.exports = async (name) => { ...// 3. 自動安裝依賴//npm:要執行的命令,可以是cnpm...// * []:所有參數放數組中// * cwd: 在哪個目錄下執行命令 spawn(process.platform === "win32" ? "npm.cmd" : "npm", ["install"], { cwd: `./${name}` }); log(` 安裝完成: ============== cd ${name} npm run dev ============== `);};複製代碼4. 自動啟動界面 -open

open: 打開瀏覽器module.exports = async (name) => { ...// 4.打開瀏覽器await spawn( process.platform === "win32" ? "npm.cmd" : "npm", ["run", "dev"], { cwd: `./${name}` } ); open("http://localhost:8080");};複製代碼

相關焦點

  • 用命令行管理你的GitHub項目,不必再開網頁,官方CLI工具1.0版今日...
    用命令行管理你的GitHub項目,不必再開網頁,官方CLI工具1.0版今日上線 2020-09-18 17:09 來源:澎湃新聞·澎湃號·湃客
  • 一張圖教你快速玩轉vue-cli3
    vue.config.js 中的 transpileDependencies 選項// vue.config.jsmodule.exports = {// 默認情況下 babel-loader 會忽略所有 node_modules
  • OpenSIPS新CLI工具OpenSIPS-CLI 使用概覽
    不過,從OpenSIPS-3.0版本開始,OpenSIPs的接口工具開始使用OpenSIPS-CLI來實現,opensipsctl就不再使用。此接口包括了更多的系統功能,使得管理員管理伺服器端時更加方便,也可以快速跟蹤排查問題,比較新的工具例如diagnose和tracer(跟蹤呼叫方被呼叫方,IP)。
  • 用命令行管理你的 GitHub 項目,不必再開網頁,官方 CLI 工具 1.0...
    ,執行超過35萬個合併,創建超過2萬個問題。 GitHub CLI怎麼用 GitHub CLI的命令相當好記,全都以gh開頭,之後跟上alias、api、pr、release、repo等,這些命令可以說是「顧名思義」。
  • 復盤node項目中遇到的13+常見問題和解決方案
    電腦,所以可以用export來定義一個node環境變量.就是在node環境中使用的生成不同平臺不同編譯器的項目文件, 如果你遇到了相同的問題, 我們可以採用如下方案:npm install -g node-gyp或者直接刪除
  • Node.js模塊化你所需要知道的事
    前言我們知道,Node.js是基於CommonJS規範進行模塊化管理的,模塊化是面對複雜的業務場景不可或缺的工具,或許你經常使用它,但卻從沒有系統的了解過,所以今天我們來聊一聊Node.js模塊化你所需要知道的一些事兒,一探Node.js模塊化的面貌。
  • Node.js的5大框架,誰才是Node.js的優秀框架?
    npm install express  另外,可以使用express-generator命令行工具快速創建應用程式框架。 Koa.js默認提供一些用於常規任務的有用策略,例如緩存的新鮮度,內容協商,代理支持。 它支持 async/await 關鍵字,可以幫助你整齊地管理你的代碼。Koa可以隨時清理你的代碼中由於任何回調而造成的混亂。/ 如何安裝Koa.js?
  • 一天1300 Star量,GitHub上新官方命令行工具
    機器之心報導 參與:思 不想用命令行操作 GitHub 的開發者,不是好的開發者。——不是我說的 小編私以為,Git 是世界上最好的代碼版本控制工具,木有之一。
  • 命令行工具開發:如何快速實現命令行提示?
    畢竟命令行工具提示非常重要。相信Node.js的開發者也不希望還要學習一下Rust和clap-rs,這樣就太不高效了。因此我又編寫了一個工具cli-completion[3], 其主要目的根據上面說的YAML文件幫你自動生成各種shell的命令行提示腳本。
  • zyplayer-doc 1.0.7 發布,簡單好用的 WIKI 文檔工具、資料庫管理...
    zyplayer-doc是一款定位為公司內部和個人使用的在線工具,現有資料庫文檔、WIKI文檔、swagger 文檔、dubbo文檔、ElasticSearch文檔等,管理端具有人員管理、權限管理功能等功能
  • GitHub 開源官方命令行工具登頂 TOP1,5 分鐘極速上手!
    我不得不承認,這個工具已經兌現了承諾。然而,最近 GitHub 一直為發布官方工具和產品做努力,而且他們的進展良好,這還要多虧了微軟收購帶來的巨額資金和方向調整。之前,GitHub 發布了一個帶有 GUI 的桌面應用程式,而且正式的命令行工具也提上了日程。如今,官方版的 GitHub CLI 終於問世了。
  • gf-cli v0.7.4 發布,GoFrame 開發工具鏈
    大家好啊,GoFrame框架隆重推出了開發工具鏈項目,該工具鏈通過CLI命令行工具提供,工具開源項目地址:
  • 如何創建以EJS為模板引擎的Node.js項目
    工具WebStormnpmNode.js技術expressejsJavaScript在創建Node.js項目時,可以使用不同的JavaScript模板引擎,如Pug、EJS等。下面利用實例說明:操作步驟:1、打開WebStorm工具,點擊File--->New--->Project,輸入項目名稱,然後選擇EJS模板引擎
  • 如何創建vue項目並使用element框架中的el-select
    1、在電腦硬碟上,找到一個位置,新建一個文件夾wmn;滑鼠右鍵選擇Git Bash Here,並在Git窗口輸入cnpm install --global vue-cli命令:cnpm install --global vue-cli
  • 基於Node.js 的爬蟲丨前端開發者
    前端開發者丨Node.js基於nodejs 的爬蟲 API接口項目,包括前端開發日報、知乎日報、前端top框架排行、妹紙福利、搞笑視頻、各類視頻新聞資訊 熱點詳情接口數據 https://ecitlm.github.io/Node-SpliderApi/#/原文地址:https://gitee.com/ecitlm/splider
  • 使用vue-cli3創建的項目如何引入less全局變量
    前言:本demo是基於腳手架3創建的vue項目,主要演示的是如何使用vw實現移動端適配;並且在項目中如何引入自定義的less全局變量。一..postcssrc.js 文件腳手架3創建的項目沒有自動生成.postcssrc.js文件,所以需要自己在項目根目錄下創建該文件:在該文件加入這些內容:提示:做完上邊的操作後,當你啟動項目時,會發現還會報錯,報什麼xxx '
  • 如何利用機器學習和Gatsby.js創建假新聞網站
    基本上,Gatsby.js將幫你創建一個有完整的骨架的網站,你可以調整和重新配置,而不是從頭開始構建整個東西。當你設置一個Gatsby網站時,你會得到一堆文件。所有這些資產幫助您創建更好的網絡體驗與更少的麻煩。讓我們逐個介紹。gatsby-browser.js此文件用於實現Gatsby瀏覽器api。對於這個項目,我們不需要在這個文件中放入任何東西。