• Stars
    star
    104
  • Rank 330,604 (Top 7 %)
  • Language
    JavaScript
  • Created almost 5 years ago
  • Updated almost 3 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

How I would pick tools for a full-stack application in 2020 🤔🛠️🏗️🥞🌐🕸️📝2️⃣0️⃣2️⃣0️⃣

Below are my thoughts on how I would pick a stack for a web development in 2020. I value mature technologies, size of the community, "batteries included" and speed of the development.

I personally use VSCode editor, again because it's very popular these days which leads to lots of problems being solved in form of questions asked, plugins shipped and bugs fixed. One decent alternative is PyCharm/WebStorm.

Frontend

Frontend framework [React with Hooks]

React or Vue?

Why switching from React (the de-facto standard and #1) if Vue has similar metrics and less ecosystem? For instance, Vue has no mainstream Monaco wrapper. Also, React Native is fun and mature.

If you haven't worked with React since React Hooks emerged, you should totally catch up on that:

Other things to look at:

Bundler config and boilerplate [Create React App]

Webpack? Parcel? Create React App? Next.js? Gatsby?

Nano React App: https://hackernoon.com/create-react-app-is-way-too-bloated-5db07c3511

If project can't benefit from server-side rendering or SEO or static generation, then it's not worth going the Next.js or Gatsby way - less popular meaning less support, more traps. Sticking with CRA / ejected CRA.

Parcel may be good, but I don't know if it's easy to wire Parcel and Monaco, as well as any other dependencies. Sticking with CRA.

CSS-in-JS library [styled-components]

Anything competing with styled-components? CSS Modules? Not worth it.

Also, look at https://styled-system.com/

https://styled-components.com/docs/tooling#babel-macro

Components library [Ant]

Bootstrap? Material UI? Ant?

https://ant.design/docs/react/use-in-typescript

Ant has better TypeScript support and is being very actively developed

To use:

For forms it makes sense to look into both Formik and Yup:

Frontend state management [React Hooks -> Redux + Redux Toolkit + Redux Thunk (+ Redux Saga)]

Storing the state inside react components should be enough for the start. Once there are significant pain points and the transition to Redux is inavoidable, we can start using Redux. Redux Toolkit is a modern official way to standardize the Redux boilerplate. And, in case there's going to be some nightmare complex multi-staged interaction back and forth

To better understand the whole necessity of such a complex system like Redux, you may want to meditate on Storeon:

To read:

Router [React Router]

@reach/router vs. React Router

@reach/router's core feature with auto focus is actually very annoying and inavoidable by design. While it may make things more accessible, it makes a hell of auto scrolling.

Features from @reach/router are slowly backported to React Router anyways. Also, not a huge difference between the two libraries, so it shouldn't be painful to switch back and forth. You may start with @reach/router and switch once you hit this auto focus trap or need more customization.

Code editor as a component [Monaco]

https://habr.com/ru/company/Voximplant/blog/445390/

Monaco is compatible with pre-eject CRA: react-monaco-editor/react-monaco-editor#263 See cra-monaco/. Although this isn't maintained: https://medium.com/@kitze/configure-create-react-app-without-ejecting-d8450e96196a

Mobile development [React Native]

React Native, Code Push, Fastlane.

Flutter is good but you already have React, so why make your stack more complex.

Unless you build games or rely on bleeding edge APIs like VR/AR, you don't need native Swift/Kotlin development. It's more technologies => more engineering effort and cost, in terms of hours and team size and team salary and communication.

Examples of large React Native projects:

Language flavor/safety [TypeScript]

Flow or Typescript?

Looks like Flow is on par with TypeScript and it's better with React - both are maintained by Facebook. One may also migrate from Flow to TypeScript later on: https://medium.com/inato/migrating-from-flow-to-typescript-why-how-worth-it-5b7703d12089

Flow is often blamed to have bad VSCode support and random bugs. Yarn and Jest migrated from Flow to TypeScript. Same for React Native's Expo.

No need to use TSLint anymore: https://medium.com/palantir/tslint-in-2019-1a144c2317a9

Looks like CRA doesn't have ES2016 support, let alone ES2020. What exactly are we missing: https://github.com/tc39/proposals/blob/master/finished-proposals.md It might make sense to enable it using customize-cra: https://2muchcoffee.com/blog/es7-decorators-how-to-use-the-decorator-syntax-in-react/

Have a look at:

Package managers [Yarn 1.22 or npm, npx]

Yarn 2 can fail to work with react-app-rewired, so sticking to a Yarn 1.* like 1.22 is a safe option for now.s

It looks like npm is being actively developed and is on par with Yarn these days, whereas Yarn has almost no big changes throughout 2019.

Linters and formatters [ESLint/Prettier, Husky]

ESLint/Prettier with typescript-eslint. Pre-commit hooks running necessary tools with Husky.

Backend

Backend framework [Django]

Django or Express.js?

First of all, there are tons of web frameworks, and all popular languages have several of them. The most popular ones are all pretty much equal in their maturity - if you compare Django to Rails to Laravel to ASP.NET to Play. So this is a choice of a language more than a choice of a framework - the framework should be "a single most popular for your language".

Python is a winner in terms of language maturity and size of its community. It leads in all other applications - it has ML libraries, it has the support for any kind of data processing you may need to do.

So the real question is, do you want to have two languages (JS + Python) in your project, or you'd rather just have one and stick to Node.js?

You can assmeble a stack around Express.js. It's essential to use the RDBMS way for the main data storage (i.e. not to slip into the NoSQL trap), which leads to using sequelize as an ORM. And sequelize itself isn't as smooth as Django ORM - it requires more manual actions and verbose configuration. It was also hard to interact with using REPL due to async nature - maybe it's still hard.

I love Django admin panel, Django ORM, migrations, shell, dbshell, Jupyter notebooks with Django support. It's very hard to assemble such a stack on Node.js. Also, sequelize sucks, and NoSQL as a main data storage sucks way more. So - Django.

(Alternatives - async Flask equivalent is FastAPI. Why do you need an async framework though?)

Django boilerplate - cookiecutter?

Cool libraries:

Open-source Django projects:

Blog posts:

API design [Django REST Framework]

Should we use REST or GraphQL?

Django has a very mature REST framework - Django REST framework (DRF), used by 108k projects according to Github stats. It's been actively maintained since 2011 and very well documented.

GraphQL is a new technology that gives the following benefits:

  • typed API requests: auto checking, no need to do Swagger/Postman knowledge sharing between frontend and backend teams
  • no overfetching/underfetching

While the technology itself is cool, it's way more supported in the Node.js world, where the express-graphql library has same 109k users. It's support in the Django world is young and limited: graphene_django has 3k users, it's poorly documented, not very actively maintained and has performance issues.

So for now, Django should be used with DRF. If GraphQL is a must, one should entirely switch to the Node.js stack.

On GraphQL:

On current GraphQL support for Django:

On DRF:

Authentication [?]

Question 1. How to authenticate API requests once the user is logged in?

Options: sessions/cookies, JWT tokens, some other tokens.

Sessions may be hard to work with mobile clients.

Question 2. How to implement social authentication and allow user to sign in / sign up using Google/Facebook?

Implementing social authentication is still hard. You can either rely on third party services or just plug in some libraries. Third party services like Amazon Cognito or Auth0 usually cost money because that's how they make money. The possible upside of using them is that they keep integrations up-to-date. Every year or so your oauth providers like Google or Facebook change their protocol or bump their API version, and your previous sign-in button can become deprecated and broken. (Happened to me several times.)

If you use your own libraries, you don't pay but you sometimes need to do integration maintenance. Plus, the existing libraries aren't really that popular or smooth.

For Node.js worls, Looks like Passport.js is huge and popular.

Can do plain django.contrib.auth with native pages (i.e. no React wrappers around, just redirects) - for prototyping.

There is python-social-auth and Django_allauth and django-rest-auth. The latter isn't supported anymore, but it's required to wire with DRF. Also it's maybe not that painful because it's a tiny layer. No critial Issues found at their bug tracker.

Google One-Tap (Google YOLO) is a great experience, but it's still not public.

Language flavor/safety [Mypy]

Should we use typed Python? https://blogs.dropbox.com/tech/2019/09/our-journey-to-type-checking-4-million-lines-of-python/

Mypy is worth a try - the code should be clearer. Once I start doing Mypy - follow this guide: https://realpython.com/python-type-checking/

Django-stubs is Django with types: https://sobolevn.me/2019/08/typechecking-django-and-drf

Looks like Pyright (Microsoft) and Pyre (Facebook) are both maintained tools that do Mypy-like type checking, but faster.

Package managers [Pipenv]

Pipenv is a modern replacement for pip/virtualenv, although it itself isn't being actively supported since Oct 2018. Poetry isn't as mature as pipenv - eg. pipenv is working in VSCode with zero configuration

Linters and formatters [Black, flake8, isort]

What's suspicious about https://github.com/wemake-services/wemake-django-template ?

  • poetry instead of pipenv
  • new Caddy instead of old proven nginx - it's not worth risking with this layer of infrastructure
  • Gitlab CI - not a default Github CI
  • wemake-python-styleguide is against black, and I love auto-formatters

A sample project with Black, flake8, mypy and isort are configured to work together and with Django/DRF: https://github.com/vpavlenko/drf-tutorial

DevOps

Frontend deployment [Zeit Now]

Netlify or Zeit Now or Github Pages?

Try Zeit Now and Netlify, in this order.

Github Pages might be a weaker option because it's not a core business for the company => less convenient.

On marrying frontend and backend:

Database [Postgres]

Postgres? (ok, at least here there's no alternative)

Reasoning: I want an RDBMS because why disentangle denormalized Mongo crap if you only have one life? Postgres is top-1 RDBMS.

Backend deployment [DigitalOcean Docker (+Portainer) + Managed Postgres + CloudFlare]

Amazon/GCP/Azure? Heroku? VPS/Docker/Lambda? RDS?

Heroku isn't great - need to learn + tricky pricing.

DigitalOcean VPS may be good, although there's no autoscaling and Postgres-specific backups.

Dev db, dev env?

No Lambda - hard to reason about it given my experience with VPS and the whole Django entirety.

Let's try Docker.

uWSGI / gunicorn - both aren't well supported, but gunicorn had more patches over the last years.

DigitalOcean has its own RDS competitor: https://www.digitalocean.com/products/managed-databases/ Loss in latency (100ms), better documentation. (DigitalOcean also has its own S3)

Kubernetes / Docker Swarm is probably an overkill because one instance with Docker Compose should be enough.

So, DigitalOcean, Django app living in a docker, ability to add a load balancer and more dockers, and a Managed Database (Postgres) with backups.

Horizontal scaling for the Django part is better than vertical

Why doesn't googling "django pgbouncer" yield a lot of results? https://stackoverflow.com/questions/40248970/django-settings-when-using-pgbouncer

CloudFlare from the start: for hiding the real server API, maybe caching something, DNS configuration, protecting from malicious DDoS (they happen even at a small scale!).

Monitoring: Sentry, Datadog?

Linters and formatters [ShellCheck for .sh, hadolint for Dockerfile]

Bonus track: Zsh tools

More Repositories

1

study-music

An "awesome music theory" kinda wiki with books, resources and courses for studying everything about music and sound
1,725
star
2

web-programming

Course on web programming taught at MIPT, 2014-2015
HTML
131
star
3

rawl

💅🌈 Western tonal harmony and arrangement as seen in 12 colors. MIDI files in, piano rolls out. Abolition of standard notation's gatekeeping. Prosthesis for sheet-music-blind people. Syntax highlighting for pitches. Pinyin for black polkadot characters
C
33
star
4

content

Lessons and problems for introductory Python 3 course
Python
21
star
5

pastegraph

Share graph plots
JavaScript
20
star
6

podsvechnik

English syntax highlighter as a Chrome plugin
JavaScript
19
star
7

ctf-crypto-tasks

Lecture and exercises on CTF crypto tasks
Python
17
star
8

startup-engineering

6-day intensive course on frontend, backend with Python/Django, deployment, interfaces, machine learning and startup engineering itself (Spring 2014, in Russian)
CSS
16
star
9

bulls-and-cows

Solver for "Bulls and cows" inspired by Akinator Bayesian entropy something something
Python
13
star
10

rsl

Агрегатор словарей русского жестового языка - Search across various dictionaries or Russian Sign Language
JavaScript
10
star
11

misc

Кулинарный блог
C++
8
star
12

reverse-engineering

Tiny course on reverse engineering (MIPT, Spring 2014)
8
star
13

fluffy-graph

NP-hard game where you find isomorphic graphs
JavaScript
6
star
14

linux-task

Introduction to Linux: concepts, command line interface, bash scripts (in Russian)
6
star
15

ctf-web-tasks

Lecture and exercises on CTF web tasks
6
star
16

triplog

Sublime plugin that automatically adds relative timestamp to every paragraph
Python
3
star
17

cache-aware-binary-search

Speed up binary search by leveraging CPU cache structure
C++
3
star
18

nn

From zero to hero
3
star
19

react-club

React club at Recurse Center, Spring 1'2020
JavaScript
2
star
20

django-webpack-vue

Django with Webpack template for Vue.js
JavaScript
2
star
21

oberon-ply

Oberon interpreter using PLY, task for the course on formal languages and compiler frontend design
Python
2
star
22

12-colors

Make theory of Western music visible by using 12 colors
Python
2
star
23

bat

🦇 Beat As Token - a transformer architecture for Western music theory
1
star
24

snakify-mobile

Mobile application for solving Snakify problems
JavaScript
1
star
25

ulmo-python3

Ulmo's Adventure - ported for Python 3
Python
1
star
26

closure-compiler-suppress

Find suppress type for Closure Compiler warnings and errors
1
star
27

hack-presentations

Python
1
star
28

bazooka-chinese

Read HPMOR and learn Chinese along the way
HTML
1
star
29

vpavlenko.github.io

HTML
1
star
30

django-lectures

Lectures on Django, as taught in Winter 2014 in High School "Intellectual"
Python
1
star
31

explore_languages

Combine all language processing tools on a single page
1
star
32

replit-classroom-sample

Sample repo to show structure of Github-backed Repl.it classrooms
Python
1
star
33

virtual_dom

JavaScript
1
star
34

web-2024

How to cursor a web app
1
star
35

hh-school-frontend

Entrance test for HeadHunter's front-end developer school
JavaScript
1
star
36

vpavlenko

1
star
37

cryptography-new-task

Lecture and tasks on cryptography (in Russian)
Python
1
star