前言
現(xiàn)在有一個aaa.js文件裕寨,它里面有如下操作,從終端提示用戶輸入一項(xiàng)目名派继,然后讀取下宾袜,在當(dāng)前目錄下,創(chuàng)建這目錄驾窟,并且生成一個package.json,里面有兩個依賴庆猫。要通過npm i安裝react react-dom;最后終端通知你安裝完畢。 只允許用戶執(zhí)行一次node aaa與輸入項(xiàng)目名绅络,完成這些操作
以上內(nèi)容時司徒正美老師在一個微信群里發(fā)的一道面試題月培。
分解一下題目有如下要求:
獲取用戶終端輸入
創(chuàng)建用戶輸入文件夾
生成
package.json
文件npm i
安裝react
以及react-dom
通知用戶依賴安裝完成
根據(jù)以上要求分別來實(shí)現(xiàn)
獲取用戶終端輸入
獲取用戶的終端輸入這個可以有好多種方法來實(shí)現(xiàn),可以用 fs.readSync
+ process.stdin
來實(shí)現(xiàn)昨稼,也可以用 readline.question
节视,以上都是node原生模塊拳锚,也可以用inquirer
這第三方庫(這個庫很強(qiáng)大假栓,可以實(shí)現(xiàn)各種姿勢的終端用戶交互)。此處情況沒有那么復(fù)雜霍掺,我是直接使用的readline.question
來實(shí)現(xiàn)的匾荆,貼代碼:
// 獲取用戶輸入
const getUserInput = inputTip => {
const myReadline = readline.createInterface({
input: process.stdin,
output: process.stdout
});
return new Promise((resolve, reject) => {
myReadline.question(inputTip, answer => {
myReadline.close();
resolve(answer);
});
});
};
這個沒啥說的,直接不是很復(fù)雜杆烁,readline.question
文檔牙丽。
創(chuàng)建用戶輸入文件夾
創(chuàng)建文件夾,這個是涉及到終端執(zhí)行shell命令mkdir
兔魂,這里我是用child_process.exec
來實(shí)現(xiàn)的烤芦,這個模塊可以
Spawns a shell then executes the command within that shell, buffering any generated output. The command string passed to the exec function is processed directly by the shell and special characters (vary based on shell) need to be dealt with accordingly:
所以代碼很簡單了,直接exec('mkdir test', (error, stdout, stderr) => {})
析校。
這里有一點(diǎn)要注意的是當(dāng)前目錄下文件夾是否已經(jīng)存在构罗。這里要稍微處理下铜涉,先使用fs.readdirSync
獲取當(dāng)前目錄下的所有文件以及文件夾列表,然后使用fs.statSync
得到當(dāng)前目錄下的文件夾列表遂唧,對比用戶的輸入給出相應(yīng)提示芙代。
// 獲取當(dāng)前目錄下的文件夾列表
const getDirNameList = path => {
let allList = fs.readdirSync(path);
let dirList = [];
allList.forEach(item => {
if (fs.statSync(item).isDirectory()) {
dirList.push(item);
}
});
return dirList;
};
生成 package.json
文件
可以用npm init
來生成,也可以fs.writeFileSync
直接寫文件盖彭,我是直接寫的纹烹,代碼如下:
const generatePackageJsonFile = projectName => {
const packageJSON = JSON.stringify(
{
"name": projectName,
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"dependencies": {
"react": "^16.2.0",
"react-dom": "^16.2.0"
}
}
);
fs.writeFileSync(`./${projectName}/package.json`, packageJSON);
};
npm i
安裝 react
以及 react-dom
由于package.json里已經(jīng)將依賴寫入了,所以這里直接exec
執(zhí)行npm i
即可
通知用戶依賴安裝完成
exec
執(zhí)行的回調(diào)會在npm i
結(jié)束之后執(zhí)行召边,所以這個沒有什么問題铺呵。
github代碼地址
總結(jié)
以上代碼在mac環(huán)境下node 8.9.4運(yùn)行有效,其他環(huán)境未測試隧熙。
這個讓我現(xiàn)場裸寫肯定不行陪蜻,我是一邊翻文檔一邊寫的。
感謝您的閱讀贱鼻,本文由 趙的拇指 版權(quán)所有宴卖。原文地址: https://www.zhaofinger.com/detail/23