• Stars
    star
    232
  • Rank 172,847 (Top 4 %)
  • Language
    TypeScript
  • License
    Apache License 2.0
  • Created over 4 years ago
  • Updated about 1 year ago

Reviews

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

Repository Details

React.js Isomorphic Web Application Architecture - Learn to build a complete website for a blogging platform like Medium, FreeCodeCamp, MindOrks etc using React.js, Redux, Material-UI, Express.js, Typescript, Webpack, Babel, and Docker. OpenSource project by AfterAcademy

React.js Isomorphic Web Application Architecture

Learn to build a complete production-level web app for a blogging platform like Medium, MindOrks, and FreeCodeCamp

Demo web app running this project: Goto Demo Website


About this Open Source Project

This open-source project is for you(community). I Janishar Ali have taken this initiative to promote web development learning in the best possible way. I am determined to provide quality content for everyone. Let's do it together by learning from this project.

We will learn and build the React web application for a blogging platform.

The main focus will be to create a super fast and production-ready application with SEO.
Following are the highlights of this project:

  • Isomorphic React web app: The server sends the rendered pages to the client, and then the client renders the subsequent pages on its own. This is a very important feature for SEO and it also makes the first paint super fast.
  • React Hooks: This application uses hooks APIs from React, Redux, and other libraries.
  • Written in Typescript: The type safety at build time and having intellisense for it in the IDE like vscode is unparalleled to productivity. We have found production bug reduced to a significant amount since most of the code vulnerabilities are identified during the build phase itself. The Typescript was preferred over the Flow for better vscode support and much more type availability for libraries.
  • Separation of concern principle is applied: Each component has been given a particular role. The role of the components is mutually exclusive. This makes the project easy to be unit tested.
  • Feature encapsulation is adopted: The files or components that are related to a particular feature have been grouped unless those components are required in multiple features. This enhances the ability to share code across projects.
  • State management using Redux: The Redux architecture is very well suited for scalable web apps. It is excellent in server side rendering for components that need data from the API server. It is also preferred over the context in the project.
  • Separate API server: This project also has a server, having the purpose of serving only the pages for the website. Lhe logic of the application lies in a separate API server which is also opensource by us here.
  • Boilerplate: Utility classes have been written to reduce the application and Redux boilerplate.
  • Latest libraries and patterns: All the libraries used in this project are standard, concerning the latest and modern web development practices.
  • vscode tasks for templates: For enhancing the productivity while coding on the vscode, many tasks have been written to help generate the initial working code for each component. Just execute these tasks in vscode.

Architecture of an UI component


Learn the concepts used in this project

Node.js Backend API Project: Goto Repository

How to build and run this project

  • Install the API server. Read Instructions Here
  • Install using Docker Compose [Recommended Method For Production]
    • Clone this repo.
    • Make a copy of .env.example file to .env.
    • Make a copy of tests/.env.test.example file to tests/.env.test.
    • Make sure the .env file has the API_BASE_URL point to the API server.
    • Install Docker and Docker Compose. Find Instructions Here.
    • Execute docker-compose up -d in the terminal from the repo directory.
    • You will be able to access the website from http://localhost:3001
    • If having any issue then make sure 3001 port is not occupied else provide a different port in .env file.
  • Install Without Docker [2nd Method For Development]
    • Do steps 1 to 4 as listed above for Install using Docker Compose.
    • Execute npm install
    • Run the project:
      • Development: Execute npm run watch
      • Production: Execute npm start
    • You will be able to access the website from http://localhost:3001

Find this project useful? ❤️

  • Support it by clicking the ⭐ button on the upper right of this page. ✌️

Website Pages

  • Landing
  • Blog List
  • Blog Page
  • Writing Pad - Markdown Editor
  • Preview - Markdown to HTML
  • Blog Detail Form
  • Writer Blogs Management
  • Editor Blogs Management

Project Directory Structure

.
├── .templates
│   ├── component
│   │   ├── actions.ts
│   │   ├── assets
│   │   │   └── .gitkeep
│   │   ├── index.tsx
│   │   ├── reducer.ts
│   │   └── style.ts
│   └── simple_component
│       ├── index.tsx
│       └── style.ts
├── .vscode
│   ├── extensions.list
│   ├── launch.json
│   ├── settings.json
│   └── tasks.json
├── public
│   ├── favicon.ico
│   ├── robots.txt
│   ├── sitemap.xml
│   └── template.html
├── src
│   ├── app-types.d.ts
│   ├── index.tsx
│   ├── reducers.ts
│   ├── server
│   │   ├── app.ts
│   │   ├── devStoreConfig.ts
│   │   ├── pageBuilder.tsx
│   │   ├── routes.tsx
│   │   ├── server-types.d.ts
│   │   ├── server.dev.ts
│   │   ├── server.prod.ts
│   │   └── template.ts
│   ├── theme.ts
│   ├── ui
│   │   ├── app
│   │   │   ├── actions.ts
│   │   │   ├── index.tsx
│   │   │   ├── reducer.ts
│   │   │   ├── routes.tsx
│   │   │   └── style.ts
│   │   ├── auth
│   │   │   ├── actions.ts
│   │   │   ├── index.tsx
│   │   │   ├── login.tsx
│   │   │   ├── reducer.ts
│   │   │   ├── singup.tsx
│   │   │   └── style.ts
│   │   ├── bloglist
│   │   │   ├── actions.ts
│   │   │   ├── assets
│   │   │   │   └── blog-page-cover.jpg
│   │   │   ├── index.tsx
│   │   │   ├── reducer.ts
│   │   │   └── style.ts
│   │   ├── blogpage
│   │   │   ├── actions.ts
│   │   │   ├── index.tsx
│   │   │   ├── reducer.ts
│   │   │   └── style.ts
│   │   ├── common
│   │   │   ├── confirmation
│   │   │   │   ├── index.tsx
│   │   │   │   └── style.ts
│   │   │   ├── firstletter
│   │   │   │   ├── index.tsx
│   │   │   │   └── style.ts
│   │   │   ├── markdown
│   │   │   │   ├── index.tsx
│   │   │   │   └── style.ts
│   │   │   ├── placeholders
│   │   │   │   ├── index.tsx
│   │   │   │   └── style.ts
│   │   │   ├── preview
│   │   │   │   ├── index.tsx
│   │   │   │   └── style.ts
│   │   │   └── snackbar
│   │   │       ├── index.tsx
│   │   │       └── style.ts
│   │   ├── editor
│   │   │   └── blogs
│   │   │       ├── actions.ts
│   │   │       ├── index.tsx
│   │   │       ├── reducer.ts
│   │   │       └── style.ts
│   │   ├── footer
│   │   │   ├── index.tsx
│   │   │   └── style.ts
│   │   ├── header
│   │   │   ├── assets
│   │   │   │   └── afteracademy-logo.svg
│   │   │   ├── index.tsx
│   │   │   └── style.ts
│   │   ├── landing
│   │   │   ├── assets
│   │   │   │   ├── afteracademy-blog.jpg
│   │   │   │   ├── afteracademy-youtube.jpg
│   │   │   │   ├── mindorks-blog.jpg
│   │   │   │   ├── mindorks-logo.svg
│   │   │   │   ├── mindorks-medium-blog.jpg
│   │   │   │   ├── mindorks-opensource.jpg
│   │   │   │   └── mindorks-youtube.jpg
│   │   │   ├── index.tsx
│   │   │   └── style.ts
│   │   ├── notfound
│   │   │   ├── index.tsx
│   │   │   └── style.ts
│   │   └── writer
│   │       ├── myblogs
│   │       │   ├── actions.ts
│   │       │   ├── index.tsx
│   │       │   ├── reducer.ts
│   │       │   └── style.ts
│   │       └── writingpad
│   │           ├── actions.ts
│   │           ├── form.tsx
│   │           ├── index.tsx
│   │           ├── reducer.ts
│   │           └── style.ts
│   └── utils
│       ├── appUtils.ts
│       ├── creator.ts
│       ├── importer.ts
│       ├── network.ts
│       ├── pageUtils.ts
│       └── reduxMiddlewares.ts
├── tests
│   ├── .env.example
│   ├── .env.test.example
│   ├── example.test.ts
│   └── setup.ts
├── tools
│   ├── babel-register.js
│   └── importer-loader.js
├── .babelrc
├── .dockerignore
├── .env.example
├── .eslintignore
├── .eslintrc
├── .gitignore
├── .prettierignore
├── .prettierrc
├── Dockerfile
├── LICENSE
├── README.md
├── docker-compose.yml
├── jest.config.js
├── package-lock.json
├── package.json
├── tsconfig.json
└── webpack.config.js

Find this project helpful? ❤️

  • Support it by clicking the ⭐ button on the upper right of this page. ✌️

License

Copyright (C) 2022 JANISHAR ALI ANWAR

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

More Repositories

1

mit-deep-learning-book-pdf

MIT Deep Learning Book in PDF format (complete and parts) by Ian Goodfellow, Yoshua Bengio and Aaron Courville
Java
11,661
star
2

android-mvp-architecture

This repository contains a detailed sample app that implements MVP architecture using Dagger2, GreenDao, RxJava2, FastAndroidNetworking and PlaceholderView
Java
4,426
star
3

android-mvvm-architecture

This repository contains a detailed sample app that implements MVVM architecture using Dagger2, Room, RxJava2, FastAndroidNetworking and PlaceholderView
Java
2,958
star
4

nodejs-backend-architecture-typescript

Node.js Backend Architecture Typescript - Learn to build a backend server for production ready blogging platform like Medium and FreeCodeCamp. Main Features: Role based, Express.js, Mongoose, Redis, Mongodb, Joi, Docker, JWT, Unit Tests, Integration Tests.
TypeScript
2,443
star
5

PlaceHolderView

This library provides advance views for lists and stacks. Some of the views are build on top of RecyclerView and others are written in their own. Annotations are compiled by annotation processor to generate bind classes. DOCS -->
Java
2,107
star
6

android-kotlin-mvp-architecture

This repository contains a detailed sample app that implements MVP architecture in Kotlin using Dagger2, Room, RxJava2, FastAndroidNetworking and PlaceholderView
Kotlin
700
star
7

android-dagger2-example

This project implements the dagger 2 in android for dependency injection
Java
456
star
8

android-mvp-interactor-architecture

Extension of the android-mvp-architecture for very large projects.
Java
403
star
9

annotation-processing-example

It is the example project for the annotation processing tutorial.
Java
139
star
10

JPost

Java and Android class communication library: New and improved Pub-Sub
Java
117
star
11

post-office-simulator-looper-example

This Android project simulates a Post Office using HandlerThread
Java
114
star
12

ParaCamera

Simple android camera to take and get image bitmaps
Java
96
star
13

Tutorials

Published tutorial files
Java
85
star
14

data-analytics-project-template

A python project starter template for data-analytics and data-science.
Jupyter Notebook
44
star
15

ButterKnifeLite

View binding library
Java
20
star
16

node-api-backend-architecture

JavaScript
19
star
17

graph-library

Data Structure and Algorithm for Graphs
Java
14
star
18

node-mvc-architecture

JavaScript
7
star
19

nodejs-bot-app

Create Bot using JavaScript in NodeJs. Use this program to create bots for automating the daily and repetitive tasks
JavaScript
5
star
20

cpp-course-for-beginners

c++ free course for beginners
C++
4
star
21

examples

Java
4
star
22

janishar.github.io

Docs for github page
3
star
23

janishar

My Profile
1
star
24

MindorksLibraryTest

Upload to repository test
Java
1
star