前端腳手架工具

1. 腳手架介紹

1. 腳手架的本質(zhì)作用

創(chuàng)建項目基礎(chǔ)結(jié)構(gòu)、提供項目規(guī)范和約定

約定:

  • 相同的組織結(jié)構(gòu)
  • 相同的開發(fā)范式
  • 相同的模塊依賴
  • 相同的工具配置
  • 相同的基礎(chǔ)代碼

eg: 舉個例子

IDE 創(chuàng)建項目的過程就是一個腳手架的工作流程

例如iOS項目在使用XCode的新建項目時而线,選擇好選項點擊創(chuàng)建流昏,最后生成的項目文件及目錄就是一個腳手架的執(zhí)行結(jié)果

前端腳手架

  1. 腳手架的作用
  2. 常用的腳手架工具
  3. 通用腳手架工具剖析
  4. 開發(fā)一款腳手架
常用的腳手架工具
  1. React項目 -> create-reace-app
  2. Vue項目 -> vue-cli
  3. Angular項目 -> angular-cli

都是根據(jù)信息創(chuàng)建對應(yīng)的項目基礎(chǔ)結(jié)構(gòu)

還有通用型

  1. Yeoman 根據(jù)一套模板生成一個對應(yīng)的項目結(jié)構(gòu)
  2. Plop 項目開發(fā)過程中用于生成特定類型的文件
    • 例如創(chuàng)建一個組件 / 模塊所需要的文件

2. 腳手架的工作原理

2. Yeoman、Generator

Yeoman

The web's scaffolding tool for modern webapps

1. Yeoman的基本使用

  • 在全局范圍安裝yo
npm install yo --global
# 或者
yarn global add yo
  • 安裝對應(yīng)的generator

github.com/yeoman/generator-node

npm install generator-node --global
# 或者
yarn global add generator-node
  • 通過yo運行generator

cd path/to/project-dir

mkdir my-module

yo node

2. Yeoman (Sub Generator)

子集生成器

yo node:cli

# 為了執(zhí)行該模塊命令可以如下操作
npm link
[module_name] --help # 查看一下

3. 常規(guī)使用步驟

  1. 明確你的需求;
  2. 找到合適的Generator;
  3. 全局范圍安裝找到的Generator;
  4. 通過Yo運行對應(yīng)的Generator;
  5. 通過命令行交互填寫選項;
  6. 生成你所需要的項目結(jié)構(gòu);

4. 自定義 Generator

基于Yeoman搭建自己的腳手架

4.1 創(chuàng)建Generator模塊

Generator 本質(zhì)上就是一個NPM模塊

  • Generator 基本結(jié)構(gòu)

模塊名稱必須是 generator-<name>

# 1. 創(chuàng)建
mkdir generator-sample

# 2. 進入
cd generator-sample

# 3. 創(chuàng)建身份證
npm init

# 4. 安裝 yeoman-generator (生成器的基類)
npm i yeoman-generator

// 目錄結(jié)構(gòu)
// generators/app/index.js
// 在index.js當(dāng)中
module.exports = class extends Generator {
  writing() {
    // Yeoman 自動在生成文件階段調(diào)用此方法
    // 我們這里嘗試往項目目錄中寫入文件
    this.fs.write(
      this.destinationPath('temp.txt'),
      Math.random().toString()
    )
  }
}
  • 將該模塊link到全局 npm link
  • 進入到新目錄(腳手架創(chuàng)建的新項目) 執(zhí)行yo sample

4.2 根據(jù)模板創(chuàng)建文件

模板文件夾 templates

// 創(chuàng)建模板文件夾  templates
writing() {
    // Yeoman 自動在生成文件階段調(diào)用此方法

    // 通過模板方式寫入文件到目標目錄
    // 1. 模板文件路徑
    const tmpl = this.templatePath('foo.txt')
    // 2. 輸出目標路徑
    const output = this.destinationPath('foo.txt')
    // 3. 模板數(shù)據(jù)上下文
    const context = { title: 'Hello zce~', success: false }

    this.fs.copyTpl(tmpl, output, context)
  }
  • 相對于手動創(chuàng)建每一個文件吞获,模板的方式大大提高了效率

4.3 接收用戶輸入

prompting() {
    // Yeoman 在詢問用戶環(huán)節(jié)會自動調(diào)用此方法
    // 在此方法中可以調(diào)用父類的 prompt() 方法發(fā)出對用戶的命令詢問
    return this.prompt([
      {
        type: 'input', // 用戶輸入的方式
        name: 'name', // 得到結(jié)果的鍵
        message: 'Your project name', // 給用戶的提示
        default: this.appname // appname 為項目生成目錄的文件夾的名稱
      }
    ]).then(answers => {
      // answers = { name: 'user input value' }
      this.answers = answers
    })
  }

4.4 Vue Generator案例

  • 示例代碼
prompting() {
        return this.prompt([
            {
                type: 'input',
                name: 'projectName',
                message: 'Your project name',
                default: this.appname
            }
        ]).then(answers => {
            this.answers = answers
        })
    }

    writing() {
        const templates = [
            '.browserslistrc',
            '.editorconfig',
            '.eslintrc.js',
            '.gitignore',
            'babel.config.js',
            'package.json',
            'README.md',
            'tsconfig.json',
            'public/favicon.ico',
            'public/index.html',
            'src/assets/logo.png',
            'src/components/HelloWorld.vue',
            'src/store/index.ts',
            'src/App.vue',
            'src/main.ts',
            'src/shims-tsx.d.ts',
            'src/shims-vue.d.ts',
            'tests/unit/example.spec.ts'

        ]

        templates.forEach(item => {
            this.fs.copyTpl(
                this.templatePath(item),
                this.destinationPath(item),
                this.answers
            )
        })
    }

4.5 發(fā)布 Generator

3. Plop

Plop

一個小而美的腳手架工具况凉;
創(chuàng)建項目中特定類型文件的小工具;
類似于Yeoman的Sub Generator

  • 舉例:比如說react項目中 每次創(chuàng)建一個頁面時需要有3個文件
    • Header.css
    • Header.js
    • Header.test.js
  • 可以將這個封裝成一個模板

1. Plop 的具體使用

  • 在根目錄下創(chuàng)建 plopfile.js 文件各拷,需要導(dǎo)出一個函數(shù)刁绒,接收一個 plop 對象
  • 創(chuàng)建模板文件夾plop-templates/xxxxx.hbs
```javascript
// 模板文件舉例

import React from 'react'

export default () => {
    <div className="{{name}}">
        <h1>{{name}}</h1>
    </div>
}


module.exports = plop => {
    // arg1 生成器的名稱
    // arg2 配置選項
    plop.setGenerator('component', {
        description: 'create a compoent', // 描述
        // 命令交互
        prompts: [
            {
                type: 'input',
                name: 'name', // 鍵
                message: 'component name', // 問題描述
                default: 'MyComponent', // 默認值
            }
        ],
        actions: [
            {
                type: 'add', // 代表添加文件
                path: 'src/components/{{name}}/{{name}}.js',
                templateFile: 'plop-templates/components.hbs'
            }
        ]
    })
}
  • 執(zhí)行
yarn plop component  # (component是生成器的名稱)

總結(jié):

使用plop的步驟

  1. plop 模塊作為項目開發(fā)依賴安裝
  2. 在項目根目錄下創(chuàng)建一個 plopfile.js 文件
  3. plopfile.js 文件中定義腳手架任務(wù)
  4. 編寫用于生成特定類型文件的模板
  5. 通過 Plop 提供的 CLI 運行腳手架任務(wù)

4. 腳手架的工作原理

使用nodejs創(chuàng)建一個腳手架

npm init
  • pagkage.json中添加一個 "bin": "cli.js"

  • cli.js 內(nèi)

#!/usr/bin/env node

// Node CLI 應(yīng)用入口文件必須 要有這樣的文件頭
// 如果是 Linux 或者 macOS 系統(tǒng)下還需要修改此文件的讀寫權(quán)限為 755

console.log('cli working!')
// scaffolding-cli


// 腳手架的工作過程:
// 1. 通過命令行交互詢問用戶問題
// 2. 根據(jù)用戶回答的結(jié)果生成文件
// 使用 inquirer

const fs = require('fs')
const path = require('path')
const inquirer = require('inquirer')
const ejs = require('ejs')

inquirer.prompt([
  {
    type: 'input',
    name: 'projectName',
    message: 'Project name',
    default: 'scaffolding-cli'
  }
]).then(answers => {
  console.log(answers)


  // 模板目錄
  const tempDir = path.join(__dirname, 'templates')
  // 目標目錄
  const destDir = process.cwd()

  // 將模板下的文件全部輸出到目標目錄
  fs.readdir(tempDir, (err, files) => {
    if (err) throw err;

    files.forEach(file => {
      // console.log(file)
      // 通過模板引擎渲染文件
      ejs.renderFile(
        path.join(tempDir, file),
        answers,
        (err, result) => {
          if (err) throw err;

          // 將結(jié)果寫入目標目錄
          fs.writeFileSync(path.join(destDir, file), result)
        }
      )
    })
  })

})



?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市烤黍,隨后出現(xiàn)的幾起案子知市,更是在濱河造成了極大的恐慌,老刑警劉巖速蕊,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嫂丙,死亡現(xiàn)場離奇詭異,居然都是意外死亡规哲,警方通過查閱死者的電腦和手機跟啤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人隅肥,你說我怎么就攤上這事竿奏。” “怎么了腥放?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵泛啸,是天一觀的道長。 經(jīng)常有香客問我秃症,道長候址,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任种柑,我火速辦了婚禮岗仑,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘莹规。我一直安慰自己赔蒲,他們只是感情好泌神,可當(dāng)我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布良漱。 她就那樣靜靜地躺著,像睡著了一般欢际。 火紅的嫁衣襯著肌膚如雪母市。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天损趋,我揣著相機與錄音患久,去河邊找鬼。 笑死浑槽,一個胖子當(dāng)著我的面吹牛蒋失,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播桐玻,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼篙挽,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了镊靴?” 一聲冷哼從身側(cè)響起铣卡,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎偏竟,沒想到半個月后煮落,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡踊谋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年蝉仇,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡量淌,死狀恐怖骗村,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情呀枢,我是刑警寧澤胚股,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站裙秋,受9級特大地震影響琅拌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜摘刑,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一进宝、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧枷恕,春花似錦党晋、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至胡控,卻和暖如春扳剿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背昼激。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工庇绽, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人橙困。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓瞧掺,卻偏偏與公主長得像,于是被迫代替她去往敵國和親凡傅。 傳聞我的和親對象是個殘疾皇子辟狈,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容