一統江湖的大前端(4)shell.js——穿上馬甲我照樣認識你

来源:https://www.cnblogs.com/dashnowords/archive/2018/09/13/9632493.html
-Advertisement-
Play Games

《一統江湖的大前端》系列是自己的前端學習筆記,旨在介紹javascript在非網頁開發領域的應用案例和發現各類好玩的js庫,不定期更新。如果你對前端的理解還是寫寫頁面綁綁事件,那你真的是有點OUT了,前端能做的事情已經太多了, , , , , , 甚至 ,什麼火就搞什麼,活脫脫一個 蹭熱點小能手 。 ...


《一統江湖的大前端》系列是自己的前端學習筆記,旨在介紹javascript在非網頁開發領域的應用案例和發現各類好玩的js庫,不定期更新。如果你對前端的理解還是寫寫頁面綁綁事件,那你真的是有點OUT了,前端能做的事情已經太多了, 手機app開發 , 桌面應用開發 , 用於神經網路人工智慧的庫 , 頁面游戲 , 數據可視化 , 甚至 嵌入式開發 ,什麼火就搞什麼,活脫脫一個蹭熱點小能手。如果你也覺得前端的日常開發有些枯燥,不妨一起來看看前端的另一番模樣。

前端開發人員的工作內容幾乎很少會涉及腳本的編寫,建議將shell.js和git的命令行指令綜合在一起作為專題學習,集中學習一下常用指令。更詳細的參數請參考專門的shell腳本語言資料進行學習。

一.Shell && Shelljs

碼農界存在著無數條鄙視鏈,linux使用者對windows的鄙視便是其中之一,cli使用者對GUI用戶的嘲諷也是如此,在這樣一個講究逼格的時代,如果你的桌面上沒有一個小黑窗時不時地從下往上翻滾並拋出一些亮綠色的字元串,你真不好意思跟人打招呼。而前端這種天生幾乎不用和命令行打交道的物種,自然再一次莫名其妙地處在了鄙視鏈的末端,沒錯,是再一次。

Shelllinux下的腳本語言解析器,擁有豐富且強大的底層操作許可權。Shelljs就是基於node的一層命令封裝插件,讓前端開發者可以不依賴linux也不依賴類似於cmder的轉換工具,而是直接在我們最熟悉不過的javascript代碼中編寫shell命令實現功能。

二.前端開發人員學Shelljs幹嘛

shell自動化是強相關的,個人理解其用途主要是兩方面:

  • 1.從業務邏輯的需求來看,shelljs並不是什麼具有非凡意義的插件,它只是對node的底層API進行了一些封裝,方便我們以類似shell的語法去編寫代碼梳理邏輯,實現一些業務邏輯需求,如果你所在的項目組恰好需要這樣的能力,用它會很方便;
  • 2.cli相對於GUI或許是更快,但它依然是一種重覆勞作,有了shelljs和全棧能力,開發者可以將團隊中耗時的重覆性常規動作編寫為自動化腳本,並利用前端的天然優勢為其配備GUI,用頁面上的一鍵點擊來替代重覆勞作,在緊張的開發節奏中,平均每天為你節約個30-40分鐘起來走走喝杯水難道不好嗎?

想要一統江湖,大前端的深度和廣度是缺一不可的,你可以說你不精通shell,但不要說自己不懂shell,更不要一臉天真地反問面試官“前端還能搞shell?這麼神奇?”他不會覺得你對知識有好奇心,只會覺得你很low,哦不對,是大寫的LOW.

三.官方示例(包含註釋)

廢話說完了,開始學習,拿好小本子,我要開車了。

//引入shelljs
var shell = require('shelljs')

//檢查控制台是否以運行`git `開頭的命令
if (!shell.which('git')) {
  //在控制台輸出內容
  shell.echo('Sorry, this script requires git');
  shell.exit(1);
}

shell.rm('-rf','out/Release');//強制遞歸刪除`out/Release目錄`
shell.cp('-R','stuff/','out/Release');//將`stuff/`中所有內容拷貝至`out/Release`目錄

shell.cd('lib');//進入`lib`目錄
//找出所有的擴展名為js的文件,並遍歷進行操作
shell.ls('*.js').forEach(function (file) {
  /* 這是第一個難點:sed流編輯器,建議專題學習,-i表示直接作用源文件 */
  //將build_version欄位替換為'v0.1.2'
  shell.sed('-i', 'BUILD_VERSION', 'v0.1.2', file);
  //將包含`REMOVE_THIS_LINE`字元串的行刪除
  shell.sed('-i', /^.*REMOVE_THIS_LINE.*$/, '', file);
  //將包含`REPLACE_LINE_WITH_MACRO`字元串的行替換為`macro.js`中的內容
  shell.sed('-i', /.*REPLACE_LINE_WITH_MACRO.*\n/, shell.cat('macro.js'), file);
});

//返回上一級目錄
shell.cd('..');

//run external tool synchronously
//即同步運行外部工具
if (shell.exec('git commit -am "Auto-commit"').code !== 0){
    shell.echo('Error: Git commit failed');
    shell.exit(1);
}

三.官方示例中涉及的命令解釋:

  • shell.which(command)

    在環境變數PATH中尋找指定命令的地址,判斷該命令是否可執行,返回該命令的絕對地址。

  • echo

    在控制台輸出指定內容

  • exit(code)

    以退出碼為code退出當前進程

  • rm

    刪除一個目錄中一個或多個文件目錄,一旦刪除,無法恢復。 常用參數

    • -f:強制刪除文件;
    • -i:刪除之前先詢問用戶;
    • -r:遞歸處理目錄;
    • -v:顯示處理過程;
  • cp([options,] source_array, dest)

    用來將一個或多個源文件或目錄複製到指定的文件或目錄。 常用參數:

    • -f:強制刪除文件;
    • -i:刪除之前先詢問用戶;
    • -r:遞歸處理目錄;
  • cd

    切換工作目錄至指定的相對路徑或絕對路徑。cd..為返回上一級,cd-回到前一目錄。

  • ls

    用來顯示目標列表。 常用參數:

    • -a:顯示所有文件;
    • -C:多列顯示查詢結果;
    • -l:單列長格式顯示查詢結果(與-C相反);
    • -R:遞歸處理目錄;
  • sed([options,] search_regex, replacement, file_array

    file_array中符合search_regex的內容替換為replacement,支持正則的捕獲組自引用。一次處理一行內容,處理完成後把緩衝區內容送往屏幕,然後處理下一行,迴圈直至結束。功能豐富且用法較複雜,建議自行百度進行專題學習。

    • -i:直接作用源文件
  • cat

    將一個或多個文件內容讀入,指定一個文件時讀入該文件,指定多個文件時將內容連接在一起讀入。

  • exec(command,[, options][, callback])

    執行所傳入的命令

    • async:是否非同步執行,預設false,傳入callback時自動開啟
    • slient:不輸出信息到console,預設false
    • encoding:預設utf8

四.文檔中其他API概覽

  • chmod

    設置文件調用許可權

    • 基本語法 :chmod [-cfvR] [--help] [--version] mode file...
    • -c:若文件許可權確實被更改,才顯示更改動作
    • -f: 許可權無法被更改時不顯示錯誤信息
    • -v: 顯示許可權變更的詳細資料
    • -R: 遞歸,對其目錄下所有文件和子文件執行相同操作
    • mode欄位格式 : [ugoa...][[+-=][rwxX]...][,...]
    • u表示該文件擁有者,g表示同一群體者,o表示其他,a表示所有
    • +表示增加許可權,-表示取消許可權,=表示唯一設定許可權
    • r表示可讀,w表示可寫,x表示可執行,X表示當該文件是個子目錄?
  • find(path[,path...])

    尋找路徑

  • grep([options,] regex_filter,file)

    從指定文件中抓取符合正則的行

    • -v:翻轉正則匹配
    • -l:僅列印符合條件的文件名
  • head([{'-n':,}] file)

    顯示指定文件中的前N行

    • -n:顯示前<num>
  • mv

    移動文件

  • pwd

    返回當前目錄

  • rm

    見上文

  • set

    設置全局變數的值

  • sort

    將文件的內容逐行排序

    • -r:反轉結果
    • -n:依據數值對比
  • tail

    讀取指定文件的末尾n行,對比head命令進行理解

  • test()

    評估一個表達式是否為真(以下僅為最常見的參數用例)

    • -d,path:如果path是一個路徑則返回true
    • -e,path:如果path存在則返回true
  • ShellString()

    構造器,將一個字元串轉化為Shell字元串,轉化後的字元串支持鏈式調用特殊的shell命令

  • ShellString.Prototype.to()

    shellString輸出至指定文件,相當於腳本語言中的>

  • ShellString.Prototype.toEnd()

    shellString追加至指定文件,相當於腳本語言中的>>

  • touch([options,]file)

    生成文件

  • env['VAR_NAME']

    指向process.env

  • Pipes鏈式調用支持

    sed,grep,cat,exec,to,toEnd均支持鏈式調用。

我的博客即將入駐“雲棲社區”,誠邀技術同仁一同入駐。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • dx.bat :將所有的.class文件變成一個.dex文件。 aapt:Android Application package tools 安卓應用的打包工具。 adb:Android Debug Bridge 安卓調試橋。 intel,arm,mips Android版本對應Api級別: 2.3 ...
  • 有時候我們自定義一個View,比如ImageView,我們需要讓它寬高按照一定的比例顯示,例如在ImageView在GridView中顯示,GridView設置了3列,由於ImageVIew的寬度會根據屏幕的大小進行縮放的,如果不設置高度與寬度成一定比例的話,那麼可能會由於屏幕大小的變化而讓Imag ...
  • 當我們在Editext輸入內容的時候,檢測如果超過限制的長度無法輸入內容,並且給用戶提示。 首先我想到了下麵的方法: 未經測試,個人覺得這種體驗或許不是很好,或許會出現EdiText閃動。 其實我們可以用下麵這種方法: 源碼給Editext設置了過濾器,專門用來判斷是否超出最大的字元長度,把這段過濾 ...
  • 恢復內容開始 今天第一次用到ScrollView嵌套RecyclerView來做頁面。 剛開始效果開心得很,非常Very漂亮噢! 納尼!!!沃特Fuck!出事兒,出事兒! 滑動為何如此不流暢,隨後經過研究加上了一個關鍵屬性,如下: recyclerview.setNestedScrollingEna ...
  • 本文翻譯自:codementor 翻譯不當之處,歡迎指正交流 Web Components是web平臺的未來嗎?關於這一問題支持和反對的觀點有很多。事實上瀏覽器對Web Components的支持正在逐漸形成,並有越來越多的工具、資源和IT從業人員正在致力於創建發佈自己的Web Components ...
  • adb 命令模擬按鍵事件 模擬 點擊 事件 有時我們需要程式模擬按鈕或點擊,而手機本身又沒有,哪麽可以採取adb 模擬實現,最後再去實際設備去測試(前期一般都拿不到設備); 如模擬上一首,下一首,暫停等,手機上是沒有的,但有些設備上是有的; //這條命令相當於按了設備的語音鍵(按此鍵後,進入語音識別 ...
  • 概述 Retrofit是一個OkHttp網路請求框架的封裝庫,Retrofit通過註解配置網路參數,可以按照我們的規則去構造實際的HTTP請求,能夠靈活設置URL、頭部、請求體、返回值等,是目前最優雅的一個網路框架。 引入 Retrofit基本使用三部曲 創建實例 定義介面 創建 同步/非同步 回調 ...
  • PoPo數據可視化 聚焦於Web數據可視化領域, 發現前端可視化領域有意思的內容. 涵蓋前端可視化領域最新資訊, 開源可視化庫的發佈更新消息, 可視化案例分析與講解, 可視化技術文章, 可視化大神的日常, 可視化八卦等等...不想錯過前端可視化領域的精彩內容, 就快快搜索公眾號popodv_com關 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...