Симулятор разработки: приложение для заметок (часть 2)
Продолжаем вести наш проект и разрабатывать приложение для заметок. В предыдущей части мы определились с требованиями, базовыми прототипами и архитектурой, а так же сделали доску с задачами для нашего проекта.
Сегодня нам предстоит спланировать этапы, которые будут отвечать за то, в какой последовательности мы будем что-то разрабатывать или настраивать + начнем работать с кодом, мы то знаем, что это самая кайфовая часть)
Давайте посмотрим на то, как выглядит наша доска с задачами в данный момент:
Задача, которая сформулирована как "Создать каркас приложения" - не особо то понятна, помните, что при виде задачи, вы должны с легкостью себе ответить на вопросы:
Определяемся, что нужно для старта
И так, для начала нет смысла смотреть на функциональные требования, которые мы с вами определили в прошлой статье, так как у нас еще нет настроенного окружения, где бы мы могли с вами все разрабатывать, поэтому для начала определим задачи, которые помогут нам получить это окружение.
Что нужно чтобы сделать фронтовой проект? Ну, давайте подумаем...
- Создать базовый проект и очистить его от всего ненужного (банальный
create-react-app
) - Определиться со стайлингом и настроить автоматическое исправление
- Определиться со структурой папок, чтобы не было хаоса
- Настроить коннект с git
Пакеты все пачкой ставить не будем, лучше этим заниматься по мере необходимости!
И так, после подобных раздумий наша доска проекта выглядит уже примерно следующим образом:
Создаем базовый проект и зачищаем ненужное
Приступаем к первой задаче, просто создадим наше приложение:
yarn create react-app note-app --template typescript
Чтобы у нас не было ничего лишнего, удалим все из папки src, кроме index.tsx, index.css и App.tsx, причем в index.tsx оставим только вот это:
import React from 'react'; import ReactDOM from 'react-dom/client'; import App from './App'; import './index.css'; const root = ReactDOM.createRoot(document.getElementById('root') as HTMLElement); root.render( <React.StrictMode> <App /> </React.StrictMode>, );
import React from 'react'; const App = () => { return <div>App</div>; }; export default App;
А в папке public/ оставим только
Настраиваем eslint
Не знаю как вам, но мне уже не комфортно работать в проекта, где нет базовой настройки для поддержания чистого код стайла, поэтому давайте супер быстро выполним простую настройку и пойдем дальше!
Для начала поставим необходимые зависимости для eslint:
yarn add -D eslint-plugin-import @typescript-eslint/parser eslint-import-resolver-typescript
После чего произведем инициализацию:
npx eslint --init
Отвечаем на вопросы в консоли примерно вот так:
How would you like to use ESLint?
-> To check syntax and find problems
What type of modules does your project use?
-> JavaScript modules (import/export)
Which framework does your project use?
Does your project use TypeScript?
Where does your code run?
What format do you want your config file to be in?
Would you like to install them now?
Which package manager do you want to use?
После этого нужно будет внести некоторые изменения в .eslintrc.json чтобы внести немного своих правил + чтобы у нас не было дальше конфликта с prettier, итоговый файл выглядит вот так:
{ "env": { "browser": true, "es2021": true, "node": true, "jest": true }, "extends": [ "eslint:recommended", "plugin:react/recommended", "plugin:@typescript-eslint/recommended", "prettier" ], "overrides": [], "parser": "@typescript-eslint/parser", "parserOptions": { "ecmaVersion": "latest", "sourceType": "module" }, "plugins": [ "react", "react-hooks", "@typescript-eslint", "prettier" ], "rules": { "react/react-in-jsx-scope": "off", "spaced-comment": "error", "quotes": ["error", "single"], "no-duplicate-imports": "error" }, "settings": { "import/resolver": { "typescript": {} } } }
Настраиваем prettier
Устанавливаем необходимые зависимости:
yarn add -D prettier eslint-config-prettier eslint-plugin-prettier eslint-plugin-react-hooks
И создаем файл .prettierrc.json:
{ "semi": true, "tabWidth": 2, "printWidth": 100, "singleQuote": true, "trailingComma": "all", "jsxSingleQuote": true, "bracketSpacing": true }
И так, на этом настройка утилит закончена, осталось только добавить новые скрипты в package.json:
"lint": "eslint src/**/*.{js,jsx,ts,tsx,json}", "lint:fix": "eslint --fix 'src/**/*.{js,jsx,ts,tsx,json}'", "format": "prettier --write 'src/**/*.{js,jsx,ts,tsx,css,md,json}' --config ./.prettierrc"
Структура папок
Для крупного приложения сложно с самого начала продумать хорошую структуру хранения кода, но основу заложить стоит, чтобы команда, которая состоит из нескольких разработчиков не писала как кому придет в голову.
И так, я предлагаю придерживаться в нашем проекте вот такой структуры:
-src/ ----components/ ------App/ --------index.ts --------component.tsx --------test.tsx ------- style.css ------Sidebar/ --------index.ts --------component.tsx --------test.tsx ------- style.css ------... ----hooks/ ----context/ ----typings/ ----configs/ ----services/ ------Database/ --------index.ts --------service.ts --------test.ts
components/
- для хранения компонент нашего приложенияhooks/
- для общих хуков, которые используются в разных местахcontext/
- для описание различных контекстов приложенияtypings/
- для описание типов в приложенииconfigs/
- для хранения различных кончиков (например, роутинг)services/
- для описание различных утилит, которые пригодятся нам при работе
Данная структура, возможно, не является оптимальной, да и для большого проекта скорее всего не подойдет, но скорее всего достаточно хорошо ляжет на наш простой проект с заметками.
Если у вас есть свои идеи по структуре файлов, то жду ваши комментарии)
Следующая задача - подключение к Git, думаю, это достаточно простое действие, так что описывать не буду, гайдов на эту тему очень много...
Приступаем к планированию разработки
Для начала давайте вспомним формальные требования, которые мы составили в прошлый раз:
Необходимо создать приложение Заметки с помощью Reactjs и технологий браузеров.
Возможные действия с заметками:
- Создать (нажимаем на кнопку создать, открывается markdown редактор на ввод)
- Редактировать (чтобы редактировать заметку нужно открыть нужную заметку и нажать на отдельную кнопку для редактирования)
- Удалить (чтобы удалить заметку нужно открыть нужную заметку и нажать на отдельную кнопку для удаления, после чего нужна остерегающая модалка)
Сохранение изменений в заметке должно происходить автоматически с внесением этих изменений.
Если подумать, то нужно сделать примерно следующие задачи:
- Настроить навигацию, чтобы иметь возможность перемещаться между заметками
- Подключить базу данных
- Настроить общий контекст
- Отображение списка существующих заметок
- Открытие текста определенной заметки
- Создание простой текстовой заметки
- Удаления заметки
- Редактирование заметки
- Поиск по списку заметок
- Отображение заметки в виде отрендеренного Markdown
- Что-то еще?
Возможно, сейчас я что-то упустила, но мы это с вами обнаружим в ходе работы, если что!
Унесите эти задачи себе на доску проекта, чтобы ничего не потерять!
На этой стадии проекта мы сегодня закончим, в следующий раз мы уже приступим к написанию кода!
Если вам интересен такой формат разора работы над проектом, то очень жду ваших реакций и комментариев!
🤖 Чтобы не пропустить новые уроки подпишись на телеграм канал!