摘要:以下閱讀將花費分鐘前言日常開發中,我們都只專注在業務上的開發,拿起一套開箱即用的模板項目就直接開搞了,不知道大家有沒有思考過,平時我們使用的腳手架里面到底做了什么,并且如果是自己來搭一套腳手架,應該怎么去搭呢在本博客中,將記錄作者搭建腳手架
(以下閱讀將花費10分鐘)
前言日常開發中,我們都只專注在業務上的開發,拿起一套開箱即用的模板項目就直接開搞了,不知道大家有沒有思考過,平時我們使用的腳手架里面到底做了什么,并且如果是自己來搭一套腳手架,應該怎么去搭呢?
在本博客中,將記錄作者搭建腳手架的過程,整體將分為兩個部分,第一部分是cli的搭建,第二部分是模板項目的搭建;
cli的搭建在搭建腳手架cli之前,我們首先思考一下,一個cli,需要什么能力呢?答案是初始化能力,那么初始化的功能需要怎樣去實現呢,這里,我們先梳理一下思路。
思路我們在使用其他cli時,會發現,它們有問詢的功能,比如詢問項目名稱,項目描述等;然后還可以選擇模板項目將要使用什么css預處理器等的問題;所以,cli首先就要具備問詢功能,用以獲取定制化信息;
問詢結束后,我們的cli會獲得即將創建的項目的基本信息,接下來我們就需要以一個模板項目作為模板去創建,模板項目將會在第二部分講解,這里一筆帶過~;OK,既然有了模板項目,cli就需要下載這個項目,然后復制這個項目,同時將前面問詢所得的定制化信息寫入項目配置中,所以cli還需要有下載和復制,寫入模板功能;
到此,一個模板項目基本已經創建成功了,那后面我們還希望腳手架可以幫忙進行git初始化以及安裝依賴的功能,所以最終,還需要添加git初始化和安裝依賴的功能;
總結一下,實現一個cli的初始化功能我們需要有如下能力:
問詢 ==> 下載模板 ==> 復制,寫入模板 ==> git初始化 ==> 安裝依賴
好了,為了實現上述思路,cli將會引入如下依賴去實現對應的功能:
const program = require("commander"); // commander負責讀取命令 const inquirer = require("inquirer"); // inquirer負責問詢 const download = require("download-git-repo"); // download-git-repo負責下載對應模板項目的git倉庫 const fse = require("fs-extra"); // fs-extra負責文件的復制 const memFs = require("mem-fs"); const editor = require("mem-fs-editor"); // mem-fs-editor負責模板的復制以及嵌入模板字符串,它需要依賴mem-fs const { exec } = require("child_process"); // child_process負責執行命令行
當然除了上述必須的依賴外,為了更好的交互體驗,還引入了如下依賴:
const chalk = require("chalk"); // 改變命令行輸出樣式 const ora = require("ora"); // 一個優雅地命令行交互spinner
至此,準備的工作已經完畢,下面,就開始一步步來編寫cli了
cli的編寫萬事開頭難,有了思路后,實現思路才是真正的開始,下面將介紹如何組織cli項目
項目組織首先看一下,工程的組織
├── bin | ├── begin | ├── begin-init ├── src | ├── constants.js | ├── project.js | └── utils.js ├── .gitignore ├── .npmrc ├── README.md └── package.json第一步,解析命令
在bin/begin中引入commander,并且聲明init命令,commander會在同級目錄中尋找begin-init文件
const program = require("commander"); program .usage("第二步,問詢[options]") .command("init [name]", "init a project") .parse(process.argv);
有了第一步的解析后,我們可以在begin-init文件中編寫創建邏輯,這里,我們再抽象project文件到src目錄底下,以便更好地分離職責,bin文件只負責解析命令就好啦~
下面就看看project文件中,如何實現問詢
inquirer.prompt([{ type: "input", name: "projectName", message: "請輸入項目名:", validate(input) { if (!input) { return "項目名不能為空"; } if (fse.existsSync(input)) { return "當前目錄已存在同名項目,請更換項目名"; } return true; } }]);
inquirer提供prompt函數來實現問詢,其參數為數組,問詢順序將按照數組的順序來進行;
第三步,下載倉庫在問詢結束后,我們基本知道需要創建的項目的名稱、描述等信息了,下一步,就是下載倉庫了,下面我們來看看核心代碼:
const downloadPath = path.join(projectPath, "__download__"); download(TEMPLATE_GIT_REPO, downloadPath, { clone: true }, (err) => { // 拷貝 // 此處省略若干代碼 // 拷貝完成后刪除臨時文件 fse.remove(downloadPath); }
這里需要注意的是,模板工程所在的倉庫,即TEMPLATE_GIT_REPO,最好是public的
第四步,復制文件,將信息寫入模板下載倉庫只是把模板工程存放在一個臨時文件夾內,真正的工程文件需要等信息寫入模板后再生成;
這里需要注意的是,模板寫入時遵循ejs規范
const memFs = require("mem-fs"); const editor = require("mem-fs-editor"); // 這里需要mem-fs進行內存優化 const store = memFs.create(); this.memFsEditor = editor.create(store); // 這里source表示源文件,dest表示目標文件,data表示需要寫入的數據 this.memFsEditor.copyTpl( source, dest, data );
在調用copyTpl時,data字段中的key-value將被寫入到模板中,舉個栗子:
// 模板文件中,字段是這樣的 { name: "<%= projectName %>" } // data就要這樣去寫 { projectName: "this is your project name" }第五步,進行git init和npm install
這兩步的核心都是使用nodejs提供的child_process中exec方法去執行命令來實現,exec能幫助我們在命令行中執行shell命令,exec函數有對應的回調方法來讓我們判斷命令執行是否成功,核心代碼如下:
exec("npm install", (error, stdout, stderr) => { if (error) { // 出錯了 } else { // 成功了 } })
是不是很簡單呢,想了解更多的操作可以搜索官方文檔查看哈,這里就不詳解了。
調試和發布到這里,我們的cli已經實現的差不多了,這里我們總結一下如何測試和發布吧
npm link // 本地調試 npm publish // 發布
通過npm link命令,即可以在命令行工具測試你的cli了,注意在package.json的bin字段中定義好入口命令和文件
// package.json { "bin": { "begin": "bin/begin" } }小結
OK,文章主要總結了編寫一個腳手架中init功能的思路以及一些實現的方法,具體一些細節仍有優化的空間,歡迎大家討論!
文章的具體代碼可以參考我的倉庫begin-cli
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/105170.html
摘要:各個大廠也相繼宣布開源。但是也會存在一些問題,比如每個公司可能需要的業務組件不盡相同,或者我們想自己開發一套屬于自己的組件庫,來增強對組件的可控性。 前言: 前端組件化是當今熱議的話題之一,也是我們在開發單頁應用經常會碰到的一個問題,現在我們有了功能非常完善的Element-UI。各個大廠也相繼宣布開源XXX-UI。但是也會存在一些問題,比如每個公司可能需要的業務組件不盡相同,或者我們...
摘要:各個大廠也相繼宣布開源。但是也會存在一些問題,比如每個公司可能需要的業務組件不盡相同,或者我們想自己開發一套屬于自己的組件庫,來增強對組件的可控性。 前言: 前端組件化是當今熱議的話題之一,也是我們在開發單頁應用經常會碰到的一個問題,現在我們有了功能非常完善的Element-UI。各個大廠也相繼宣布開源XXX-UI。但是也會存在一些問題,比如每個公司可能需要的業務組件不盡相同,或者我們...
摘要:后來經過排查你會發現是由于目前還沒有版本。可以使用該方式解決。這就是我為什么不推薦你使用創建腳手架的原因此文的受眾是想要進階中級的初級前端人員。 最近在知乎看到一個問題,原問題如下: 很奇怪,為什么現在能找到自己手動創建vue腳手架的文章非常少,而且大家似乎對webpack4的熱情并不高,對于想基于vue2.0+webpack4搭建一個腳手架的我來說資料真是少得可憐。難道現在一般的做...
摘要:可以使用或來安裝我用來重新嘗試一次對速度表示不理想的可以嘗試淘寶的不要過度依賴中可以寫成放哪都行,可以寫成可以寫成看到這個畫面,安裝完成了。 初步搭建腳手架 Tips 任何不錯的開源項目都有 project-cli 腳手架、我們用它生成往往能快速配制出最佳的、理想的腳手架 我通常使用 cli 生成項目骨架再在之基礎上進行個人修改。 什么是 CLI 命令行界面(英語:command-li...
閱讀 1814·2021-10-09 09:44
閱讀 2690·2021-09-22 15:38
閱讀 2451·2021-09-09 09:33
閱讀 686·2021-09-07 09:58
閱讀 1785·2021-09-02 15:41
閱讀 2485·2019-08-30 15:55
閱讀 1796·2019-08-30 15:55
閱讀 533·2019-08-30 15:44