實(shí)現(xiàn)vue-cli(三):vue-cli問(wèn)詢和拷貝

一驾讲、vue-cli的簡(jiǎn)單實(shí)現(xiàn)

  1. 新建一個(gè)vue-cli-sample的文件夾益眉,該文件夾下打開(kāi)命令行,輸入yarn init生成package.json文件缸逃。
  2. package.json文件中新增一行"bin": "cli.js"指定cli.js作為入口文件吏饿。
  3. 新建cli.js文件春寿,第一行寫(xiě)入#!/usr/bin/env node步脓。因?yàn)镹ode cli應(yīng)用入口文件必須有這樣的文件頭堡僻,如果是linux或者macOS系統(tǒng)還需要通過(guò)命令行輸入chomd 755 cli.js修改讀寫(xiě)權(quán)限钥平。
  4. 命令行輸入yarn add inquirer ejs --dev安裝用戶問(wèn)詢模塊和模板渲染引擎实撒。
  5. cli.js文件里寫(xiě)入以下代碼姊途。
#!/usr/bin/env node

// 1、先詢問(wèn)用戶信息
// 2知态、指定模板路徑和生成路徑
// 3捷兰、讀取模板文件,生成對(duì)應(yīng)文件
const fs = require('fs');
const path = require('path');
const inquirer = require('inquirer');
const ejs = require('ejs');

// 在命令行詢問(wèn)用戶輸入信息
inquirer.prompt([
  {
    type: 'input',
    name: 'name', // 用戶輸入內(nèi)容賦值給name
    message: 'Project name?', // 控制臺(tái)顯示提示語(yǔ)
  }
])
.then(anwsers => { // aswers為命令行用戶輸入的信息
  const tmplDir = path.join(__dirname, 'templates');
  const destDir = process.cwd(); // 當(dāng)前命令行所在的目錄下

  // 將模板下的文件全部轉(zhuǎn)換到目標(biāo)目錄
  fs.readdir(tmplDir, (err, files) => {
    if (err) throw err;
    files.forEach(file => {
      // 通過(guò)ejs模板引擎渲染文件
      ejs.renderFile(path.join(tmplDir, file), anwsers, (err, result) => {
        if (err) throw err;

        // 將結(jié)果寫(xiě)入目標(biāo)文件路徑
        fs.writeFileSync(path.join(destDir, file), result);
      });
    });
  });
});
  1. 在當(dāng)前目錄下新建templates目錄负敏,放入一個(gè)test.js文件贡茅,文件內(nèi)容<%= name %>指定用ejs語(yǔ)法填充數(shù)據(jù)。
  2. 命令行輸入yarn link將當(dāng)前vue-cli-sample(項(xiàng)目名)鏈接到全局其做。
  3. 新建空文件夾顶考,該文件夾下打開(kāi)命令行輸入剛才鏈接的項(xiàng)目名vue-cli-sample即可執(zhí)行該模塊。然后按提示輸入名字假設(shè)為test回車妖泄,會(huì)看到該空文件夾生成了test.js內(nèi)容為test驹沿,則代表成功。

二蹈胡、優(yōu)化

將上面templates文件夾里的內(nèi)容替換成我們前兩步(實(shí)現(xiàn)vue-cli(一):gulp自動(dòng)化構(gòu)建渊季、實(shí)現(xiàn)vue-cli(二):webpack實(shí)現(xiàn)項(xiàng)目打包)生成的 gulpfile.js、webpack配置內(nèi)容和項(xiàng)目?jī)?nèi)容罚渐。此時(shí)vue-cli自動(dòng)生成的不止一兩個(gè)文件却汉,文件多了會(huì)有幾個(gè)問(wèn)題,我們分別解決下搅轿。

  1. fs.readdir只會(huì)讀取一層目錄病涨,如果templates里有很多子目錄,則ejs渲染目錄會(huì)失敗璧坟。我們用fs.stat方法增加個(gè)類型檢測(cè)既穆,如果是文件夾則繼續(xù)遍歷。
  2. 遍歷到新文件夾還要?jiǎng)?chuàng)建雀鹃,不然最后生成文件會(huì)找不到文件夾幻工。用yarn add mkdirp --dev添加對(duì)應(yīng)插件。
  3. 圖片等文件是不需要用ejs進(jìn)行渲染的黎茎,否則可能會(huì)錯(cuò)誤地把<%=解析成填充內(nèi)容囊颅,此處判斷為圖片就直接copy。
#!/usr/bin/env node

// 1傅瞻、先詢問(wèn)用戶信息
// 2踢代、指定模板路徑和生成路徑
// 3、讀取模板文件嗅骄,生成對(duì)應(yīng)文件
const fs = require('fs');
const path = require('path');
const inquirer = require('inquirer');
const ejs = require('ejs');
const mkdirp = require('mkdirp');

// 在命令行詢問(wèn)用戶輸入信息
inquirer.prompt([
  {
    type: 'input',
    name: 'name',
    message: 'Project name?'
  }
])
.then(anwsers => { // aswers為命令行用戶輸入的信息
  const tmplDir = path.join(__dirname, 'templates');
  const destDir = process.cwd();

  // 將模板下的文件全部轉(zhuǎn)換到目標(biāo)目錄
  const handleFiles = (dir, rootDir) => {
    fs.readdir(dir, (err, files) => {
      if (err) throw err;
      files.forEach(file => {
        let filePath = path.resolve(dir, file);
        let targetPath = path.join(destDir, path.relative(rootDir, filePath));
        fs.stat(filePath, (err, stats) => {
          if (err) throw err;
  
          if (stats.isDirectory()) {
            mkdirp(targetPath).then(() => {
              handleFiles(filePath, rootDir);
            });
            return;
          }
          if (stats.isFile()) {
            // 如果是圖片則直接copy不需要ejs渲染胳挎,不然文件中帶有<%可能會(huì)出錯(cuò)
            if (/\.jpg$|\.gif$|\.png$|\.ico$/.test(filePath)) {
              fs.copyFileSync(filePath, targetPath);
              return;
            }
            // 通過(guò)模板引擎渲染文件
            ejs.renderFile(filePath, anwsers, (err, result) => {
              if (err) throw err;
  
              // 將結(jié)果寫(xiě)入目標(biāo)文件路徑
              fs.writeFileSync(targetPath, result);
            });
          }
        });
      });
    });
  }

  handleFiles(tmplDir, tmplDir);
});

最后,在空文件夾命令行執(zhí)行vue-cli-sample自動(dòng)生成對(duì)應(yīng)資源溺森,然后yarn install安裝依賴包慕爬,執(zhí)行yarn gulp develop打開(kāi)瀏覽器頁(yè)面正常即代表成功窑眯。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市医窿,隨后出現(xiàn)的幾起案子磅甩,更是在濱河造成了極大的恐慌,老刑警劉巖姥卢,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件卷要,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡隔显,警方通過(guò)查閱死者的電腦和手機(jī)却妨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門饵逐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)括眠,“玉大人,你說(shuō)我怎么就攤上這事倍权≈啦颍” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵薄声,是天一觀的道長(zhǎng)当船。 經(jīng)常有香客問(wèn)我,道長(zhǎng)默辨,這世上最難降的妖魔是什么德频? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮缩幸,結(jié)果婚禮上壹置,老公的妹妹穿的比我還像新娘。我一直安慰自己表谊,他們只是感情好钞护,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著爆办,像睡著了一般难咕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上距辆,一...
    開(kāi)封第一講書(shū)人閱讀 49,046評(píng)論 1 285
  • 那天余佃,我揣著相機(jī)與錄音,去河邊找鬼跨算。 笑死爆土,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的漂彤。 我是一名探鬼主播雾消,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼灾搏,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了立润?” 一聲冷哼從身側(cè)響起狂窑,我...
    開(kāi)封第一講書(shū)人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎桑腮,沒(méi)想到半個(gè)月后泉哈,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡破讨,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年丛晦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片提陶。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡烫沙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出隙笆,到底是詐尸還是另有隱情锌蓄,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布撑柔,位于F島的核電站瘸爽,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏铅忿。R本人自食惡果不足惜剪决,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望檀训。 院中可真熱鬧柑潦,春花似錦、人聲如沸肢扯。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蔚晨。三九已至乍钻,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間铭腕,已是汗流浹背银择。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留累舷,地道東北人浩考。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像被盈,于是被迫代替她去往敵國(guó)和親析孽。 傳聞我的和親對(duì)象是個(gè)殘疾皇子搭伤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

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