大前端的自動化工廠(1)——Yeoman

来源:https://www.cnblogs.com/dashnowords/archive/2018/08/11/9460705.html
-Advertisement-
Play Games

一.Yeoman是什麼 是現代化前端項目的腳手架工具,用於生成包含指定框架結構的工程化目錄結構。它是整個前端自動化工廠的第一站。 從個人使用者的角度來看, 的地位有些雞肋,因為流行框架自帶的 工具都能夠自動生成官方推薦的目錄結構,而且一個項目持續少則幾個月多則幾年,而項目的初始化結構目錄在此期間只需 ...


一.Yeoman是什麼

Yeoman是現代化前端項目的腳手架工具,用於生成包含指定框架結構的工程化目錄結構。它是整個前端自動化工廠的第一站。

從個人使用者的角度來看,Yeoman的地位有些雞肋,因為流行框架自帶的cli工具都能夠自動生成官方推薦的目錄結構,而且一個項目持續少則幾個月多則幾年,而項目的初始化結構目錄在此期間只需要生成一次。儘管工具的設計定位如此,但在組件化開發的潮流中,使用Yeoman來生成符合項目編碼規範的組件框架是非常有必要的。

為了降低項目的維護成本,將要求的組件結構和必要的使用說明生成組件模板,使用Yeoman工具來直接生成,當項目的體積越來越大時,你就會體會到這種方式的好處。

二.Yeoman的一般使用方法

詳情請參考【Yeoman官方網站】

1.使用包管理工具安裝yo

  • 使用npm:npm install -g yo

  • 使用yarn:yarn global add yo

    安裝後在命令行輸入yo --version,顯示版本號則安裝成功。

2.下載項目目錄模板generator-XXX

開源社區有非常多的項目目錄模板,在命令行輸入npm install generator-fountain-webappyarn add generator-fountain-webapp安裝項目模板。Fountain可以定製安裝各類集成的javascript框架和CSS框架。

3.用指定模板初始化項目目錄

在當前文件夾開啟命令行,輸入yo XXX(XXX為generator模板尾碼的名稱,例如yo fountain-webapp),根據互動式命令行信息填寫參數,最終即可生成項目目錄。

[使用fountain-webapp模板示意圖]

4. 子模板的使用

如果模板支持子模板功能,用戶通過yo XXX:YYY即可生成項目組件,例如yo angular : controller生成一個angularjs項目中控制器的代碼骨架)。

三.構建自己的腳手架

你的團隊很可能有自己封裝的框架,無法使用現有的generator,同時yo的速度不是很穩定(據說是因為內置的generator搜索機制和牆的原因),慶幸地是其官方團隊開源了yeoman代碼,並有詳細的文檔解釋其運行原理和機制,讓開發者可以根據團隊需求定製合適的generator生成器。

3.1 使用方法

你可以通過如下方式使用它:

  1. 通過在自己的項目中引用yeoman-generator,使用yeomanAPI編寫定製的模板文件(註意使用此種方法時,如果希望通過yo來調用生成器,則需要按指定的方式編寫package.json文件)。
  2. 下載generator-generator模板並使用yo generator在當前目錄生成模板文件骨架,並完善其生命周期方法。

3.2 generator的生命周期

generator的本質是一個繼承自yeoman-generator的匿名類,其代碼架構如下:

const Generator = require('yeoman-generator');
module.exports = class extends Generator{
    initianlizing(){
        //獲取當前項目狀態,獲取基本配置參數等
    }
    prompting(){
        //向用戶展示互動式問題收集關鍵參數
    }
    configuring(){
        //保存配置相關信息且生成配置文件(名稱多為'.'開頭的配置文件,例如.editorconfig)
    }
    default(){
        //未匹配任何生命周期方法的非私有方法均在此環節*自動*執行
    }
    writing(){
        //依據模板進行新項目結構的寫操作
    }
    conflicts(){
        //處理衝突(內部調用,一般不用處理)
    }
    install(){
        //使用指定的包管理工具進行依賴安裝(支持npm,bower,yarn)
    }
    end(){
        //結束動作,例如清屏,輸出結束信息,say GoodBye等等
    }
}

Yeoman-generator提供了很多封裝好的方法,文檔詳細且源碼註釋非常詳細,詳情可參見【Yeoman-generator官方API】

3.3 generator的調用

本地開發的generator-XXX未經過發佈,需要在package.json所在目錄開啟命令行,輸入npm link將其安裝到本地的全局環境,然後通過yo XXXyo XXX:YYY的方式來調用,也可以通過第四節中提及的工具鏈集成的方式繞開yo命令執行生成器。

四. Yeoman與工具鏈集成

與前端工程化工具鏈的集成或許是Yeoman最恰當的歸宿,為此Yeoman團隊索性開源開到底,直接公開了其核心庫yeoman-enviroment,使得generator模板可以不必通過yo工具就可以被調用,引用的方式比較簡單:

var yeoman = require('yeoman-environment');
var env = yeoman.createEnv();

//generator-XXX模塊地址查詢
var generatorPath = require.resolve('generator-XXX','XXX:app');

//如果generator未使用npm link進行連接,需要將其拷貝至工程依賴中按如下方式獲取地址
var generatorPath = path.resolve(process.cwd(),'node_modules','generator-XXX','generators','app');

//註冊generator
env.register(generatorPath, 'XXX:app');

//調用generator生成項目骨架或組件骨架
env.run('XXX:app', {'skip-install': true}, function (err) {
    console.log('done');
});

五. 實戰:tiny-helper工具開發演示

在此演示如何製作一個小工具來生成標準化的Component,示例工具使用generator-generator生成,為方便學習使用,放置在本地node_modules目錄中,示例generator中只進行了兩項基本操作:

  1. configuring階段將.editorconfig文件直接拷貝至當前目錄

  2. writing階段將controller.tpl.js模板中的占位符替換為用戶輸入的關鍵詞,然後生成新的controller.js文件

generator中關鍵示例代碼:

//保存配置相關信息且生成配置文件(名稱多為'.'開頭的配置文件,例如.editorconfig)
configuring(){
    //生成.editorconfig
    this.fs.copy(
      this.templatePath('.editorconfig'),
      this.destinationPath('.editorconfig')
    );
}

//依據模板進行新項目結構的寫操作
writing(){
    //替換關鍵字生成Controller.js
    var controllerTpl = this.fs.read(this.templatePath('controller.tpl.js'));
    this.fs.write(this.destinationPath('controller/'+ this.props.keyWords + 'Controller.js'),controllerTpl.replace(/__PLACEHOLDER__TINY__/g, this.props.keyWords));
}

在命令行輸入npm run tiny運行:

[使用tiny-helper小工具]

controller.tpl.js模板:

[轉換前的模板]

轉換後的loginPageController.js:

[轉換後的js文件]

可以看到我們已經使用關鍵詞替換掉占位符並得到了新的controller.js框架文件。除了演示的功能外,yeoman內置支持ejs模板引擎,我們可以利用它生成各種html模板,包括常見樣式的通用寫法,包含固定類名的組件DOM結構等等,這對於統一團隊代碼風格有著重要的意義。

筆者認為整體而言,Yeoman作為腳手架工具的存在意義,遠不及對於提升代碼規範性的價值。


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

-Advertisement-
Play Games
更多相關文章
  • Android Keyguard自Android L以來一直沒有多大變化。在Android L之前, Keyguard有自己獨立的進程,KeyguardService自開機時啟動並常駐。Android L之後到Android P,Keyguard和SystemUI共同享有一個進程。process i ...
  • 註:由於我是物聯網專業的大二學生,平時學習較多的是嵌入式編程方面的知識,對於網頁,手機Android客戶端從來沒有接觸過,因此所有東西都要從頭來過,慢慢學習。 每次學習新的東西都很激動,仿佛自己又離改變世界近了一點(純屬自己意淫),好了廢話不多說,開始我的微信小程式之旅! 1.API: (Appli ...
  • 一.前言 眾所周知:沒有對象怎麼辦?那就new一個! 那麼在JS中,當我們new一個對象的時候,這個new關鍵字內部都幹了什麼呢?現在我們就來剖析一下原生JS中new關鍵字內部的工作原理。 二.原始的new 首先,我們先new一個對象看看: 列印結果: 從列印結果中可以看到: 用new關鍵字實例化對 ...
  • 1.js的數據類型: Number、Boolean、String、Undefined、Null、Symbol(es6新定義的)和Object(ps:Array是特殊的Object) typeof返回6種類型:number boolean string object undefined functio ...
  • 眾所周知,可以通過設置background-repeat的值來改變背景圖片的重覆次數。但有一個問題,background-repeat的值不是讓圖片只有1個,就是讓圖片鋪滿。如果只想設置給定數量的圖片該怎麼辦?以2個為例,請看代碼: 這樣,就實現了<h1>元素的最左邊有一個logo.jpg、最右邊也 ...
  • 一.不可改變的原始值(棧數據)(五個) 數字(number),字元串(string),布爾值(boolean),undefined,null 其中;undefined是未定義的意思,而null是空的意思,他們倆的區別在於,null有值,不過這個值是空值,而undefined是未定義,完全沒有值的意思 ...
  • 遞歸演算法: 優點:代碼簡潔、清晰,並且容易驗證正確性。 缺點: 1、它的運行需要較多次數的函數調用,如果調用層數比較深,每次都要創建新的變數,需要增加額外的堆棧處理,會對執行效率有一定影響,占用過多的記憶體資源。 2、遞歸演算法解題的運行效率較低。在遞歸調用的過程中系統為每一層的返回點、局部變數等開闢了 ...
  • 1、DOM0級事件和DOM2級事件 DOM 0級事件是元素內的一個私有屬性:div.onclick = function () {},對一個私有屬性賦值(在該事件上綁定一個方法)。由此可知DOM 0級事件只能給元素的某一個行為綁定一次方法,第二次綁定會把前面的覆蓋掉。 DOM 2級事件是讓DOM元素 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...