<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
當新建專案的時候,我們通常需要設計目錄結構、配各種設定、處理打包編譯,而且每次新建都要重來一遍,或把原來的專案 copy 一份再改改。那能不能自己寫個模板,然後還可以支援個性化自動建立呢?今天我就來和大家一起分享如何客製化一套自己的專案腳手架,提升開發效率。
這裡需要引入腳手架的概念,什麼是腳手架呢?腳手架如同一個專案的模板,可以幫我們快速開始專案,就像 vue-cli,提供一個終端的互動介面讓使用者自定義專案內容。
Yeoman 是一個通用的腳手架系統,允許建立任何型別的應用程式(Web,Java,Python,C#等)。用 yeoman 寫腳手架非常簡單, yeoman 提供了 yeoman-generator 讓我們快速生成一個腳手架模板,我們的主要工作就是把模板檔案寫好。現在我們來用 yeoman 寫一個生成 javascript 外掛的腳手架吧。
腳手架功能:
首先需要全域性安裝 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、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
執行腳手架了。你可以在終端看到執行過程。
寫好的腳手架釋出出去才能讓更多的人使用,釋出腳手架和釋出其他 npm 包一樣。如何釋出?
github 地址
generator-javascript-plugin
這個腳手架已經發布到npm上,可以下載或存取原始碼。
原始碼地址:github.com/greenfavo/g…
以上就是詳解使用yeoman打造自己的專案腳手架的詳細內容,更多關於yeoman專案腳手架的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45