<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          寫一個自己的vue-cli腳手架

          共 3011字,需瀏覽 7分鐘

           ·

          2021-11-13 01:39

          ? ? ? ?目前在市面上存在很多腳手架,如:create-react-app、vue-cli。我們可以通過一行簡單的命令,就能創(chuàng)建一個基本的項目工程,大大的提高了開發(fā)效率。但是我們會面臨一個問題,除了腳手架幫我們創(chuàng)建好的項目框架,我們的項目總有需要定制化的配置比如我們需要引入我們想要的elementUI框架,引入axios相關的工具類完成http請求等。我們不可能每次開啟新項目都再配置一遍吧,這太勞神費力了。

          ? ? ? 通常我們會搞一個個性化腳手架cli,平時創(chuàng)建項目時通過該腳手架一鍵生成,并同時完成所有需要的配置,以快速開發(fā)。接下來,我們看看怎么搞????

          1.CLI 的運行原理

          • 創(chuàng)建動態(tài)鏈接庫,暴露全局 cli 命令

            如果要暴露一個全局的命令,首先需要在 package.json 文件中編寫一個 bin 命令,當前示例指向bin目錄下的mycli.js文件。

             "bin": "bin/mycli.js"
          • 讀取并解析命令行參數

            讀取命令行參數其實非常簡單,使用 program.argv 獲取

          • 提供用戶可選的配置項

            根據用戶的選擇,創(chuàng)建不同類型的項目模板,比如是否要typescript支持

          • 拷貝自定義模板到本地

            一般我們會事先準備好一個項目模板,供cli下載


          2.創(chuàng)建cli所需要的部分依賴模塊

          • commander實現控制臺命令行問題交互;

          • inquirer?命令行中的 select 選擇器

          • chalk為控制臺輸出的文字著色;

          • download-git-repo拉去github項目代碼;

          • ora實現控制臺進度條樣式;

          • figlet 生成好看的圖標文字

          • lolcatjs 生成隨機顏色


          3.實現腳手架代碼邏輯片段

          3.1 引入所需依賴

          #!/usr/bin/env nodeconst path = require("path");const program = require('commander');//cmd控制臺交互const ora = require('ora');//進度條const chalk = require('chalk');//給提示文案著色const download = require('download-git-repo');//拉取github項目const fs = require('fs');const minimist = require('minimist')//輕量級命令行參數解析引擎const figlet = require("figlet");//酷炫的文字工具const printer = require("@darkobits/lolcatjs");//生成顏色

          3.2創(chuàng)建cli版本和用法命令

          //展示mycli?logoconst logotext = figlet.textSync("my-cli");const logotextColor = printer.fromString(logotext);//提取versionconst?version=`${logotextColor}?${require('../package').version}`;program    .version(version)    .usage(' [options]')

          3.3?從項目模板地址,下載到本地

          我們這里使用了工具類download-git-repo的download方法,大家可以查下相關API

          // 成功和失敗文案著色const success = chalk.blueBright;const error = chalk.bold.red;//地址有多種寫法,這個大家可以查看download-git-repo相關APIconst?templateUrl?=?'github:napoleonjk/tmp-vue3-template#main'//下載到指定目錄,名稱基于用戶輸入的appNameconst dir = path.join(process.cwd(),appName);download(templateUrl, dir, { clone: true }, function (err) {    // 拉取項目代碼    if (!err) {????????//成功的邏輯???????? spinner.succeed(success('拉取成功'));          //更改 package.json 中的 name 和版本號,實現參照后文          changePackage(appName);          spinner.succeed(success('項目初始化成功'));          spinner.succeed(success(`cd ${appName}`));          spinner.succeed(success('npm install && npm run serve'));    } else {????????//失敗的邏輯?????????console.log(err);????????spinner.fail(error('拉取失敗'));    }});

          3.4項目下載完成后,依據用戶輸入,變更項目名和版本號

          //?替換模板package.json文件的name字段const changePackage = (appName) => {    fs.readFile(`${process.cwd()}/${appName}/package.json`, (err, data) => {        if (err) throw err;        let _data = JSON.parse(data.toString());        _data.name = appName;        _data.version = '1.0.0';        let str = JSON.stringify(_data, null, 4);        fs.writeFile(`${process.cwd()}/${appName}/package.json`, str, function (err) {            if (err) throw err;        })    });};


          4.?本地調試 npm 模塊?

          基于bin 命令的配置,將我們的包映射到全局,這樣就可以通過運行模塊名來運行我們的模塊,這跟linux上建立一個軟鏈接差不多,以方便我們在本地測試。

          cd myclinpm link


          5.?看一下各個命令效果

          mycli?-h

          mycli -V

          cd?workspacemycli?init?test-project //多試幾次,有時候git?clone失敗



          想要獲取腳手架mycli源碼,回復mycli即可。


          學無止境,覺得不錯的話,請記得為我關注、點贊、轉發(fā)三連哦!



          瀏覽 47
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日本色情视频网站 | 97操| 久久久久久久久久久久久久久女乱 | 成人AAAAAA片 | 亚洲第一黄 |