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

Reason - React Meetup #20

Reason - React Meetup #20

Ana Luiza Portello

March 09, 2018
Tweet

More Decks by Ana Luiza Portello

Other Decks in Programming

Transcript

  1. • Qual a sua necessidade? • Um pouco sobre o

    que é o ReasonML / OCaml • Detalhes da linguagem • Um pouco sobre o ReasonReact
  2. Mantida pelo Facebook Se tornou open source em 2016 Criado

    pelo Jordan Walke (criador do React) Sintaxe baseada no Ocaml e inspirada em Rust e JS
  3. Linguagem da familia ML(SML, OCaml) Sistema de tipos muito poderoso

    É multi-paradigma com um suporte ao estilo funcional Hack do FB tem muitas ferramentas internas em OCaml.
  4. Ocaml AST ReasonML Syntax refmt Parser BUCKLESCRIPT OCAMLOPT OCaml Syntax

    OCAMLC Javascript NativeCode ByteCode .ml == .re
  5. • Libraries: Biblioteca Ocaml, interop simples javascript. • Build System:

    Bucklescript build tools, webpack bs-loader • Package Management: npm
  6. type boleto = { value: int, status: statusType } type

    statusType = Paid | Expired | Valid
  7. let diff = (a, b) => a - b; Inferencia

    de Tipos val diff: Int => Int => Int
  8. /* REASON */ let diff = (a, b) => a

    - b; /* JS */ const diff = (a, b) => a - b; JS x Reason
  9. let add = (x, y) => x + y; add(1);

    /* function */ add(1)(2); /* 3 */
  10. let add = (x, y) => x + y; let

    inc = add(1); inc(10); /* 11 */
  11. let multiply = (x, y) => x * y; let

    multiplyBy10 = multiply(10); multiplyBy10(10); /* 100 */
  12. let print_numbers = (n) => { for (i in 1

    to n) { print_int(i); }; };
  13. let rec fatorial n = match n with 0 ->

    1 | 1 -> 1 | _ -> n * fatorial (n -1)
  14. let max = (x, y) => if (x > y)

    { x } else { y };
  15. let max = (x, y) => switch(x > y) {

    | true => x | false => y };
  16. type color_type = Blue | Black | Green let color

    = Blue let colorHex = (color) => switch(color) { | Blue => “#0000FF” | Black => “#000000” | Green => “#00FF00” };
  17. www.hello.com/book/10/edit?name=Jane#author let watcherID = ReasonReact.Router.watchUrl (url => { switch (url.path)

    { | ["book", id, "edit"] => handleBookEdit( id) | ["book", id] => getBook(id) | ["book", id, _] => noSuchBookOperation () | _ => showNotFoundPage () } }); type = url { # endpoint path: list(string) # url hash’s hash: string, # query params search: string }
  18. let resultPromise = (somePromise) => { somePromise |> Js.Promise.then_(value =>

    { Js.Promise.resolve(value) }) |> Js.Promise.catch(err => { Js.Promise.reject(err) }) }
  19. /* REASON */ let result = (promises) => Js.Promise.( promises

    |> List.fold_left( (resultP, promise) => resultP |> then_(promise), resolve() ) ); /* JS */ const result = promises => { return promises.reduce( (result, promise) => result.then(promise), Promise.resolve() ); };
  20. let possiblyNullValue: option(string) = Some("Hello"); switch (possiblyNullValue) { | None

    => print_endline("Nothing") | Some(message) => print_endline(message) }; /* Hello */
  21. let possiblyNullValue: option(string) = None; switch (possiblyNullValue) { | None

    => print_endline("Nothing") | Some(message) => print_endline(message) }; /* Nothing */
  22. JSX

  23. <div foo={bar}> {child1} {child2} </div> ReactDOMRe.createElement ("div", ~props=ReactDOMRe.props(~foo=bar, ()), [|child1,

    child2|]); React.createElement(‘div’, { foo: bar }, child1, child2); .re .js
  24. type state = { meetupName: string, attendees: list(person) }; type

    person = { name: string, going: status } type status = | Going | NotGoing | Waitlist
  25. let component = ReasonReact.reducerComponent(“App”) let make = (~name, _children) =>

    { ...component, initialState: () => {meetupName: “React”, attendees: [||]} render: _self => <div className= “App”> <h1>Meetup {ReasonReact.stringToElement(meetupName)}</h1> <div> { ReasonReact.arrayToElement( Array.of_list( List.map((attendees) => <Attendees attendee />, attendees) )) } </div> </div> };
  26. <app-name>/ README.md node_modules/ package.json bsconfig.json .gitignore public/ favicon.ico index.html src/

    index.re index.css app.re app.css logo.svg { "name": <app-name>, "sources": [ "src" ], "bs-dependencies": [ "reason-react", "bs-jest", ], "reason": { "react-jsx": 2 }, "bsc-flags": [ "-bs-super-errors" ], "refmt": 3 }
  27. import { add } from './operations.re' const sum = add(1,

    4) [%bs.raw {|require('./App.css')|}];
  28. • PWA: Interop com web workers, localstorage. • TESTS: Vem

    com test runners configurados • CONFIG: Configuração de build otimizada
  29. PQ APRENDER É LEGAL? • PARADIGMA FUNCIONAL: A melhor forma

    de aprender novos paradigmas é por meio da experimentação de linguagens. • NOVAS PERSPECTIVAS: Nova visão sobre como resolver problemas. • FP JA E HYPE NA COMUNIDADE REACT: Todo mundo usa coisas pra fingir pra que JS é funcional. Muita coisa no React é inspirada em FP.
  30. BAD PARTS • SSR: Não tem tem suporte para server

    side rendering • Curva de Aprendizagem: Paradigma novo, modo de pensar novo. • RELATIVAMENTE NOVA(QUASE 3 ANOS): Tools e bibliotecas ainda em desenvolvimento.
  31. Tipagem - rrdelaney.github.io/ReasonablyTyped/ Fazer Forms - github.com/Astrocoders/reform Biblioteca inspirada em

    Ramda p/ Reason - github.com/jonlaing/rationale Implementação de Flexbox - github.com/jordwalke/flex BS-CSS - github.com/SentiaAnalytics/bs-css Extensão navegador(Converte .re .ml etc) - github.com/reasonml/reason-tools