предисловие
Теперь есть файл aaa.js, в котором есть следующие операции: предложить пользователю ввести имя проекта из терминала, затем прочитать его, создать этот каталог в текущем каталоге и сгенерировать package.json с двумя зависимостями. Чтобы установить react react-dom через npm i, в конце терминал уведомит вас о завершении установки. Разрешить пользователю выполнять узел aaa и ввести имя проекта только один раз, чтобы завершить эти операции.
Вышеупомянутое содержание является вопросом интервью, отправленным г-ном Ситу Чжэнмеем в группе WeChat.
К раскрытию темы предъявляются следующие требования:
-
Получить ввод пользовательского терминала
-
Создать папку ввода пользователя
-
генерировать
package.json
документ -
npm i
Установитьreact
так же какreact-dom
-
Уведомить пользователя о завершении установки зависимостей
В соответствии с вышеуказанными требованиями для достижения
Получить ввод пользовательского терминала
Есть много способов получить ввод пользователя с терминала.fs.readSync
+ process.stdin
для достижения, вы также можете использоватьreadline.question
, все вышеперечисленные модули являются собственными узлами, вы также можете использоватьinquirer
Это сторонняя библиотека (эта библиотека очень мощная и может реализовать взаимодействие с конечным пользователем различными жестами). Здесь ситуация не такая сложная, я использую ее напрямуюreadline.question
Для достижения вставьте код:
// 获取用户输入
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);
});
});
};
Об этом и говорить нечего, в этом нет ничего сложного.readline.question
Документация.
Создать папку ввода пользователя
Создайте папку, это связано с терминалом, выполняющим команды оболочкиmkdir
, здесь я используюchild_process.exec
Для этого этот модуль может
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) => {})
. Здесь следует отметить, существует ли уже папка в текущем каталоге. Здесь нужно немного разобраться, первое использованиеfs.readdirSync
Получите список всех файлов и папок в текущем каталоге, затем используйтеfs.statSync
Получите список папок в текущем каталоге и сравните ввод пользователя, чтобы дать соответствующие подсказки.
// 获取当前目录下的文件夹列表
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, то вот прямоеexec
воплощать в жизньnpm i
Только что
Уведомить пользователя о завершении установки зависимостей
exec
Выполненный обратный вызов будет вnpm i
Выполнять после окончания, так что с этим проблем нет.
кодовый адрес гитхаба
Суммировать
-
Приведенный выше код действителен для узла 8.9.4 в среде Mac, другие среды не тестировались.
-
Этого мне точно мало, чтобы писать голышом наповал.Я написал это, листая документ.