參考鏈接:https://blog.csdn.net/QQ729533020/article/details/99740477
1.為什么要用腳手架?
腳手架能給我們省很多的事情,比如說vue-cli,只需要幾行命令就能創建一個基礎的vue項目。
2.為什么要自定義腳手架?
在公司的時候,看到有大佬自定義了一套直接對接公司主項目的腳手架,能夠直接創建一個微項目和公司的主項目進行對接,並且能夠和公司的所有測試環境進行url對接。類似於這種,傳統的腳手架是無法滿足各個公司的內部需求的,所以需要能夠自定制腳手架。
3.如何創建腳手架?
首先要明白,腳手架是用node搭建的,node中能用的,在腳手架中也能用。
其次要明白,自定義腳手架之前要明白,定義一個腳手架的目的是什么?--為了能給公用的代碼弄一套標准的模板。
最后,開始寫代碼(符合純小白操作)。
第一步(初始化項目):
1.下載node;
2.創建一個新的文件夾(最好路徑全是英文);
3.cmd進入到文件夾目錄運行:npm init (會讓你錄很多參數,剛開始嘗試的時候就一路回車就完事了,最后會在你的文件夾目錄中生成一個package.json文件,文件內容大概如下)
{ "name": "cc", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "xcc", "license": "ISC" }
第二步(進入項目):
1.看到package.json文件中的main參數的值是index.js,也就是項目的起始入口,需要在文件夾中創建一個index.js的文件(這個文件在本文作用不大)
2.修改package.json的配置參數,重點是bin參數,他的作用是在你的npm的目錄下創建一個指令,能夠在cmd任何地方都執行lq命令,執行lq命令可以執行bin目錄下的index.js腳本,代碼如下:
{ "name": "cc", "version": "1.0.0", "description": "", "main": "index.js", "bin":{ "lq":"bin/index.js" } "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "xcc", "license": "ISC" }
3.如上我們新增了bin這個參數,有一個指令lq對應的bin目錄下的index.js,所以我們需要新建一個文件夾bin,並且在bin文件夾下新建一個index.js,大致目錄如下:
4.划重點:index.js的第一行必須加上 #!/usr/bin/env node 否則會報錯,大致意思是用node去運行這個文件吧,不確定我是菜雞。
5.配置好上述的我們就運行一下試試看:在cli這個根目錄下面執行npm link 將lq這個指令注冊到npm目錄中去;再在cmd中運行一下lq,會打印出123就算成功了。
》》》》》》》運行完npm link后,會在你的npm目錄下新增3個文件,一般來說你可以這樣打開npm目錄查看,右擊我的電腦點屬性=》點擊高級系統設置=》點擊環境變量=》點擊path=》找到npm的目錄
第三步(自定義配置):
自定義配置需要用到一些插件,在參考鏈接中那位大佬已經列舉了一些,我就照搬照抄了,但是某些插件的最新版本不能夠require導入,所以注意控制插件的版本,我用的版本如下
"chalk": "^4.0.0", "commander": "^9.0.0", "download-git-repo": "^3.0.2", "inquirer": "^8.2.1", "log-symbols": "^3.0.0", "ora": "^5.4.1"
index.js的內容如下:
#!/usr/bin/env node const program = require("commander"); //用於捕獲命令 const chalk = require("chalk"); //用於字體加色 const download = require("download-git-repo"); //用於下載git的包 const inquirer = require("inquirer"); //用於與用戶輸入做交互 const ora = require("ora"); //進度顯示 const symbols = require("log-symbols"); //信息前面加✔或✖ console.log(chalk.green("hello,cli!")); console.log(symbols.success, chalk.green("SUCCESS")); console.log(symbols.error, chalk.green("ERROR")); // const proce = ora("正在下載模板") // //開始下載 // proce.start() // //下載失敗調用 // proce.fail() // //下載成功調用 // proce.succeed() program .version(require("../package").version, "-v,--version") .command("init <name>") .action((name) => { inquirer .prompt([ { type: "input", name: "authore", message: "請輸入你的名字", }, { type: "input", name: "authore1", message: "測試", }, ]) .then((answers) => { download( "direct:http://......./project-demo.git", "ceshi", { clone: true }, function (err) { if (err) { console.log(err); } else { console.log(symbols.success, chalk.green("創建項目成功")); } } ); }); }); program.parse(process.argv);
在.then后面寫自定義的邏輯,比如說,微項目的話,在.then中調用接口將主項目的url和子項目的目錄接口進行綁定,然后download下載自己公司基礎項目的框架,比如說封裝的各種模塊,插件之類的。每一步都自己嘗試一下,更詳細的步驟請見參考鏈接,那位大佬將所有詳細步驟都指點出來了,本文僅是我踩坑的記錄。