И подключение простого веб-приложения к вашему собственному модулю NPM.
У меня очень занятой ум, и мне нравится создавать свои собственные инструменты, которые помогут мне запомнить свои идеи. Я очень быстро забываю свои идеи. Так что мне нужно найти способ написать их где-нибудь как можно скорее и без особых усилий. И поскольку я знаю много людей с той же проблемой, я хотел поделиться своим последним инструментом, который представляет собой приложение с интерфейсом командной строки, и он действительно полезен, поскольку как разработчик программного обеспечения я провожу весь свой день в командной строке. Мне нужно было что-то быстрое, доступное повсюду и что-то, что казалось бы действительно естественным в использовании. Я считаю, что идею нужно писать так, как она приходит нам в голову.
Инструмент представляет собой просто список цитат, куда мы добавляем цитаты или примечания, которые будут отображаться в веб-приложении или просто доступны через наше приложение CLI. Инструмент работает так:
$quotemap add "The whale has a heart bigger than a house."
И это все. Новое предложение будет добавлено в список и появится на веб-странице.
Его действительно легко использовать, поскольку мне не нужно находиться в определенном каталоге для выполнения команды, я могу использовать ту же консоль, над которой я работаю, и записывать свою новую идею, цитату или заметку. По сути, это модуль NPM, глобально установленный на моем компьютере.
Я могу получить свой список цитат следующим образом:
$quotemap getall
А если мне не хватает вдохновения, получи случайный, просто запустив:
$quotemap
В браузере это выглядит так: (Я выбрал несколько цитат здесь, чтобы проиллюстрировать этот пример)
quoteMap, веб-приложение и приложение CLI
Таким образом, мы можем разделить инструмент на две части: приложение с полным стеком, которое представляет собой веб-приложение, и приложение Node CLI.
Для веб-приложения я использовал Node js, MongoDB, Express и React. И я бесплатно развернул его на Heroku, используя MongoDB Atlas для хранения моих данных. Приложение CLI подключается к веб-приложению с помощью Axios. Нам нужно только затронуть наши конечные точки API, а именно:
GET /quotes GET /random-quote POST /add-quote
Вы можете найти полный код веб-приложения на github.com/pierreportal/quotemap.
В будущей версии я, вероятно, не буду использовать развернутое веб-приложение для установления связи между моим приложением CLI и моей базой данных, поскольку на самом деле я не так часто использую визуальную карту.
Создайте собственный пакет NPM
Для приложения CLI мы начинаем с настройки чистой и простой структуры, а затем генерируем файл package.json с помощью npm init. Мы также можем установить два пакета NPM: Chalk, чтобы немного раскрасить наши журналы, и Axios.
$mkdir quotemap && cd quotemap $mkdir bin lib $touch bin/quotemap.js lib/index.js $npm init -y $npm install chalk axios
Наш проект должен выглядеть так:
quotemap/ | |--bin/ | | | --quotemap.js | --lib/ | | | --index.js | --package.js
Мы уже можем добавить эти строки в наш package.json:
... "bin": { "quotemap": "./bin/quotemap.js" }, "preferGlobal": true, ...
Наш полный файл должен выглядеть так:
{ "name": "quotemap", "version": "1.0.0", "description": "", "main": "index.js", "bin": { "quotemap": "./bin/quotemap.js" }, "preferGlobal": true, "directories": { "lib": "lib" }, "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "", "license": "ISC", "dependencies": { "axios": "^0.21.0", "chalk": "^4.1.0", } }
Теперь приступим к написанию нашего модуля. quotemap.js - наш основной скрипт. Это тот, который будет выполняться при запуске наших команд. Поэтому он начинается со строки «#! / Usr / bin / env node».
#! называется шебанг. Это способ выполнения скриптов в Unix. Здесь мы говорим, что наш скрипт должен выполняться с использованием Node js.
#!/usr/bin/env node const script = require("../lib/index.js"); const cmds = process.argv.splice(process.execArgv.length + 2); script.executeCmds(cmds);
мы получаем параметры с помощью «process.argv», затем передаем их функции «executeCmds», записанной в нашем lib / index.js файл.
Теперь для файла index.js…
Начнем с импорта наших пакетов. Также рекомендуется добавить строку, чтобы указать тип данных, ожидаемых нашим скриптом.
/** * @param {string[]} [cmds] */ const axios = require("axios"); const chalk = require("chalk");
Итак, у нас есть три разных «действия». добавление цитаты с помощью команды add ‹quote›, получение всех цитат с помощью getall или получение случайной цитаты без параметров. Я считаю полезным создать объект, в котором ключи - это ключевые слова команды, а значения - функция, которую они вызывают.
const options = { add: (quote) => {}, // axios POST quote to /add-quote getall: () => {} // axios GET /postes };
Здесь мы используем Axios:
const options = { add: (quote) => arg ? axios.post(`${domain}/add-quote`, { quote }) .then(() => yayy(`Your new quote "${quote}" has been successfully added!`)) .catch((err) => oops(err.response.data)) : oops("You forgot the quote!"), getall: () => axios .get(`${domain}/quotes`) .then((res) => listAll(res.data)) .catch((err) => oops(err.response.data)), };
Переменная «домен» - это адрес нашего API / веб-приложения.
И наша основная функция «executeCmds» теперь перенаправит наши команды на нужные функции. Помните, что «cmds» - это массив параметров, например [«add», «Это классная цитата». ] - это параметры из команды $ quotemap add «Это классная цитата». первый параметр - это «действие», а второй - цитата.
const executeCmds = (cmds) => { const [action, arg] = cmds; if (!action) return axios .get(`${domain}/random-quote`) .then((res) => yayy(res.data.quote)) .catch((err) => oops(err.response.data)); return options[action] ? options[action](arg) : oops(`Unnkown command: ${action}`); };
Я вызываю две функции для регистрации сообщений и ответов, yayy и oops, которые предназначены только для форматирования сообщений об успехах и ошибках. Я люблю давать забавные имена своим переменным и функциям при работе над личными проектами, пока они остаются логичными и легко читаемыми.
const oops = (msg) => console.log(chalk.red(`\n🤭 ${msg}`)); const yayy = (msg) => console.log(chalk.blueBright(`\n💫 ${msg}`)); const listAll = (quotes) => quotes.forEach((quote) => yayy(quote.quote));
Наконец, мы можем экспортировать функцию:
exports.executeCmds = executeCmds;
И мы закончили. Теперь мы можем установить наш модуль глобально с помощью:
$npm install -g quotemap
Сейчас я много использую свое приложение CLI. И я буду продолжать улучшать и добавлять функции, делая его простым и очень быстрым в использовании. Я подумываю сделать его доступным, например, с телефона. И добавьте больше конфиденциальности и безопасности. Мне все еще нужно иметь возможность удалять цитаты или редактировать опечатки, но теперь, когда концепция работает, это действительно просто.