摘要:前言這是一篇關于如何使用構建高性能高可讀性的現代化命令行工具的博客。對于命令行工具來說,運行時的權限是巨大的,但不要因此弄臟用戶的系統。
前言
這是一篇關于如何使用 NodeJS 構建高性能、高可讀性的現代化命令行工具的博客。
每當我們想要創建一個基于 NodeJS 的命令行工具時,就會衍生出一堆問題需要解決,比如如何準備開發環境,如何打包轉譯代碼,如何使代碼在轉譯后保持可調用的狀態同時盡可能的壓縮體積,
以及怎樣設計項目分配 Command 與 Option 等等,這會浪費巨大的時間,而且并非一定有成果。這時你可以注意到社區幾乎所有的命令行工具都是自成一派,
并沒有嚴謹的框架或約定約束,也無所謂的最佳實踐,這使想要特別是第一次想要開發命令行工具的開發者望而卻步,或是幾番努力最后卻不盡如人意。
舉個例子來說,騰訊的 omi 是一個有眾多使用者的框架,但其命令行工具 omi / omi-cli 卻讓人貽笑大方。僅一些簡單的下載和創建模板的任務,造出長篇大論的文件不說,下載
時依賴數千,包的體積巨大,整體項目毫無設計幾乎是隨心所欲、天馬行空,這就是開發者本身并不擅長此道,只學會了 糊屎。(何謂 糊屎,參閱 JS 優雅指南 2)
FUNC 的出現就是為了解決這些問題。func 本身的實現參閱了社區內諸多基于 NodeJS 的命令行工具的優秀實現,與流行的框架設計思路相結合,以優雅的設計、小體積、高性能 等為目標,
同時關注開發者體驗,大幅度的提升了命令行工具項目的可擴展性與可讀性,幾乎是如今 NodeJS 社區中開發命令行工具的最優解。我們可以嘗試使用 func 構建一個命令行工具。
在以前流行的一些命令行參數解析的庫中,我們在構建項目前需要準備大量的腳本與配置,甚至還要解決文件權限、bin、代碼轉譯等等問題,但使用 func,我們可以僅通過一行命令
初始化項目:
npm init func
項目初始化后進入文件夾,隨機使用 npm install 或 yarn 安裝依賴,現在就可以正式開發了。
可以注意到,func 的項目模板中為我們準備了 start 與 build 2 個腳本,它們都是由 func-service 驅動的,幫助你一鍵切換開發與生產模式,我們所要做的就是專注于
命令行邏輯本身,實現邏輯就夠了。
我們可以隨意的創建一個類,當它被加上 Command 注解時這就是一個命令,而被加上 Option 注解時就會轉變為一個選項:
import { Command } from "func" @Command({ name: "test" }) export class Test { }
在命令行中運行
不同,當你覺得差不多的時候,運行 npm build 就可以將它打包,一切就是這么簡單。
有時候,當我們需要使用到命令行攜帶的參數時,比如處理
@Command({ name: "test" }) export class Test { constructor( private args: CommandArgsProvider, ) { } }
CommandArgsProvider 實際上是一個 class 類型,當你標記一個參數為此類型時,func 會在運行時為你注入所有的命令參數,
同樣的也支持 OptionArgsProvider 、RegisterProvider 等等,你可以在 官方的文檔 閱讀它們的具體類型。
運行 npm build 可以得到一個打包后的文件,這是由 ncc 編譯后的文件,通常它只有一個 (如果攜帶 extra 可能會有多個,但它們會自動鏈接),
同時為你鏈接好了 bin,你要做的唯一一件事就是將包發布出去。為什么 func 使用這種方式發布呢?
我們知道當你在安裝一個包或是使用 npx 執行包時 (這在使用命令行工具的人群中很常見),NPM 所花費的時間大約在 3 個部分,即對比包的依賴,下載包,執行。
首先我們知道 func 的項目足夠的小,能夠大量介紹下載時間,同時也有足夠好的性能,現在要解決的就是在大量依賴時的對比分析問題,將文件打包成單文件不依賴
外部環境時會極大的減少所需時間,如果你再將所有的依賴移入 devDependencies 中,幾乎能夠在一瞬間完成 分析 - 下載 - 運行 這三個步驟。這樣的體驗是難以想象的。
是的,這里推薦你把所有的依賴當做開發依賴處理,這似乎違背了 NPM Package 的開發哲學,但在使用 func 構建命令行應用時這樣做卻大有裨益。
在運行 func build 完成的包時,我們注意到幾乎無需任何依賴,這是因為在單個文件中已經 bundle 了所有的所需資源,也就意味著用戶在運行 .js 文件時,
堆棧中真的就只有 .js 文件內的內容,不會引用其他,不會加載任何無關緊要的東西。此時我們也就無需用戶關心 dependencies,甚至可以移除它們,這樣一來,
下載或即時運行時就直接跳過了 對比依賴版本 這一步,這其中省略了無數的請求也就會會極大的增加速度,npm init func 能夠在 1 秒左右立刻開始安裝也是這樣的道理。
現在你已經知道了怎樣快速的構建一個合格且優雅的命令行工具,那怎樣做的更好呢?通常來說你需要遵循這幾點:
不因為小功能引入巨大的包,不引入依賴爆炸的包。
舉例來說,download-git-repo 是一個很不錯的包,它能夠為你節約很多時間,但請注意它依賴了 download,如果你僅為了下載單個文件或只有很少的下載需求時,
這就顯得有些大材小用,download 會為你增加約 450 kb 的重量,卻只做了一件你 5 分鐘可以搞定的事情。同樣你的用戶也會為此付出巨大的時間代價。
不要顯示錯誤堆棧信息。
在多數情況下我們都需要盡可能的顯示堆棧或是引用的錯誤信息便于 debug,但是在命令行工具中這樣做只會使你的用戶非常困惑。這主要歸結于命令行中不能很好高亮
的顯示代碼塊,大量的代碼信息會使用戶不知所措。建議你始終構建一個錯誤處理模塊來解決問題,同時為用戶提供良好的反饋,最后可以提供類似于 --debug 的
選項讓開發者調試。
不要太依賴同步操作。
在 NodeJS 與其社區流行的 I/O 庫中,我們通常會有異步和同步函數兩種選擇,如 readFile 與 readFileSync,雖然同步函數可以為你節約一些開發時間,
但也會阻塞你的代碼,很多情況下會有難以理解的問題。比如當你設置定時器顯示一個 Loading 圖標的同時操作了同步 API,那么你的 Loading 圖標就會因為阻塞
而無法運動 (因為無法 render 到終端),或是你同時操作多個文件,同步的 API 會使你花費巨大的時間。
不要發布無用信息。
命令行工具很多時候的角色是充當復雜的腳本,性能和體驗是至關重要的,發布無用的信息在你的 package 中會使下載時間更長。(使用 files 來約束發布的文件)
不要修改臨時文件夾與配置區以外的信息。
對于命令行工具來說,運行時的權限是巨大的,但不要因此弄臟用戶的系統。你可以使用 require("os").tmpdir() 獲取用戶操作系統的臨時文件夾目錄,無論何時,
你都擁有這里的寫權限。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/104921.html
摘要:也是一款優秀的響應式框架站點所使用的一套框架為微信服務量身設計的一套框架一組很小的,響應式的組件,你可以在網頁的項目上到處使用一個可定制的文件,使瀏覽器呈現的所有元素,更一致和符合現代標準。 GitHub 值得收藏的前端項目 整理與收集的一些比較優秀github項目,方便自己閱讀,順便分享出來,大家一起學習,本篇文章會持續更新,版權歸原作者所有。歡迎github star與fork 預...
摘要:幸運的是,為了完成獨特的任務,無以計數的工具已經被開發者發布。圖像顯示的是一個針對該框架的在線開發工具。是用創建的命令行工具,用于壓縮文件。是一組處理所有跟文件相關的工作的組件庫。是一個基于任務的命令行項目構建工具。 JavaScript是一種靈活多變的腳本語言,它在全世界被廣泛的應用在Web頁面和服務器應用中。你可以因為任何目的去使用它,但是你需要一些工具。幸運的是,為了完成獨特的任...
摘要:一個文件,一張圖片一個文件都是一個模塊,都能用導入模塊的語法的,的導入進來。自身只能讀懂類型的文件,其它的都不認識。 webpack 是什么? webpack是一個前端模塊化打包工具指(由于模塊化開發,所以需要打包,這里所說的模塊化開發主要指JS) 由于現代前端應用程序越來越復雜,需要采用模塊化進行開發,但瀏覽器還未支持模塊化開發,所以webpack才誕生 webpack默認只支持js...
摘要:行代碼,你將擁有一個現代化規范測試驅動高延展性的前端構建工具。在閱讀前,給大家一個小懸念什么是鏈式操作中間件機制如何讀取構建文件樹如何實現批量模板渲染代碼轉譯如何實現中間件間數據共享。函數將參數中的掛載到上,并返回以便于鏈式操作即可。 ES2017+,你不再需要糾結于復雜的構建工具技術選型。 也不再需要gulp,grunt,yeoman,metalsmith,fis3。 以上的這些構建...
閱讀 1084·2021-11-24 09:39
閱讀 1316·2021-11-18 13:18
閱讀 2449·2021-11-15 11:38
閱讀 1834·2021-09-26 09:47
閱讀 1637·2021-09-22 15:09
閱讀 1632·2021-09-03 10:29
閱讀 1519·2019-08-29 17:28
閱讀 2959·2019-08-29 16:30