Вопрос интервью от группы WeChat г-на Ситу Чжэнмэя

внешний интерфейс
Вопрос интервью от группы WeChat г-на Ситу Чжэнмэя

предисловие

Теперь есть файл aaa.js, в котором есть следующие операции: предложить пользователю ввести имя проекта из терминала, затем прочитать его, создать этот каталог в текущем каталоге и сгенерировать package.json с двумя зависимостями. Чтобы установить react react-dom через npm i, в конце терминал уведомит вас о завершении установки. Разрешить пользователю выполнять узел aaa и ввести имя проекта только один раз, чтобы завершить эти операции.

Вышеупомянутое содержание является вопросом интервью, отправленным г-ном Ситу Чжэнмеем в группе WeChat.

К раскрытию темы предъявляются следующие требования:

  1. Получить ввод пользовательского терминала

  2. Создать папку ввода пользователя

  3. генерироватьpackage.jsonдокумент

  4. npm iУстановитьreactтак же какreact-dom

  5. Уведомить пользователя о завершении установки зависимостей

В соответствии с вышеуказанными требованиями для достижения

Получить ввод пользовательского терминала

Есть много способов получить ввод пользователя с терминала.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Выполнять после окончания, так что с этим проблем нет.

кодовый адрес гитхаба

Суммировать

  1. Приведенный выше код действителен для узла 8.9.4 в среде Mac, другие среды не тестировались.

  2. Этого мне точно мало, чтобы писать голышом наповал.Я написал это, листая документ.