什么是Plop和Handlebars以及相關配置與常用API(plop篇)

什么是Plop

plop是一個小型的腳手架基协,可以通過命令行去生成、處理文件模板代碼等.

不過plop不會獨立使用恩沛,一般都會把plop集成到項目中用來創(chuàng)建同類型的項目文件.

如果項目的很多模塊的結構骨架都非常相似十拣,引入模版內容相同就可以使用Plop來實現(xiàn)自動化了,Plop旨在根據模板文件自動化創(chuàng)建組件.

plop的基本使用

npm install plop

如果沒有全局安裝渔扎,要在package.json中的script中增加腳本命令:
"scripts": { "plop": "plop" },

創(chuàng)建路由Generator

在根目錄創(chuàng)建plop-templates用于存放各種模板

創(chuàng)建一個router目錄作為路由的generator,并創(chuàng)建generator的js文件和hbs模板

image.png

prompt.js文件來定義腳手架任務

// Plop 入口文件硫狞,需要導出一個函數
// 此函數接收一個plop對象,用于創(chuàng)建生成器函數

module.exports = {
  description: 'table-temp', //描述這個generate的作用
  prompts: [
    {
      type: 'input', // 問題的類型
      name: 'pathName', // 問題對應得到答案的變量名晃痴,可以在acitons中使用該變量
      message: '文件名稱', // 在命令行中的問題
    },
  ],
  actions: (data) => {
    // 這里可以通過data獲取輸入的pathname
    let name = data.pathName.split('/');
    name = name[name.length - 1];
    name[0] = name[0].toLocaleUpperCase();
    const actions = [
      {
        type: 'add', // 操作類型 添加文件
        path: `src/views/temp/${data.pathName}.vue`, //添加的文件的路徑
        templateFile: 'src/views/dashboard/analysis/index.vue', //模版文件的路徑
        data: {
          name,
        },
      },
      {
        type: 'add', // 添加多個
        path: `src/views/temp/${data.pathName}.tsx`,
        templateFile: 'src/views/dashboard/analysis/tableData.tsx',
        data: {
          name,
        },
      },
    ];

    return actions;
  },
};

prompts問題類型
type 接受類型残吩,這里為接受終端輸入
name 輸入的內容賦給變量pathName,可以在acitons中使用該變量
message 提示內容:輸入控制器名稱
choices 選擇數組或返回一個選擇數組的函數倘核。如果定義為函數泣侮,則第一個參數將是當前查詢程序會話答案。
validate 接收用戶輸入并回答散列紧唱。如果值有效活尊,則返回true,否則返回錯誤消息(字符串)漏益。如果返回false蛹锰,則提供一個默認的錯誤消息。
when 接收當前用戶回答的散列绰疤,根據是否應該詢問這個問題铜犬,應該返回true或false。該值也可以是一個簡單的布爾值
askAnswered 如果答案已經存在轻庆,強制提示問題
...

index.hbs編寫生成文件的模版內容癣猾,可自己根據項目需求進行定義

require('module-alias/register');
import BaseController from '@base/baseController';
import { AController } from '@lib/aRouter';

export default class {{ name }}Controller extends BaseController {
}

項目的根目錄下創(chuàng)建plopfile.js文件

plopfile從低級節(jié)點模塊開始,它導出一個函數余爆,該函數接受plop對象作為它的第一個參數纷宇。
plop對象公開包含setGenerator(name, config)函數的plop api對象。這是用來為這個plopfile創(chuàng)建生成器的函數蛾方。當plop從目錄中的終端運行時像捶,將顯示這些生成器的列表上陕。
image.png
const routerGenerator = require('./plop-templates/router/prompt');

module.exports = function (plop) {
  plop.setGenerator('table-temps', routerGenerator);
  plop.setGenerator('info-temps', routerGenerator);

  plop.setHelper('upperCase', function (text) {
    return text.toUpperCase();
  });
  plop.setPartial('myTitlePartial', '<h1>{{titleCase name}}</h1>');
};
如果要用module.exports = function (plop)方式,需要安裝CommonJS

運行plop

npm run plop

image.png
根據提示輸入文件名即可

繞開提示器

一旦你已經熟悉了項目以及其中的生成器作岖,你可能希望在運行生成器時就為它提供答案唆垃,而不是等它提出問題后才給出答案五芝。比如痘儡,我有一個名為component的生成器,它會向我提一個問題要求我輸入一個名字枢步,我就可以使用下面這樣的命令:$ plop componnet "componentname" ,它就會立即執(zhí)行就像我在提示器中輸入答案一樣沉删。如果這個生成器還有第二個問題,那用戶在上面命令中可以輸入第二個值作為第二個問題的答案醉途。

像confirm和list這樣的提示確保你的輸入時有含義的矾瑰。比如輸入y/yes/t/true中的一個作為一個需要一個布爾值的確認性提問的答案。你可以從一個列表來選擇使用他們的值隘擎、索引殴穴、鍵或者名稱。Checkbox類型的提示器可以接受一個用逗號分割開的值列表來實現(xiàn)多選货葬。

ps: 如果你想為第二個提問(而非第一個問題)提供答案采幌,你可以使用下劃線來跳過。

Plofile API

TypeScript 聲明

plop捆綁了TypeScript聲明震桶。無論用不用ts聲明休傍,編輯器都會通過這些聲明提供代碼幫助 。

常用方法

方法名 參數 返回值 說明
setGenerator String,GeneratorConfig GeneratorConfig 設定一個生成器
setHelper String,Function 設定一個輔助方法
setPartial String,String 設定一個片段
setActionType String,CuscomAction 注冊一個自定義動作類型
setPrompt String,InquirePrompt 注冊一個自定義的提示器類型
load Array[String],Object,Object 從另一個plopfile或npm模塊加載生成器蹲姐、輔助類或片段

setHelper

setHelper直接對應于handlebars方法registerHelper磨取。

`
plop.setHelper('upperCase', function (text) {
return text.toUpperCase();
});

// or in es6/es2015
plop.setHelper('upperCase', (txt) => txt.toUpperCase());
`

setPartial

setPartial直接對應于handlebars的方法方法registerPartial。

module.exports = function (plop) { plop.setPartial('myTitlePartial', '<h1>{{titleCase name}}</h1>'); // used in template as {{> myTitlePartial }} };

setActionType

setActionType允許您創(chuàng)建可以在plopfile中使用的自己的操作(類似于添加或修改)柴墩。這些基本上是高度可重用的自定義操作函數忙厌。

參數 類型 說明
answer Object 對提問的回答
config Action Config 生成器的“動作”數組中的對象
plop PlopfileApi 運行此動作的plopfile的plop api

`
module.exports = function (plop) {

plop.setActionType('doTheThing', function (answers, config, plop) {
    // do something
    doSomething(config.configProp);
    // if something went wrong
    throw 'error message';
    // otherwise
    return 'success status message';
});

// or do async things inside of an action
plop.setActionType('doTheAsyncThing', function (answers, config, plop) {
    // do something
    return new Promise((resolve, reject) => {
        if (success) {
            resolve('success status message');
        } else {
            reject('error message');
        }
    });
});

// use the custom action
plop.setGenerator('test', {
    prompts: [],
    actions: [{
        type: 'doTheThing',
        configProp: 'available from the config param'
    }, {
        type: 'doTheAsyncThing',
        speed: 'slow'
    }]
});

}
`

setGenerator

配置對象應該包含prompts與actions 屬性(description屬性是可選的)。prompts數組是在終端中的提示問題江咳。而 actions 數組是要執(zhí)行的操作的列表慰毅。

GeneratorConfig 接口
屬性 類型 說明
description [String] 簡短說明生成器的用途
prompts Array[InquirerQuestion] 向用戶提的問題
actions Array[ActionConfig] 可執(zhí)行的動作
ActionConfig 接口
屬性 類型 默認值 說明
type Striing 動作類型(如 add、modify扎阶、addMany等等)
force Boolean false 是否強制執(zhí)行動作(根據動作表示不同的內容)
data Object/Function {} 指定在運行此操作時應與用戶提示答案混合的數據
abortOnFail Boolean true 如果此動作由于任何原因失敗汹胃,則終止所有未來動作

其他方法

方法 參數 返回值 說明
getHelper String Function 獲取輔助類
getHelperList Array[String] 獲取輔助類名稱列表
getPartial String String 根據名稱獲取handlebars模板片段
getPartialList Array[String] 獲取模板片段名稱列表
getActionType String CustomAction 根據名稱獲取動作類型
getActionTypeList Array[String] 獲取動作類型名稱列表
setWelcomeMessage String 自定義在運行$ plop命令時要求您選擇生成器的顯示消息
getGenerator String GeneratorConfig 根據名稱獲取生成器配置
getGeneratorList Array[Object] 獲取生成器數組,每個生成器包含名稱和描述
setPlopfilePath String 設置plopfilePath值东臀,該值在內部用于定位模板文件等資源
getPlopfilePath String 返回plopfile的絕對路徑
getDestBasePath String 返回創(chuàng)建文件時使用的基本路徑
setDefaultInclude Object Object 設置plopfile的默認配置着饥,如果它被使用plop.load()的另一個plopfile使用,則該配置將用于那個plopfile
getDefaultInclude String Object 獲取將用于此plopfile的默認配置(另一個plopfile可以使用plop.load()使用該配置)
renderString String,Object String 使用第二個參數(對象)作為數據惰赋,通過handlebars的模板渲染器運行第一個參數(字符串)宰掉。返回渲染后的模板

內置action的一些動作

add

add 動作被用來向你的項目中新增一個文件呵哨,path 屬性指定生成文件的路徑,它本身是一個handlebars模板轨奄,用戶輸入的文件名稱將作為變量嵌入其中孟害。文件內容將由template或templateFile決定。

屬性 類型 默認值
path Sring 一個符合handlebars模板規(guī)范的字符串挪拟,它是新文件的路徑
template String 被用來創(chuàng)建新文件的handlebars模板
templateFile String 一個包含模板的文件路徑
skipIfExists Boolean 如果要創(chuàng)建的文件已經存在挨务,則跳過(而非報錯)
force Boolean 繼承自ActionConfig(如果文件存在則覆蓋)
data Object 繼承自ActionConfig
abortOnFail Boolean 繼承自ActionConfig
AddMany

addMany 動作可以一步創(chuàng)建多個文件。destination屬性是用來指定生成文件所在目錄的玉组,它是一個handlebars模板谎柄,意味著該屬性中定義的目錄路徑可以是動態(tài)的。base屬性可以用于更改在創(chuàng)建文件時應該忽略模板路徑的哪些部分惯雳。 如果您希望添加的文件名是唯一的朝巫,則templateFiles glob位于的路徑可以在它們的文件/文件夾名稱中使用handlebars語法

|屬性 |類型 默認值| 說明|
| -------- | -------- | -------- | -------- |
|destination| String | |規(guī)定新文件要創(chuàng)建到的目錄(是一個handlebars模板)|
|base |String | |當文件要被創(chuàng)建到目錄中時需要忽略的路徑部分|
|templateFiles |Glob | |匹配要添加的多個模板文件的glob模式|
|stripExtensions| [String]| [‘hbs’] |文件擴展名,在將其添加到目標文件時石景,應該從模板文件名稱中刪除這些擴展名|
|globOptions |Object | |更改如何與要添加的模板文件匹配的glob選項|
|verbose |Boolean| true |打印每個成功添加的文件路徑|
|skipIfExisits |Boolean| false |繼承自Add接口|
|force |Boolean| false |繼承自 ActionConfig 對象|
|data| Object| {} |繼承自 ActionConfig 對象|
|abortOnFail |Boolean |true |繼承自 ActionConfig 對象|

Modify

modify 修改動作將使用pattern屬性在指定路徑(path)下的文件中查找/替換文本劈猿。

屬性 類型 默認值 說明
path String 要修改的文件的路徑(是一個handlebars模板)
pattern RegExp end-of-file 一個正則表達式,用來匹配需要被替換的文本
template String 一個handlebars模板潮孽,用它取代所匹配的模式揪荣。捕獲組的值有1、2等
templateFile String 是一個包含模板的路徑
data Object {} 繼承自ActionConfig
abortOnFail Boolean true 繼承自ActionConfig
Append

append 追加操作是一個常用功能恩商,它是modify接口的子集变逃。它用于將數據附加到文件中的特定位置。

屬性 類型 默認值 說明
path String 需要被修改的文件路徑(是一個handlebars模板)
pattern RegExp怠堪,String 一個正則表達式揽乱,用于匹配附加文本的正則表達式
unique Boolean true 是否刪除相同的項
separator String new line 分割符
template String 項要用的handlebars模板
templateFile String 包含模板的文件模板
data Object {} 繼承自ActionConfig
abortOnFail Boolean true 繼承自ActionConfig
Custom(動作函數)

add和modify操作將處理plop要處理的幾乎所有情況 .但是,plop 提供一些自定義動作的函數粟矿。

  • 自定義動作函數將被plop執(zhí)行凰棉,這時會使用相同的 CustomAction 動作簽名;
  • 在執(zhí)行下一個動作前陌粹,plop 將會等待自定義動作執(zhí)行完撒犀。
  • 這個函數必須通過返回值來告訴plop,發(fā)生了什么掏秩。如果您返回的是一個 Promise對象或舞,那plop 不會開始其它動作梁剔,直到Promise 達到解決狀態(tài)诗芜。如果您返回一條消息(字符串),plop 將知道動作已經完成系瓢,它將在動作的狀態(tài)中報告消息仰挣。
  • 當Promise變?yōu)榫芙^態(tài)或者函數拋出一個異常,自定義動作將失敗低零。
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末组题,一起剝皮案震驚了整個濱河市云矫,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌矫渔,老刑警劉巖彤蔽,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異庙洼,居然都是意外死亡顿痪,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門送膳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來员魏,“玉大人丑蛤,你說我怎么就攤上這事叠聋。” “怎么了受裹?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵碌补,是天一觀的道長。 經常有香客問我棉饶,道長厦章,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任照藻,我火速辦了婚禮袜啃,結果婚禮上,老公的妹妹穿的比我還像新娘幸缕。我一直安慰自己群发,他們只是感情好,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布发乔。 她就那樣靜靜地躺著熟妓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪栏尚。 梳的紋絲不亂的頭發(fā)上起愈,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天,我揣著相機與錄音译仗,去河邊找鬼抬虽。 笑死,一個胖子當著我的面吹牛纵菌,可吹牛的內容都是我干的阐污。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼产艾,長吁一口氣:“原來是場噩夢啊……” “哼疤剑!你這毒婦竟也來了滑绒?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤隘膘,失蹤者是張志新(化名)和其女友劉穎疑故,沒想到半個月后,有當地人在樹林里發(fā)現(xiàn)了一具尸體弯菊,經...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡纵势,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了管钳。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钦铁。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖才漆,靈堂內的尸體忽然破棺而出牛曹,到底是詐尸還是另有隱情,我是刑警寧澤醇滥,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布黎比,位于F島的核電站,受9級特大地震影響鸳玩,放射性物質發(fā)生泄漏阅虫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一不跟、第九天 我趴在偏房一處隱蔽的房頂上張望颓帝。 院中可真熱鬧,春花似錦窝革、人聲如沸购城。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽工猜。三九已至,卻和暖如春菱蔬,著一層夾襖步出監(jiān)牢的瞬間篷帅,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工拴泌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留魏身,地道東北人。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓蚪腐,卻偏偏與公主長得像箭昵,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子回季,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內容