yeoman是什么
yeoman主要包含了三個工具:yo、grunt、bower。我們先看下這三個工具分別是做什么的:
- yo:腳手架工具,主要作用是創建項目骨架(跟grunt-init有點像)。
- grunt:構建工具,主要用來運行各種任務,比如文件壓縮、合並、打包等。
- bower:主要用來做前端資源依賴管理,跟npm很像,區別在於:npm管理的是node模塊的依賴,bower管理的是前端資源的依賴,如css、javascript文件等。
yeoman是做什么的
現在我們已經知道yeoman里面又什么東西了,那么它在我們的項目開發中扮演了一個什么樣的角色呢?首先我們來看看官方對yeoman的定義:
MODERN WORKFLOWS FOR MODERN WEBAPPS
這句話其實比較抽象,很難一眼知道yeoman是做什么的。 我們注意里面的關鍵詞 workflow ,也就是說yeoman貫穿了前端項目開發的始終。
在用到yeoman的項目中,我們的工作流程一般是:
- 創建項目骨架:運行yo工具,通過各種yeoman-generator(模板)創建項目骨架。
- 下載前端資源:運行
bower install
,下載項目中依賴的前端資源,比如jQuery、bootstrap、angularjs等(非必要) - 運行構建任務:運行grunt跑自動化構建任務(非必要)
入門例子:webapp
首先安裝yo、bower、grunt-cli工具
npm install -g yo bower grunt-cli
然后,現在yeoman模板,比如generator-webapp
(yeoman的模板前端都是generator-
)
npm install -g generator-webapp
初始化webapp項目,在任意空目錄下運行下面命令,然后回答幾個簡單的問題
yo webapp
現在,項目骨架已經創建好了,運行下面命令安裝依賴的前端資源
bower install underscore
最后,安裝grunt依賴的包,運行構建任務,搞定!
npm install
grunt
為什么是yeoman,而不是grunt-init
grunt-init
的定位同樣是前端腳手架。那 grunt + grunt-init 已經滿足了我們從 項目創建 到 項目構建的需求,為什么又冒出個yeoman出來? 從yeoman的受歡迎程度來看,可能有以下兩方面原因:
- 解決了一些grunt + grunt-init 沒有幫我們解決的問題
- 具有一些grunt + grunt-init 所沒有的有用特性
答案是:兩方面都有。
- 基於bower的前端資源依賴管理:這個的重要性無需強調,請回憶一下我們滿頭大汗就為了找到某個js文件,或因缺少某個依賴的js文件導致腳本出錯的經歷。具體可參考knight上周及本周分享 :)
- 子模板:相當有用的特性。你可以用它完成子項目創建、子模塊創建、資源更新等工作,給項目提供了更多的靈活性。
- 基於問題的項目骨架構建:這點其實grunt-init也有,但yeoman明顯做得更好,如二選一、單選列表、多選列表等。grunt-init 的問答流程內部實現則相對費解。。。
yeoman項目下幾個重要的文件
主要就是下面幾個文件,不贅述
- Gruntfile.js:grunt任務聲明的地方
- package.json:項目依賴的插件,比如grunt任務依賴的插件等
- bower.json:前端資源依賴聲明
創建自己的Generator(模板)
什么是generator就略過了,模板。。。直接進入實操步驟
首先安裝generator-generator
,名字比較詭異,意思是“模板的模板”
npm install -g yo generator-generator
創建一個叫做generator-blog
的目錄,命令行下進入這個目錄,然后運行
yo generator
然后你會看到下面這坨東東
_-----_
| |
|--(o)--| .--------------------------.
`---------´ | Welcome to Yeoman, |
( _´U`_ ) | ladies and gentlemen! |
/___A___\ '__________________________'
| ~ |
__'.___.'__
´ ` |° ´ Y `
回答下面兩個簡單問題,搞定
[?] Would you mind telling me your username on Github? chyingp@gmail.com
[?] What's the base name of your generator? blog
在目錄下運行如下命令,讓當前創建的模板成為全局的模塊
npm link
在其他任意目錄運行如下命令,創建項目
yo blog
稍微看下generator-blog的細節
進入generator-blog目錄,看看里面都有什么,bower.json、package.json不贅述,我們需要關注的點:app
目錄是模板的核心目錄
其中,index.js
是項目骨架創建的主要邏輯,里面包含了問答設置以及處理、各種目錄、文件操作等(從模板目錄到目標目錄)。根目錄下的package.json主要聲明了模板的名字、版本、git地址等。。。
├── app
│ ├── index.js
│ └── templates
│ ├── _bower.json
│ ├── _package.json
│ ├── editorconfig
│ ├── jshintrc
│ └── travis.yml
├── test
│ ├── test-creation.js
│ └── test-load.js
├── .editorconfig
├── .gitattributes
├── .gitignore
├── .jshintrc
├── .travis.yml
├── LICENSE
├── package.json
└── README.md
generator細節深入
@todo
generator子模板創建
@todo