Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Architektura aplikacji w React.js

Architektura aplikacji w React.js

Czyli poszukiwania świętego graala.

Jak zaprojektować strukturę plików w aplikacji reactowej?
Co z routingiem? Autoryzacja i uwierzytelnianie?
Redux? Rest API?

Michał Taszycki

August 31, 2019
Tweet

More Decks by Michał Taszycki

Other Decks in Technology

Transcript

  1. OK.

  2. index.js styles.css <App /> <TodoList /> <Todo /> <AddTodoForm />

    .App {…}; .TodoList {…}; .Todo {…}; .AddTodoForm {…};
  3. index.js components/ styles/ __tests__/ utilities/ main.scss App.scss TodoList.scss Todo.scss AddTodoForm.scss

    @import “App.scss” @import “TodoList.scss” @import “Todo.js” @import “AddTodoForm.scss”
  4. index.js components/ styles/ __tests__/ utilities/ main.scss App.scss TodoList.scss Todo.scss AddTodoForm.scss

    @import “App.scss” @import “TodoList.scss” @import “Todo.js” @import “AddTodoForm.scss”
  5. index.js components/ App/ index.js App.js App.test.js App.scss Todo/ utilities/ import

    App from “components/App” LEPIEJ import App from “./App” export default App;
  6. index.js components/ App/ package.json App.js App.test.js App.scss Todo/ utilities/ import

    App from “components/App” ALBO { main: “App.js” }
  7. LEPIEJ const AuthenticatedApp = React.lazy(() => import(“./AuthenticatedApp”) ); { userLoggedIn()

    ? <React.Suspense fallback={"... Loading”}> <AuthenticatedApp /> </React.Suspense> : <UnauthenticatedApp /> }
  8. import TodosAPI from “api/todos”; function TodoList() { useEffect(() => {

    TodosAPI.getAllTodos().then( /* … */ ); }, []) } FASADA DLA API
  9. TodosAPI = { getAllTodos: () => { fetch("example.com/todos", { method:

    “get” }).then( /* … */ ); } }; FASADA DLA API
  10. import TodosAPI from “api/TodosAPI”; import apiClient from “api/FetchClient”; function TodoList()

    { useEffect(() => { new TodosAPI(apiClient) .getAllTodos() .then( /* … */ ); }, []) } ADAPTER DLA API
  11. import TodosAPI from “api/TodosAPI”; import apiClient from “api/FakeClient”; function TodoList()

    { useEffect(() => { new TodosAPI(apiClient) .getAllTodos() .then( /* … */ ); }, []) } ADAPTER DLA API
  12. ADAPTER DLA API class TodosAPI constructor(client) { this.client = client;

    } getAllTodos: () => { this.client.getAll("example.com/todos"); } };
  13. Client = { getAll: function (url) {…}, getOne: function (url,

    id) {…}, post: function (url, payload) {…}, put: function (url, id, payload) {…}, patch: function (url, id, payload) {…}, delete: function (url, id) {…}, } ADAPTER DLA API
  14. WARTO MIEĆ WSZYSTKIE TYPY AKCJI W JEDNYM PLIKU TODO_ADD addTodo(todo)

    TODO_EDIT editTodo(todo) TODO_REPLACE replaceTodo(todo) TODO_DELETE deleteTodo(todo)
  15. KOLOKACJA SELECTORÓW I REDUCERÓW todosReducer = (state = [], action)

    { switch(action.type) { case TODO_ADD: return […state, action.todo]; } } getAllTodos(state) => state; getTodoById(state, id) => state.find(todo => todo.id === id)
  16. TESTOWANIE BLACK BOX it(“Adds a todo”, () => { const

    todoToAdd = {id: 42, title: “abc”}; store.dispatch(addTodo(todoToAdd)); expect( getTodoById(store.getState(), 42) ).toEq(todoToAdd); }