您好,登錄后才能下訂單哦!
本篇內容主要講解“怎么使用yeoman打造自己的項目腳手架”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“怎么使用yeoman打造自己的項目腳手架”吧!
Yeoman 是一個通用的腳手架系統,允許創建任何類型的應用程序(Web,Java,Python,C#等)。用 yeoman 寫腳手架非常簡單, yeoman 提供了 yeoman-generator 讓我們快速生成一個腳手架模板,我們的主要工作就是把模板文件寫好。現在我們來用 yeoman 寫一個生成 javascript 插件的腳手架吧。
腳手架功能:
自動構建編譯和打包
支持 es6 語法
支持單元測試
支持 jsdoc 生成文檔
支持 eslint 語法檢查
自動生成 changelog
首先需要全局安裝 yo 和 generator-generator
npm install yo -g npm install generator-generator -g
生成腳手架模板
yo generator
在這個終端界面里輸入項目名、描述等項目信息。注意項目名稱要寫成generator-xxx
的格式,這樣用戶就可以通過yo xxx
安裝你的腳手架了。
生成的腳手架模板目錄結構如下:
. ├── generators/ │ └── app/ │ ├── index.js │ └── templates/ │ └── dummyfile.txt ├── .editorconfig ├── .eslintignore ├── .gitattributes ├── .gitignore ├── .travis.yml ├── .yo-rc.json ├── LICENSE ├── README.md ├── package.json └── __tests__/ └── app.js
接下來我們就在generators/app/index.js
里寫腳手架的邏輯。
腳手架所做的事情:
接收用戶輸入
根據用戶輸入生成模板文件
將模板文件拷貝到目標目錄(通常是用戶運行腳手架的目錄)
安裝依賴
yeoman 提供了一個基本生成器,你可以擴展它以實現自己的行為。這個基礎生成器將幫你減輕大部分工作量。在生成器的 index.js 文件中,以下是擴展基本生成器的方法:
var Generator = require("yeoman-generator"); module.exports = class extends Generator {};
yeoman 生命周期函數執行順序如下:
initializing - 初始化函數
prompting - 接收用戶輸入階段
configuring - 保存配置信息和文件
default - 執行自定義函數
writing - 生成項目目錄結構階段
conflicts - 統一處理沖突,如要生成的文件已經存在是否覆蓋等處理
install - 安裝依賴階段
end - 生成器結束階段
我們常用的就是 initializing、prompting、default、writing、install 這四種生命周期函數。看下例子:
"use strict"; const Generator = require("yeoman-generator"); const chalk = require("chalk"); // 讓console.log帶顏色輸出 const yosay = require("yosay"); const mkdirp = require("mkdirp"); // 創建目錄 module.exports = class extends Generator { initializing() { this.props = {}; } // 接受用戶輸入 prompting() { // Have Yeoman greet the user. this.log( yosay( `Welcome to the grand ${chalk.red( "generator-javascript-plugin" )} generator!` ) ); const prompts = [ { type: "confirm", name: "someAnswer", message: "Would you like to enable this option?", default: true } ]; return this.prompt(prompts).then(props => { // To access props later use this.props.someAnswer; this.props = props; }); } // 創建項目目錄 default() { if (path.basename(this.destinationPath()) !== this.props.name) { this.log(`\nYour generator must be inside a folder named ${this.props.name}\n I will automatically create this folder.\n`); mkdirp(this.props.name); this.destinationRoot(this.destinationPath(this.props.name)); } } // 寫文件 writing() { // 將templates目錄的代碼拷貝到目標目錄 // templates目錄默認路徑是generators/app/templates this.fs.copy( this.templatePath("dummyfile.txt"), this.destinationPath("dummyfile.txt") ); this._writingPackageJSON(); } // 以下劃線_開頭的是私有方法 _writingPackageJSON() { // this.fs.copyTpl(from, to, context) this.fs.copyTpl( this.templatePath("_package.json"), this.destinationPath("package.json"), { name: this.props.name, description: this.props.description, keywords: this.props.keywords.split(","), author: this.props.author, email: this.props.email, repository: this.props.repository, homepage: this.props.homepage, license: this.props.license } ); } // 安裝依賴 install() { this.installDependencies(); } };
前面我們把一個腳手架的基本框架都寫好了,它可以接受用戶輸入的內容,可以寫文件,可以安裝依賴,但接收用戶輸入的數據怎么用?寫進什么文件?安裝什么依賴呢?這些都是模板文件做的事情。現在就開始最主要的一部分:編寫模板文件。
模板文件是你為用戶生成的一個項目 demo,讓用戶看著這些示例代碼就可以開工了,用戶應該只需要專注于業務邏輯,而不用管打包構建這些事。
首先建好模板目錄:
├── .editorconfig ├── .eslintignore ├── .eslintrc.js ├── .gitignore ├── .babelrc ├── jsdoc.json ├── README.md ├── package.json ├── build/ └── rollup.js ├── src/ └── index.js ├── test/ └── index.js
我們的模板package.json
里已經寫好這些命令:
"scripts": { "prebuild": "npm run lint && npm run test && npm run doc", "build": "node ./build/rollup.js", "lint": "eslint --ext .js, src", "test": "mocha --require babel-register --require babel-polyfill --bail", "changelog": "conventional-changelog -p angular -i CHANGELOG.md -s", "doc": "jsdoc -c ./jsdoc.json" }
npm run lint
用 eslint 進行語法檢查,在編譯前就避免語法錯誤和統一代碼風格。
npm test
運行單元測試
npm run doc
根據注釋生成文檔
npm run changelog
根據git log
生成項目日志,改動記錄一目了然
npm run prebuild
編譯前的語法檢查、 運行測試、生成文檔
npm run build
編譯打包
我們可以使用<%= name %>
這樣的模板語法使用腳手架中的context
上下文,無論是用戶輸入的數據,還是程序自己的變量:
{ "name": "<%= name %>", "description": "<%= description %>", "version": "1.0.0", "private": false, "main": "dist/<%= name %>.umd.js", "module": "dist/<%= name %>.es.js" }
詳細代碼請到github查看。
為了保證代碼的健壯性,我們必須進行單元測試。其實我們用generator
生成的腳手架代碼中已經有測試代碼示例了,改成自己的邏輯就可以測試我們的腳手架邏輯了。現在我們來測試下文件是否生成:
'use strict'; const path = require('path'); const assert = require('yeoman-assert'); const helpers = require('yeoman-test'); describe('generator-javascript-plugin:app', () => { beforeAll(() => { return helpers .run(path.join(__dirname, '../generators/app')) .withPrompts({ someAnswer: true }); }); it('creates files', () => { assert.file(['build/rollup.js']); assert.file(['dist']); assert.file(['src']); assert.file(['test']); assert.file(['package.json']); assert.file(['.babelrc']); ... }); });
執行命令
npm test
到此,我們的腳手架開發完了,接下來實際運行下看看是否正確。
由于我們的腳手架還是本地開發,它尚未作為全局 npm 模塊提供。我們可以使用 npm 創建全局模塊并將其符號鏈接到本地模塊。在項目根目錄運行:
npm link
這樣就可以調用yo javascript-plugin
運行腳手架了。你可以在終端看到運行過程。
到此,相信大家對“怎么使用yeoman打造自己的項目腳手架”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。