44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | 
2 |
3 |
4 | # Trilha JavaScript | Opensanca Developer
5 |
6 | Essa trilha visa oferecer ao participante conhecimentos que irão do básico ao avançado para se tornar um Full-Stack JavaScript Developer. Para tanto, serão abordados desde os fundamentos da linguagem até a imersão nos frameworks mais atuais do mercado, caso não esteja participando da trilha, sinta-se livre para seguir esse material e consolidar vossos estudos para essa linguagem fantástica.
7 |
8 |
9 | ### Objetivo:
10 | Apresentar a linguagem JavaScript e suas ferramentas em oito cursos que ensinam desde a sintaxe básica da linguagem até orientação a objetos na prática com frameworks mais atuais do mercado como React, Angular, Node e Ionic, voltado tanto para Web quanto Mobile.
11 |
12 | ### Público-alvo:
13 | Programadores iniciantes de JavaScript que saibam programar (lógica de programação).
14 |
15 |
16 | ### Pré-requisitos
17 | Para aproveitar todo o potencial deste curso é preciso saber programar em qualquer linguagem como C, Java, PHP e etc, no minimo saber ter lógica de programação, caso não esteja muito familiarizado com lógica poderá pegar no nosso guia de Referencias Bibliográficas material que lhe auxilie nesse processo, durante a trilha estaremos dissecando a linguagem assim como seus frameworks.
18 |
19 | ### Grade:
20 | - JavaScript Básico ECMA 6 - DOM, BOM e Eventos | (Renan Johannsen) - 8h
21 | - JavaScript - Orientação á Objetos | (Renan Johannsen) - 12h
22 | - Node + Express | (Renan Johannsen) - 9h
23 | - MongoDB | (Renan Johannsen) - 4h
24 | - Angular > v1.5 | (Renan Johannsen) -16h
25 | - Ember | (Alex Ferreira) - 8h
26 | - React + Flux | (Guilherme Diego & Vinicius Lemes) - 8h
27 | - Ionic | (Fabian Cabau) - 8h
28 | - Testes Unitários | (William Bruno) - 8h
29 |
30 | ### Carga horária total:
31 | Aproximadamente 80hrs (26 aulas de 2 horas e 40 minutos)
32 |
33 |
34 | ### Como tirar dúvidas?
35 | * Acesse a página/aba com menção á [issues](https://github.com/opensanca/trilha-javascript/issues);
36 | * Pesquise nas issues abertas e fechadas, se a mesma dúvida já foi postada;
37 | * Se não foi, [crie uma nova issue](https://github.com/opensanca/trilha-javascript/issues/new), coloque um título que tenha a ver com a sua dúvida, e descreva-a com o maior nível de detalhes possíveis, para que possamos te ajudar :)
38 |
39 | ### Ide, Editores de texto e afins:
40 | Recomendamos que adote um editor de texto,para facilitar a escrita de seu código livre para usar qualquer editor de texto de sua preferência existem vários no mercado como:
41 | - [Atom](https://atom.io/)
42 | - [Sublime TXT](https://www.sublimetext.com/3)
43 | - [NotePad ++](https://notepad-plus-plus.org/)
44 | - [Brackets](http://brackets.io/)
45 | - [WebStorm](https://www.jetbrains.com/webstorm/)
46 | - [VIM](http://www.vim.org/)
47 |
48 |
49 |
50 | ### Agenda:
51 | 
52 |
53 |
54 |
55 | ### Referencia bibliográfica/video-aula:
56 | - [Exploring ES6 - Upgrade to the next version of JavaScript - ebook](http://exploringjs.com/es6/)
57 | - [JavaScript Furtivo - Eric Douglas | ebook](https://leanpub.com/javascriptfurtivo)
58 | - [Eloquent JavaScript - Marijin Haverbeke | ebook](http://braziljs.github.io/eloquente-javascript/)
59 | - [Learning JavaScript Design Patterns - Addy Osmani |ebook](https://addyosmani.com/resources/essentialjsdesignpatterns/book/)
60 | - [Série You Don't Know JavaScript - Kyle Simpson | ebook](https://github.com/getify/You-Dont-Know-JS)
61 | - [Programming JavaScript Applications - Eric Elliot | ebook](http://chimera.labs.oreilly.com/books/1234000000262/index.html)
62 | - [Aprendendo JavaScript - Rodrigo Branas | videoaula](https://www.youtube.com/playlist?list=PLQCmSnNFVYnT1-oeDOSBnt164802rkegc)
63 | - [ECMAScript 2015 - videoaula](https://www.youtube.com/watch?v=vcoMWWVZS7c&list=PLDm7BSK-M5Yk30T65F5yeuCcStOQBPKq2)
64 | - [Aprender Git/Github](https://github.com/opensanca/hello-git)
65 |
66 |
67 |
68 | ### License:
69 |
70 | [MIT | Creative Commons Attribution-NonCommercial-ShareAlike 4.0](https://github.com/opensanca/trilha-javascript/blob/master/LICENSE.md) [Opensanca 2016
71 |
--------------------------------------------------------------------------------
/02.MEAN/aula-05/README.md:
--------------------------------------------------------------------------------
1 | # MongoDB
2 |
3 | Nesta aula abordamos as principais características do MongoDB.
4 | Abaixo, segue alguns links e material para apoio.
5 |
6 | ## Video Aulas
7 |
8 | - [Introdução ao MongoDb em vídeo aulas](https://www.portalgsti.com.br/2016/09/introducao-ao-mongodb-em-video-aulas.html);
9 | - [Mongo University](https://university.mongodb.com/);
10 | - [Be MEAN: MongoDB](https://www.youtube.com/playlist?list=PL77JVjKTJT2gXHb9FEokJsPEcoOmyF1pY);
11 |
12 | ## Artigos de Apoio
13 |
14 | Primeiramente vamos entender o são banco de dados não relacionais (famosos NoSql). Basicamente surgiram com o intuito de resolver problemas específicos que os bancos relacionais não conseguem resolver eficientemente devido a estratégia de orquestração dos dados.
15 |
16 | Os bancos de dados não relacionais tem por objetivo:
17 |
18 | - Escalabilidade;
19 | - Adaptabilidade dos dados;
20 | - Facilidade de operação;
21 |
22 | Existem diversos tipos de bancos de dados não relacionais e dentre eles temos:
23 |
24 | - Chave/Valor;
25 | - Documento;
26 | - Grafo;
27 | - Coluna;
28 | - Híbridos;
29 |
30 | MongoDB é um banco de dados schemaless orientado a arquivos projetado para facilitar o desenvolvimento e escalar com eficiência. Basicamente ele concilia a distribuição entre funcionalidades e escalabilidade para maximizar o desempenho e fornecer uma interface de operação fácil e intuitiva.
31 |
32 | A ilustração abaixo mostra a distribuição do mongo dentre os demais banco de dados.
33 |
34 | 
35 |
36 | ## Documentos
37 |
38 | O MongoDB utiliza o formato BSON para armazenamento dos documentos. Na pratica é uma forma de JSON binarizado com a adição de referencias de tipos. Veja mais sobre documentos [aqui](https://docs.mongodb.org/manual/core/document/).
39 |
40 | Os documentos são agrupados por coleções. Fazendo uma analogia aos banco de dados relacionais os documentos seriam as tuplas e as coleções seriam as tabelas.
41 |
42 | ## Schemaless (livre de esquema)
43 |
44 | Os dados no mongo são livres de schema, ou seja, não seguem uma definição prévia como as tabelas dos banco de dados sql. Na pratica em uma coleção de documentos podem haver documentos completamente distintos facilitando a adaptação do banco de dados a mudanças.
45 |
46 | ## Instalação
47 |
48 | Para a realização da instalação clique [aqui](https://docs.mongodb.org/manual/installation/);
49 |
50 | ## Utilização
51 |
52 | Para conseguirmos utilizar o MongoDB primeiramente precisamos iniciar o serviço em background e posteriormente conectar através da interface disponibilizada via shell.
53 |
54 | ```mongodb
55 | sudo service mongod start
56 | ```
57 |
58 | ```mongodb
59 | mongo
60 |
61 | > MongoDB shell version: 3.2.1
62 | > connecting to: test
63 | > Mongo-Hacker 0.0.9
64 | > Server has startup warnings:
65 | > 2016-01-29T20:06:49.198-0200 I CONTROL [initandlisten]
66 | > 2016-01-29T20:06:49.198-0200 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
67 | > 2016-01-29T20:06:49.198-0200 I CONTROL [initandlisten] ** We suggest setting it to 'never'
68 | > 2016-01-29T20:06:49.198-0200 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
69 | > 2016-01-29T20:06:49.198-0200 I CONTROL [initandlisten] ** We suggest setting it to 'never'
70 | > 2016-01-29T20:06:49.198-0200 I CONTROL [initandlisten]
71 | > Inspiron-5548(mongod-3.2.1) test>
72 | ```
73 |
74 | Para facilitar a utilização do mongo pelo show podemos adicionao o [mongo-hacker](https://github.com/TylerBrock/mongo-hacker).
75 |
76 | ## Operações
77 |
78 | As operações são realizadas sobre os arquivos das coleções de um determinado banco de dados. Para a seleção de um banco de dados utilizamos a palavra reservada **use**. Um banco de dados ou uma coleção são criados a partir da primeira operação sobre os mesmos.
79 |
80 | Ao referenciarmos um banco de dados através do comando **use** o mesmo é atribuido a variável **db**.
81 |
82 | Exemplo:
83 |
84 | ```mongodb
85 | use escola
86 | db
87 | > escola
88 | ```
89 |
90 | Para exibir os bancos de dados e as coleções existentes utilizamos o comando **show**.
91 |
92 | Exemplo:
93 |
94 | ```mongodb
95 | show dbs
96 | ```
97 |
98 | ```mongodb
99 | use escola
100 | show collections
101 | ```
102 |
103 | ### Materual
104 |
105 | Para fins didáticos utilizaremos como material do curso o próprio [manual do mongo](https://docs.mongodb.org/manual/) uma vez que o mesmo é bem completo e didático.
106 |
107 | ## Saiba mais
108 |
109 | A seguir encontra-se uma lista de materiais relacionados e indicados para o estudo:
110 |
111 | - [Manual](https://docs.mongodb.org/manual/);
112 |
--------------------------------------------------------------------------------
/02.MEAN/aula-04/README.md:
--------------------------------------------------------------------------------
1 | # MongoDB e Mongoose
2 |
3 | Nesta aula abordamos as principais características do MongoDB.
4 |
5 | Abaixo, segue alguns links e material para apoio.
6 |
7 | ## Video Aulas
8 |
9 | - [Introdução ao MongoDb em vídeo aulas](https://www.portalgsti.com.br/2016/09/introducao-ao-mongodb-em-video-aulas.html);
10 | - [Mongo University](https://university.mongodb.com/);
11 | - [Be MEAN: MongoDB](https://www.youtube.com/playlist?list=PL77JVjKTJT2gXHb9FEokJsPEcoOmyF1pY);
12 |
13 | ## Artigos de Apoio
14 |
15 | Primeiramente vamos entender o são banco de dados não relacionais (famosos NoSql). Basicamente surgiram com o intuito de resolver problemas específicos que os bancos relacionais não conseguem resolver eficientemente devido a estratégia de orquestração dos dados.
16 |
17 | Os bancos de dados não relacionais tem por objetivo:
18 |
19 | - Escalabilidade;
20 | - Adaptabilidade dos dados;
21 | - Facilidade de operação;
22 |
23 | Existem diversos tipos de bancos de dados não relacionais e dentre eles temos:
24 |
25 | - Chave/Valor;
26 | - Documento;
27 | - Grafo;
28 | - Coluna;
29 | - Híbridos;
30 |
31 | MongoDB é um banco de dados schemaless orientado a arquivos projetado para facilitar o desenvolvimento e escalar com eficiência. Basicamente ele concilia a distribuição entre funcionalidades e escalabilidade para maximizar o desempenho e fornecer uma interface de operação fácil e intuitiva.
32 |
33 | A ilustração abaixo mostra a distribuição do mongo dentre os demais banco de dados.
34 |
35 | 
36 |
37 | ## Documentos
38 |
39 | O MongoDB utiliza o formato BSON para armazenamento dos documentos. Na pratica é uma forma de JSON binarizado com a adição de referencias de tipos. Veja mais sobre documentos [aqui](https://docs.mongodb.org/manual/core/document/).
40 |
41 | Os documentos são agrupados por coleções. Fazendo uma analogia aos banco de dados relacionais os documentos seriam as tuplas e as coleções seriam as tabelas.
42 |
43 | ## Schemaless (livre de esquema)
44 |
45 | Os dados no mongo são livres de schema, ou seja, não seguem uma definição prévia como as tabelas dos banco de dados sql. Na pratica em uma coleção de documentos podem haver documentos completamente distintos facilitando a adaptação do banco de dados a mudanças.
46 |
47 | ## Instalação
48 |
49 | Para a realização da instalação clique [aqui](https://docs.mongodb.org/manual/installation/);
50 |
51 | ## Utilização
52 |
53 | Para conseguirmos utilizar o MongoDB primeiramente precisamos iniciar o serviço em background e posteriormente conectar através da interface disponibilizada via shell.
54 |
55 | ```mongodb
56 | sudo service mongod start
57 | ```
58 |
59 | ```mongodb
60 | mongo
61 |
62 | > MongoDB shell version: 3.2.1
63 | > connecting to: test
64 | > Mongo-Hacker 0.0.9
65 | > Server has startup warnings:
66 | > 2016-01-29T20:06:49.198-0200 I CONTROL [initandlisten]
67 | > 2016-01-29T20:06:49.198-0200 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
68 | > 2016-01-29T20:06:49.198-0200 I CONTROL [initandlisten] ** We suggest setting it to 'never'
69 | > 2016-01-29T20:06:49.198-0200 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
70 | > 2016-01-29T20:06:49.198-0200 I CONTROL [initandlisten] ** We suggest setting it to 'never'
71 | > 2016-01-29T20:06:49.198-0200 I CONTROL [initandlisten]
72 | > Inspiron-5548(mongod-3.2.1) test>
73 | ```
74 |
75 | Para facilitar a utilização do mongo pelo show podemos adicionao o [mongo-hacker](https://github.com/TylerBrock/mongo-hacker).
76 |
77 | ## Operações
78 |
79 | As operações são realizadas sobre os arquivos das coleções de um determinado banco de dados. Para a seleção de um banco de dados utilizamos a palavra reservada **use**. Um banco de dados ou uma coleção são criados a partir da primeira operação sobre os mesmos.
80 |
81 | Ao referenciarmos um banco de dados através do comando **use** o mesmo é atribuido a variável **db**.
82 |
83 | Exemplo:
84 |
85 | ```mongodb
86 | use escola
87 | db
88 | > escola
89 | ```
90 |
91 | Para exibir os bancos de dados e as coleções existentes utilizamos o comando **show**.
92 |
93 | Exemplo:
94 |
95 | ```mongodb
96 | show dbs
97 | ```
98 |
99 | ```mongodb
100 | use escola
101 | show collections
102 | ```
103 |
104 | ### Materual
105 |
106 | Para fins didáticos utilizaremos como material do curso o próprio [manual do mongo](https://docs.mongodb.org/manual/) uma vez que o mesmo é bem completo e didático.
107 |
108 | ## Saiba mais
109 |
110 | A seguir encontra-se uma lista de materiais relacionados e indicados para o estudo:
111 |
112 | - [Manual](https://docs.mongodb.org/manual/);
113 |
--------------------------------------------------------------------------------
/01.JavaScript/aula-01/README.md:
--------------------------------------------------------------------------------
1 | # Strict Mode, Variáveis e Hoisting
2 |
3 | Nesta aula abordamos os conceitos iniciais da linguagem junto de características de extrema importância.
4 | Abaixo, segue alguns links e material para apoio.
5 |
6 | ## Artigos
7 |
8 | We Love Dev:
9 | - [Zero to Hero JavaScript - Variáveis](http://www.welovedev.com.br/post/zero-to-hero-javascript-variaveis)
10 | - [Zero to Hero JavaScript - Hoisting](http://www.welovedev.com.br/post/zero-to-hero-javascript-hoisting)
11 | - [Zero to Hero JavaScript - Strict mode](http://www.welovedev.com.br/post/zero-to-hero-javascript-strict-mode)
12 |
13 | Cristofer Sousa:
14 | - [Hello JavaScript aka ES6!](http://cristofersousa.github.io/javascript,/node/hello-javascript)
15 |
16 | ## Video Aulas
17 |
18 | Rodrigo Branas:
19 | - [Desvendando a linguagem JavaScript - #1 - Introdução](https://www.youtube.com/watch?v=093dIOCNeIc&index=1&list=PLQCmSnNFVYnT1-oeDOSBnt164802rkegc)
20 | - [Desvendando a linguagem JavaScript - #2 - Number](https://www.youtube.com/watch?v=-4Er-sZoxHM&index=2&list=PLQCmSnNFVYnT1-oeDOSBnt164802rkegc)
21 | - [Desvendando a linguagem JavaScript - #3 - String](https://www.youtube.com/watch?v=c3vaqf9x1PQ&index=3&list=PLQCmSnNFVYnT1-oeDOSBnt164802rkegc)
22 | - [Desvendando a linguagem JavaScript - #4 - Boolean](https://www.youtube.com/watch?v=oP2ProYre4k&index=4&list=PLQCmSnNFVYnT1-oeDOSBnt164802rkegc)
23 | - [Desvendando a linguagem JavaScript - #5 - undefined e null](https://www.youtube.com/watch?v=dhaLnhvOyFc&index=5&list=PLQCmSnNFVYnT1-oeDOSBnt164802rkegc)
24 |
25 | Aulas de Programação:
26 | - [Dicas Javascript - Ep01: Hoisting](https://www.youtube.com/watch?v=JGpekHQ_9kY)
27 | - [ECMAScript 2015 (ES6) - Aula 03: Let e Const](https://www.youtube.com/watch?v=noJ2G56b7rs)
28 | - [ECMAScript 2015 (ES6) - Aula 04: Let e Const (Parte 2)](https://www.youtube.com/watch?v=ewbkvH3cGaw)
29 |
30 | # Artigo de apoio:
31 |
32 | ### Introdução
33 |
34 | JavaScript é uma linguagem case sensitive e fracamente tipada, ou seja, não é necessário especificar explicitamente o tipo de uma variável em sua declaração. Entretanto, um ponto importante que deve ser frisado é que JavaScript possue tipos que são definidos e convertidos durante da execução dos scripts.
35 |
36 | ### Declaração de variáveis
37 | Para a declaração de variáveis é necessário utilizar as palavras chaves var, let ou const onde as mesmas delimitarão o escopo (que entenderemos adiante) e o comportamento da variável.
38 |
39 | Exemplo:
40 |
41 | > var organizacao = 'Opensanca';
42 |
43 | > console.log(organizacao);
44 |
45 | > /* Saída no terminal será: */
46 |
47 | > $ Opensanca
48 |
49 | Se uma variável for declarada fora do modo estrito da linguagem sem a utilização de ***var, let ou const*** a mesma será disponibilizada no escopo global. Este é um comportamento que muitas vezes não é desejado, portanto é de suma importância conhecer e utilizar o modo estrito da linguagem. Para saber mais sobre recomendo a leitura do artigo Strict Mode disponível aqui no blog.
50 |
51 | Vale ressaltar que let e const são funcionalidades adicionadas na ECMAScript 2015 (ES6) portanto é preciso ficar atento com a compatibilidade dos navegadores ou da versão do Nodejs utilizada em seu projeto.
52 |
53 | Variáveis declaradas com const, como o próprio nome diz, possuem comportamento de constantes e devem ser inicializadas em sua declaração, pois, em casos de modo restrito, a exceção SyntaxError será lançada. Não confundam constantes com objetos imutáveis. Em artigos futuros abordaremos melhor a diferença entre ambos.
54 |
55 | ### Hoisting
56 |
57 | Antes de entendermos os escopos e como as variáveis se comportam perante o seu contexto, é imprescindível a compreensão do comportamento de Hoisting.
58 |
59 | Em resumo, todas as declarações, seja de variáveis ou funções, são processadas e elevadas para o topo do arquivo ou da função antes que qualquer código seja executado.
60 |
61 | Observe os códigos abaixo.
62 |
63 | Código "original" onde uma variável foi declarada e atribuído um valor qualquer a mesma dentro de um bloco:
64 |
65 | ```
66 | {
67 | var organizacao = 'Opensanca | JavaScript Full Stack';
68 | }
69 |
70 | console.log(name);
71 |
72 | // $ Opensanca | JavaScript Full Stack
73 |
74 | ```
75 |
76 | Devido ao comportamento de Hoisting a declaração é elevada ao topo do arquivo e a atribuição do valor é mantida dentro do bloco resultando em:
77 |
78 | > var name;
79 |
80 | ```
81 | {
82 | name = 'Trilha Opensanca Developer | Full Stack JavaScript';
83 | }
84 | ```
85 |
86 | > console.log(name);
87 |
88 | > // $ Trilha Opensanca Developer | Full Stack JavaScript
89 |
90 | Vale salientar que variáveis definidas com let ou const ***"não sofrem hoisting"***.
91 |
92 | Caso possua dúvidas sobre este comportamento, fica aqui uma sugestão do artigo sobre Hoisting postado no blog ou este vídeo do canal Aulas de Programação.
93 |
94 | *** Escopos: ***
95 | Existem 3 escopos em que as variáveis podem ser disponibilizadas:
96 |
97 | *** Global: ***
98 | Variáveis declaradas com var fora de funções compõe o escopo global e podem ser acessadas livremente. Exemplo:
99 |
100 | ```
101 | {
102 | // Como não há função, a declaração dentro do bloco sofre
103 | // hoisting e a variável definida com var assume o escopo global
104 | var name = 'Trilha Opensanca Developer | Full Stack JavaScript';
105 | }
106 | ```
107 | > console.log(name);
108 |
109 | > // $ Trilha Opensanca Developer | Full Stack JavaScript
110 |
111 | ### Local (Função)
112 | Variáveis declaradas com var dentro de funções ficam disponíveis localmente dentro do escopo da função. Exemplo:
113 |
114 | ```
115 | function scope() {
116 | var name = 'Trilha Opensanca Developer | Full Stack JavaScript';
117 | console.log(name);
118 | // $ Trilha Opensanca Developer | Full Stack JavaScript
119 | }
120 |
121 | scope();
122 |
123 | console.log(name);
124 | // $ ReferenceError: name is not defined
125 |
126 | ```
127 | ### Bloco
128 | Variáveis declaradas com let e const possuem escopo de bloco, ou seja, são vigentes a partir do bloco em que foram declaradas. Exemplo:
129 | ```
130 | {
131 | let name = 'Trilha Opensanca Developer | Full Stack JavaScript';
132 | console.log(name);
133 | // $ Trilha Opensanca Developer | Full Stack JavaScript
134 | }
135 |
136 | console.log(name);
137 | // $ ReferenceError: name is not defined
138 |
139 | ```
140 | A compreensão plena dos escopos é extremamente importante para evitar comportamentos inesperados e manter nosso código consistente.
141 |
142 | ### Convenções
143 | Para a nomeação de variáveis existem algumas regras que devemos seguir. Há também algumas convenções que podemos adotar para compreendermos certos aspectos do nosso código só de olhar para o nome das variáveis. Dentre elas estão:
144 |
145 | Variáveis devem começar com ***letra, _ ou $***.
146 |
147 | - Utilização do padrão CamelCase. UpperCamelCase para funções construtoras.
148 | - Utiliação do padrão lowerCamelCase para variáveis convencionais.
149 | - Constantes declaradas com CAPITAL_CASING.
150 | - Variáveis locais iniciadas com _.
151 | - Variáveis iniciadas com $ reservadas a frameworks, como o AngularJS e jQuery.
152 |
153 | É claro que dependendo do contexto e da equipe, podem ser adotadas novas convenções ou padrões, o importante é manter a uniformidade do projeto.
154 |
155 | ###### [Material adaptado Zero to Hero JavaScript by Renan Johannsen](http://www.welovedev.com.br/post/zero-to-hero-javascript-variaveis)
156 |
--------------------------------------------------------------------------------
/01.JavaScript/aula-02/README.md:
--------------------------------------------------------------------------------
1 | # Tipos de dados e Objetos
2 |
3 | Nesta aula abordamos os tipos primitivos de dados e algumas características dos objetos em JavaScript.
4 |
5 | Segue alguns links e material para apoio:
6 |
7 | ## Artigos
8 |
9 | We Love Dev:
10 | - [Zero to Hero JavaScript - Tipos de Dados](http://www.welovedev.com.br/post/zero-to-hero-javascript-tipos-de-dados)
11 |
12 | ## Video Aulas
13 |
14 | Rodrigo Branas:
15 |
16 | - [Desvendando a linguagem JavaScript - #2 - Number](https://www.youtube.com/watch?v=-4Er-sZoxHM&index=2&list=PLQCmSnNFVYnT1-oeDOSBnt164802rkegc)
17 | - [Desvendando a linguagem JavaScript - #3 - String](https://www.youtube.com/watch?v=c3vaqf9x1PQ&index=3&list=PLQCmSnNFVYnT1-oeDOSBnt164802rkegc)
18 | - [Desvendando a linguagem JavaScript - #4 - Boolean](https://www.youtube.com/watch?v=oP2ProYre4k&index=4&list=PLQCmSnNFVYnT1-oeDOSBnt164802rkegc)
19 | - [Desvendando a linguagem JavaScript - #5 - undefined e null](https://www.youtube.com/watch?v=dhaLnhvOyFc&index=5&list=PLQCmSnNFVYnT1-oeDOSBnt164802rkegc)
20 | - [Desvendando a linguagem JavaScript - #6 - Object](https://www.youtube.com/watch?v=A_E-K69j93Q&index=6&list=PLQCmSnNFVYnT1-oeDOSBnt164802rkegc)
21 |
22 | Aulas de Programação:
23 | - [Dicas Javascript - Ep03: Objetos e JSON](https://www.youtube.com/watch?v=Bndsk0N_LAk)
24 |
25 | ## Exemplos dados na aula:
26 | - [Exemplo 01 - Boolean](https://github.com/opensanca/trilha-javascript/blob/master/01.JavaScript/aula-02/exemplo-01-boolean.js)
27 | - [Exemplo 02 - Object](https://github.com/opensanca/trilha-javascript/blob/master/01.JavaScript/aula-02/exemplo-02-object.js)
28 | - [Exemplo 03 - Object](https://github.com/opensanca/trilha-javascript/blob/master/01.JavaScript/aula-02/exemplo-03-object.js)
29 | - [Exemplo 04 - Função](https://github.com/opensanca/trilha-javascript/blob/master/01.JavaScript/aula-02/exemplo-04-funcao.js)
30 | - [Exemplo 05 - Object](https://github.com/opensanca/trilha-javascript/blob/master/01.JavaScript/aula-02/exemplo-05-object.js)
31 | - [Exemplo 06 - Funções com Object](https://github.com/opensanca/trilha-javascript/blob/master/01.JavaScript/aula-02/exemplo-06-object-funcao.js)
32 |
33 | ## Exercícios de fixação:
34 | - [Exercício 01](https://github.com/opensanca/trilha-javascript/blob/master/01.JavaScript/aula-02/exercicio-01.js)
35 | - [Exercício 02](https://github.com/opensanca/trilha-javascript/blob/master/01.JavaScript/aula-02/exercicio-02.js)
36 | - [Exercício 03](https://github.com/opensanca/trilha-javascript/blob/master/01.JavaScript/aula-02/exercicio-03.js)
37 |
38 | # Artigo de apoio:
39 |
40 | ## Tipos de dados em JavaScript
41 |
42 | O padrão ECMAScript atual define 7 tipos de dados, sendo 6 primitivos e Object.
43 |
44 | Lista dos tipos primitivos:
45 | - Boolean
46 | - null
47 | - undefined
48 | - Number
49 | - String
50 | - Synbol
51 |
52 | Como o JavaScript é uma linguagem dinamicamente tipada os tipos de dados são convertidos automaticamente durante a execução do script. Isso permite a utilização de uma mesma variável para a atribuição de dois tipos distintos de dados.
53 |
54 | Exemplo:
55 |
56 | ```js
57 | let value = 'Eu sou um texto';
58 | value = 10;
59 | ```
60 |
61 | Outro ponto interessante relacionado a conversão automática é que quanto empregamos o operador de soma em expressões que envolvam valores String e Number o Number é convertido para String, já para os demais operadores como subtração, multiplicação ou divisão a String é convertida para Number.
62 |
63 | Exemplo:
64 |
65 | ```js
66 | '22' + 2;
67 | > '222'
68 |
69 | '22' - 2;
70 | > 20
71 | ```
72 |
73 | Para cenários em que precisamos converter uma String para Number podemos utilizar dois métodos **parseInt(String, base)** onde o parâmetro base é opicional e indica o sistema numérico a ser utilizado e **parseFloat(String)**.
74 |
75 | A seguir encontra-se um pouco mais sobre os tipos de dados.
76 |
77 | ### Boolean
78 |
79 | O tipo boolean é o tipo mais simples de dados e o mesmo possui dois valores literais (true/false) além do wrapper [Boolean](https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Boolean).
80 |
81 | Um ponto importante sobre o JavaScript é que as seguintes expressões são evaluadas como false:
82 |
83 | - false
84 | - 0
85 | - ''
86 | - ""
87 | - NaN
88 | - null
89 | - undefined
90 | - 'false'
91 | - "false"
92 |
93 | Exemplo:
94 |
95 | ```js
96 | if(!("Não é um número" - 22)) { // equivalente a !NaN
97 | console.log('entrou!');
98 | }
99 |
100 | > 'entrou!'
101 | ```
102 |
103 | ## null
104 |
105 | Em JavaScript **null** é o tipo primitivo que indica a ausencia de valor.
106 |
107 | ## undefined
108 |
109 | Em JavaScript **undefined** representa a inexistência de uma determinada propriedade.
110 |
111 | ## Number
112 |
113 | Em JavaScript todos os números são agrupados pelo tipo Number. Além de representar os números o mesmo possui três valores simbólicos, **+Infinity**, **-Infinity** e **NaN**. Isso mesmo, por mais incrível que pareça, typeof NaN é Number!
114 |
115 | Um ponto de atenção é que o JavaScript bem como outras linguagens utilizam o padrão [Double Precision 64-bit binary format IEEE 754](https://en.wikipedia.org/wiki/Double-precision_floating-point_format) para representação dos números e devemos tomar alguns cuidados.
116 |
117 | Exemplo:
118 |
119 | ```js
120 | 0.1 + 0.2;
121 | > 0.30000000000000004
122 | ```
123 |
124 | O "00000000000000004" é um residuo decorrente da operação binária. Veja mais [aqui](http://0.30000000000000004.com/).
125 |
126 | Para compreender e utilizar as principais funções de manipulação de números em JavaScript veja [aqui](http://www.w3schools.com/js/js_number_methods.asp) e para compreender a Math Api veja [aqui](http://www.w3schools.com/jsref/jsref_obj_math.asp).
127 |
128 | ## Synbol
129 |
130 | Definido na ECMAScript 6, representa um tipo de dado cuja as instancias são imutáveis e únicas. Para mais informações veja [aqui](https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Symbol).
131 |
132 | ## String
133 |
134 | Strings são compostas por um conjunto de caracteres e representam um texto, são objetos imutaveis e sua declaração se dá a partir de aspas duplas ou aspas simples.
135 |
136 | Para saber mais sobre os métodos que o Wrapper fornece veja [aqui](http://www.w3schools.com/jsref/jsref_obj_string.asp).
137 |
138 | ## Object
139 |
140 | Em JavaScript não temos classes, construtor ou métodos. Objetos são estruturas de dados dinâmicas de chave valor que comportam qualquer tipo de dados.
141 |
142 | Construção literal de um objeto:
143 |
144 | ```js
145 |
146 | var pessoa = {};
147 |
148 | ```
149 |
150 | A qualquer momento podemos adicionar e remover propriedades de um determinado Objeto.
151 |
152 | Exemplo:
153 |
154 | ```js
155 |
156 | var pessoa = {
157 | nome: 'Renan'
158 | };
159 |
160 | pessoa.idade = 24;
161 |
162 | delete pessoa.nome
163 |
164 | ```
165 |
166 | Propriedades de um determinado objeto podem ser outros objetos bem como funções.
167 |
168 | Exemplo:
169 |
170 | ```js
171 |
172 | var pessoa = {
173 | nome: 'Renan',
174 | endereco: {
175 | logradouro: 'José Inocencio de Camargo Lima Filho',
176 | numero: '223'
177 | },
178 | falar: function() {
179 | console.log('Falar o que?');
180 | }
181 | };
182 |
183 | pessoa.falar();
184 |
185 | > Falar o que?
186 |
187 | ```
188 |
189 | Pelo fato dos objetos em JavaScript serem uma coleção de dados, podemos acessar seus valores através da notação de array.
190 |
191 | Este tipo de notação se mostra muito útil quando precisamos acessar dinâmicamente as propriedades dos objetos.
192 |
193 | Exemplo:
194 |
195 | ```js
196 |
197 | var pessoa = {
198 | nome: 'Renan',
199 | }
200 |
201 | pessoa['idade'] = 24;
202 |
203 | for (var prop in pessoa) {
204 | console.log( pessoa[prop] );
205 | }
206 |
207 | > Renan
208 | > 24
209 |
210 | ```
211 |
--------------------------------------------------------------------------------
/02.MEAN/aula-02/README.md:
--------------------------------------------------------------------------------
1 | # HTTP e Rest;
2 |
3 | Nesta aula abordamos HTTP e REST.
4 |
5 | Abaixo, segue alguns links e material para apoio.
6 |
7 | ## Video Aulas
8 |
9 | Rodrigo Branas:
10 | - [Node.js - #6 - Core Modules - net](https://youtu.be/sx36tuCzUOE?list=PLQCmSnNFVYnTFo60Bt972f8HA4Td7WKwq)
11 | - [Node.js - #7 - Core Modules - http - Parte 1](https://youtu.be/Pp3OCaOCeWk?list=PLQCmSnNFVYnTFo60Bt972f8HA4Td7WKwq)
12 | - [Node.js - #8 - Core Modules - http - Parte 2](https://youtu.be/-TVny5Dxw-I?list=PLQCmSnNFVYnTFo60Bt972f8HA4Td7WKwq)
13 |
14 | # Artigo de apoio
15 |
16 | ## HTTP
17 |
18 | O protocolo HTTP (Hypertext Transfer Protocol) é um protocolo de comunicação entre cliente e servidor.
19 |
20 | Basicamente ele funciona através de Requisições (Request) por parte dos clientes e Respostas (Response) por parte do servidor.
21 |
22 | As requisições e suas respectivas respostas seguem os padrões definidos na [RFC2616](https://tools.ietf.org/html/rfc2616).
23 |
24 | Mais especificamente as requisições possuem o seguinte padrão:
25 |
26 | ### Linha inicial (request line)
27 |
28 | A linha inicial é composta de três partes, separadas por espaço, que especificam o método a ser executado, a identificação do recurso (URI) e a versão do protocolo utilizada.
29 |
30 | Exemplo:
31 |
32 | ```http
33 | POST http://www.minhaapi.com.br/v1/cliente HTTP/1.1
34 | ```
35 |
36 | Basicamente o método detalha o processamento que será efetuado sobre um determinado recurso, a URI identifica o recurso alvo deste processamento e a versão do protocolo especifica a forma de computação da requisição.
37 |
38 | ### Cabeçalho (request header);
39 |
40 | É responsável por transferir informações adicionais entre o cliente e o servidor. Uma estrutura chave-valor, opcional, especificada logo após a request line.
41 |
42 | Exemplo:
43 |
44 | ```http
45 | POST http://www.minhaapi.com.br/v1/cliente HTTP/1.1
46 | Accept: application/json; charset=utf-8
47 | Accept-Language: pt
48 | Content-Type: application/json; charset=utf-8
49 | ```
50 |
51 | O header basicamente detalha os metadados da requisição.
52 |
53 | ### Corpo da requisição (request body)
54 |
55 | Alguns métodos do protocolo HTTP permitem o envio de dados para o servidor através do body da requisição.
56 |
57 | É obrigatório a inserção de uma linha em branco entre o header e o body.
58 |
59 | Exemplo:
60 |
61 | ```http
62 | POST http://www.minhaapi.com.br/v1/cliente HTTP/1.1
63 | Accept: application/json; charset=utf-8
64 | Accept-Language: pt
65 | Content-Type: application/json; charset=utf-8
66 | Content-Length: 39
67 |
68 | { "nome" : "Renan Johannsen de Paula" }
69 | ```
70 |
71 | ### Métodos (request methods)
72 |
73 | Os métodos de uma requisição indicam a ação a ser realizada sobre um determinado recurso.
74 |
75 | Abaixo estão listados os oito métodos suportados pelo protocolo, bem como o seus respectivos objetivos:
76 |
77 | #### OPTIONS
78 |
79 | O método **OPTIONS** consulta os métodos suportados para um determinado recurso do servidor, ou seja, retorna a lista de operações aceitas sobre um determinado recurso.
80 |
81 | Este método é muito útil pois pode ser utilizado e explorado pelos desenvolvedores na construção de robos e na documentação de APIs.
82 |
83 | #### GET
84 |
85 | O método **GET**, como o nome já diz, tem por objetivo a obtenção de um determinado recurso. Por exemplo, se realizarmos um GET sobre a URI **http://www.minhaapi.com.br/v1/clientes** espera-se que o servidor retorne a lista de clientes.
86 |
87 | O método GET é considerado um método **"seguro"**, pois semanticamente esta operação serve apenas para consultas, ou seja, o recurso consultado não sofre alteração. Dado a esta característica o método GET não permite o envio de um body na requisição, pois nenhum dado será inserido ou alterado.
88 |
89 | Sempre que entramos em um website pelo nosso navegador o mesmo efetua uma operação de GET para a obtenção do HTML a ser exibido.
90 |
91 | #### HEAD
92 |
93 | O método **HEAD** é uma variação do método GET onde o body da resposta não é retornada, ou seja, serve para a verificação dos cabeçalhos e do status code retornado pelo servidor. Pode ser utilizado para a validação de um determinado recurso, por exemplo, se um determinado cliente existe.
94 |
95 | #### POST
96 |
97 | O método **POST** serve para o processamento de uma determinada ação e dentre bem como a inclusão de novos registros.
98 |
99 | Por exemplo, ao efetuarmos um POST sobre a URI **http://www.minhaapi.com.br/v1/cliente** um novo cliente será *"inserido"* na base de dados.
100 |
101 | Este método não é considerado **"Seguro"** uma vez que o mesmo cria ou computa ações sobre recursos do servidor.
102 |
103 | #### PUT
104 |
105 | O método **PUT** tem por objetivo alterar um determinado recurso do servidor. Por exemplo, ao efetuar um PUT sobre a URI **http://www.minhaapi.com.br/v1/cliente/10** o cliente cujo ID 10, especificado na URL, será alterado mediante as informações passadas no body.
106 |
107 | #### DELETE
108 |
109 | O método **DELETE** tem por objetivo excluir um determinado recurso do servidor. Por exemplo, ao efetuar um DELETE sobre a URI **http://www.minhaapi.com.br/v1/cliente/10** o cliente cujo ID 10, especificado na URL, será excluído.
110 |
111 |
112 | #### TRACE
113 |
114 | Ecoa o pedido, de maneira que o cliente possa saber o que os servidores intermediários estão mudando em sua requisição.
115 |
116 | #### CONNECT
117 |
118 | Serve para uso com um proxy que possa se tornar um túnel SSL (um túnel pode ser usado, por exemplo, para criar uma conexão segura).
119 |
120 | ### Envio de parâmetros e informações
121 |
122 | Existem diversas formas de enviarmos parâmetros e informações para o servidor. Abaixo entenderemos cada uma delas e sua utilização adequada.
123 |
124 | #### URI
125 |
126 | Podemos enviar parâmetros para o servidor na composição das URIs.
127 |
128 | Por exemplo, identificar de um determinado recurso: **http://www.minhaapi.com.br/v1/cliente/10**.
129 |
130 | #### Query String
131 |
132 | Ao compormos nossa URL podemos passar parâmetros através de uma Query String. Por exemplo, podemos solicitar através de um GET todos os clientes cujo nome é "Renan" e idade de "24" anos: **http://www.minhaapi.com.br/v1/clientes?nome=Renan&idade=24**.
133 |
134 | Reparem que a query começa a partir do **"?"** e que os parâmetros são especificados através de chave valor e separados por **"&"**.
135 |
136 | Obs: O conceito fundamental em utilizar a URI e URL para passarmos parâmetros é a ideia de que, ao copiarmos a URL em outro navegador, ou enviarmos para um amigo, o mesmo recurso será recuperado.
137 |
138 | #### Header
139 |
140 | A ideia de se utilizar o header para passagem de parâmetros, é a de enviar metadados sobre a nossa requisição, bem como informações únicas como o token de autenticação.
141 |
142 | Por exemplo, enviar o tipo de dado que aceito como resposta.
143 |
144 | #### Body
145 |
146 | Em alguns métodos o body não está disponível, entretanto o objetivo dele é enviar os dados a serem computados durante a requisição.
147 |
148 | Por exemplo, ao realizarmos um PUT na URI **"http://www.minhaapi.com.br/v1/cliente/10"** o body deve conter as informações a serem alteradas no recurso.
149 |
150 |
151 | ### Response
152 |
153 | Para cada requisição há uma resposta por parte do host (servidor). As respostas são parecidas com as requisições e possuem uma linha inicial (status-line), cabeçalho (response header) e um possível body.
154 |
155 | A status line é composta pela versão do protocolo HTTP, um código de status (status-code) da resposta, e uma descrição do código do status (reason-phrase).
156 |
157 | O **Status-Code** indica qual o resultado obtido após a computação da requisição. Os status são divididos em famílias e cada família possui uma semântica própria.
158 |
159 | Dentre as famílias estão:
160 |
161 | | Família | Resultado |
162 | | ---------- | ------------- |
163 | | 1xx | Informativo |
164 | | 2xx | Sucesso |
165 | | 3xx | Redirecionamento |
166 | | 4xx | Erro de cliente |
167 | | 5xx | Outros erros |
168 |
169 | Exemplos:
170 | - Se uma requisição retornar **200** como status code significa que tudo foi computado devidamente.
171 | - Se uma requisição retornar **404** quer dizer que o recurso especificado pelo cliente não foi encontrado.
172 | - Se uma requisição retornar **500** quer dizer que um erro inesperado aconteceu no servidor.
173 |
174 | ## REST
175 |
176 | O REST (Transferência de Estado Representacional) é um conjunto de princípios arquiteturais que tem por objetivo a criação de APIs semânticas e padronizadas, aproveitando as funcionalidades disponíveis no protocolo HTTP.
177 |
178 | Parece meio óbvio utilizar as funcionalidades disponíveis no protocolo entretanto a grande parte dos desenvolvedores não conhecem bem o suficiente o protocolo e acabam utilizando o mesmo de forma inadequada.
179 |
180 | Exemplos clássicos do mau uso do protocolo:
181 | - Métodos get que alteram o estado do servidor;
182 | - Despadronização do aceso aos recursos;
183 | - Utilização do POST para a execução de todos os tipos de operações;
184 | - Utilização incorreta dos códigos de status;
185 |
186 | O REST vem frisar os recursos disponíveis no protocolo HTTP e nos auxiliar com a especificação de um conjunto de princípios, listados abaixo, para a criação APIs padronizadas e semânticas.
187 |
188 | ### Princípios
189 |
190 | - Manter a comunicação cliente-servidor livre de estado, ou seja, as requisições HTTP devem conter todos os insumos necessários para o processamento da mesma. Em outras palavras evite ao máximo a utilização de sessão.
191 | - Utilização adequada dos métodos suportados pelo protocolo HTTP. Exemplo: dado um determinado recurso, como **http://www.minhaapi.com.br/v1/cliente/** implicitamente sabemos que se fizermos um post sobre ele, estaríamos realizando a inserção de um novo cliente passado no body; Se executarmos um GET em **http://www.minhaapi.com.br/v1/cliente/10** o resultado esperado é a obtenção do cliente cujo id é 10 e assim por diante.
192 | - Padronização da identificação dos recursos, como **"/cliente"**, **"/usuário"** etc.
193 | - Utilização de hipermídia para interligar as operações. Exemplo, ao inserirmos um cliente, retornar no corpo da mensagem um link para a consulta do cliente inserido, como por exemplo **http://www.minhaapi.com.br/v1/cliente/11** onde o id 11 foi gerado pela inserção do recurso.
194 |
195 | ## Conclusão
196 |
197 | Existem diversas características sobre o protocolo HTTP e sobre o REST propriamente dito que não foram abordados neste artigo, entretanto com os conceitos abordados não temos mais desculpas para negligenciarmos nossas aplicações.
198 |
199 | A seguir encontra-se uma lista de materiais relacionados e indicados para o estudo:
200 |
201 | - [Especificação HTTP - RFC2616](https://tools.ietf.org/html/rfc2616);
202 | - [Como eu expliquei REST para a minha mulher](https://distopico.wordpress.com/traducao-de-how-i-explained-rest-to-my-wife/);
203 |
--------------------------------------------------------------------------------
/03.React+Flux/examples/sancajobs/README.md:
--------------------------------------------------------------------------------
1 | This project was bootstrapped with [Create React App](https://github.com/facebookincubator/create-react-app).
2 |
3 | Below you will find some information on how to perform common tasks.
4 | You can find the most recent version of this guide [here](https://github.com/facebookincubator/create-react-app/blob/master/packages/react-scripts/template/README.md).
5 |
6 | ## Table of Contents
7 |
8 | - [Updating to New Releases](#updating-to-new-releases)
9 | - [Sending Feedback](#sending-feedback)
10 | - [Folder Structure](#folder-structure)
11 | - [Available Scripts](#available-scripts)
12 | - [npm start](#npm-start)
13 | - [npm test](#npm-test)
14 | - [npm run build](#npm-run-build)
15 | - [npm run eject](#npm-run-eject)
16 | - [Displaying Lint Output in the Editor](#displaying-lint-output-in-the-editor)
17 | - [Installing a Dependency](#installing-a-dependency)
18 | - [Importing a Component](#importing-a-component)
19 | - [Adding a Stylesheet](#adding-a-stylesheet)
20 | - [Post-Processing CSS](#post-processing-css)
21 | - [Adding Images and Fonts](#adding-images-and-fonts)
22 | - [Using the `public` Folder](#using-the-public-folder)
23 | - [Using Global Variables](#using-global-variables)
24 | - [Adding Bootstrap](#adding-bootstrap)
25 | - [Adding Flow](#adding-flow)
26 | - [Adding Custom Environment Variables](#adding-custom-environment-variables)
27 | - [Can I Use Decorators?](#can-i-use-decorators)
28 | - [Integrating with a Node Backend](#integrating-with-a-node-backend)
29 | - [Proxying API Requests in Development](#proxying-api-requests-in-development)
30 | - [Using HTTPS in Development](#using-https-in-development)
31 | - [Generating Dynamic `` Tags on the Server](#generating-dynamic-meta-tags-on-the-server)
32 | - [Running Tests](#running-tests)
33 | - [Filename Conventions](#filename-conventions)
34 | - [Command Line Interface](#command-line-interface)
35 | - [Version Control Integration](#version-control-integration)
36 | - [Writing Tests](#writing-tests)
37 | - [Testing Components](#testing-components)
38 | - [Using Third Party Assertion Libraries](#using-third-party-assertion-libraries)
39 | - [Initializing Test Environment](#initializing-test-environment)
40 | - [Focusing and Excluding Tests](#focusing-and-excluding-tests)
41 | - [Coverage Reporting](#coverage-reporting)
42 | - [Continuous Integration](#continuous-integration)
43 | - [Disabling jsdom](#disabling-jsdom)
44 | - [Experimental Snapshot Testing](#experimental-snapshot-testing)
45 | - [Editor Integration](#editor-integration)
46 | - [Developing Components in Isolation](#developing-components-in-isolation)
47 | - [Making a Progressive Web App](#making-a-progressive-web-app)
48 | - [Deployment](#deployment)
49 | - [Building for Relative Paths](#building-for-relative-paths)
50 | - [GitHub Pages](#github-pages)
51 | - [Heroku](#heroku)
52 | - [Modulus](#modulus)
53 | - [Netlify](#netlify)
54 | - [Now](#now)
55 | - [S3 and CloudFront](#s3-and-cloudfront)
56 | - [Surge](#surge)
57 | - [Troubleshooting](#troubleshooting)
58 | - [Something Missing?](#something-missing)
59 |
60 | ## Updating to New Releases
61 |
62 | Create React App is divided into two packages:
63 |
64 | * `create-react-app` is a global command-line utility that you use to create new projects.
65 | * `react-scripts` is a development dependency in the generated projects (including this one).
66 |
67 | You almost never need to update `create-react-app` itself: it delegates all the setup to `react-scripts`.
68 |
69 | When you run `create-react-app`, it always creates the project with the latest version of `react-scripts` so you’ll get all the new features and improvements in newly created apps automatically.
70 |
71 | To update an existing project to a new version of `react-scripts`, [open the changelog](https://github.com/facebookincubator/create-react-app/blob/master/CHANGELOG.md), find the version you’re currently on (check `package.json` in this folder if you’re not sure), and apply the migration instructions for the newer versions.
72 |
73 | In most cases bumping the `react-scripts` version in `package.json` and running `npm install` in this folder should be enough, but it’s good to consult the [changelog](https://github.com/facebookincubator/create-react-app/blob/master/CHANGELOG.md) for potential breaking changes.
74 |
75 | We commit to keeping the breaking changes minimal so you can upgrade `react-scripts` painlessly.
76 |
77 | ## Sending Feedback
78 |
79 | We are always open to [your feedback](https://github.com/facebookincubator/create-react-app/issues).
80 |
81 | ## Folder Structure
82 |
83 | After creation, your project should look like this:
84 |
85 | ```
86 | my-app/
87 | README.md
88 | node_modules/
89 | package.json
90 | public/
91 | index.html
92 | favicon.ico
93 | src/
94 | App.css
95 | App.js
96 | App.test.js
97 | index.css
98 | index.js
99 | logo.svg
100 | ```
101 |
102 | For the project to build, **these files must exist with exact filenames**:
103 |
104 | * `public/index.html` is the page template;
105 | * `src/index.js` is the JavaScript entry point.
106 |
107 | You can delete or rename the other files.
108 |
109 | You may create subdirectories inside `src`. For faster rebuilds, only files inside `src` are processed by Webpack.
110 | You need to **put any JS and CSS files inside `src`**, or Webpack won’t see them.
111 |
112 | Only files inside `public` can be used from `public/index.html`.
113 | Read instructions below for using assets from JavaScript and HTML.
114 |
115 | You can, however, create more top-level directories.
116 | They will not be included in the production build so you can use them for things like documentation.
117 |
118 | ## Available Scripts
119 |
120 | In the project directory, you can run:
121 |
122 | ### `npm start`
123 |
124 | Runs the app in the development mode.
125 | Open [http://localhost:3000](http://localhost:3000) to view it in the browser.
126 |
127 | The page will reload if you make edits.
128 | You will also see any lint errors in the console.
129 |
130 | ### `npm test`
131 |
132 | Launches the test runner in the interactive watch mode.
133 | See the section about [running tests](#running-tests) for more information.
134 |
135 | ### `npm run build`
136 |
137 | Builds the app for production to the `build` folder.
138 | It correctly bundles React in production mode and optimizes the build for the best performance.
139 |
140 | The build is minified and the filenames include the hashes.
141 | Your app is ready to be deployed!
142 |
143 | ### `npm run eject`
144 |
145 | **Note: this is a one-way operation. Once you `eject`, you can’t go back!**
146 |
147 | If you aren’t satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project.
148 |
149 | Instead, it will copy all the configuration files and the transitive dependencies (Webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you’re on your own.
150 |
151 | You don’t have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn’t feel obligated to use this feature. However we understand that this tool wouldn’t be useful if you couldn’t customize it when you are ready for it.
152 |
153 | ## Displaying Lint Output in the Editor
154 |
155 | >Note: this feature is available with `react-scripts@0.2.0` and higher.
156 |
157 | Some editors, including Sublime Text, Atom, and Visual Studio Code, provide plugins for ESLint.
158 |
159 | They are not required for linting. You should see the linter output right in your terminal as well as the browser console. However, if you prefer the lint results to appear right in your editor, there are some extra steps you can do.
160 |
161 | You would need to install an ESLint plugin for your editor first.
162 |
163 | >**A note for Atom `linter-eslint` users**
164 |
165 | >If you are using the Atom `linter-eslint` plugin, make sure that **Use global ESLint installation** option is checked:
166 |
167 | >
168 |
169 | Then add this block to the `package.json` file of your project:
170 |
171 | ```js
172 | {
173 | // ...
174 | "eslintConfig": {
175 | "extends": "react-app"
176 | }
177 | }
178 | ```
179 |
180 | Finally, you will need to install some packages *globally*:
181 |
182 | ```sh
183 | npm install -g eslint-config-react-app@0.3.0 eslint@3.8.1 babel-eslint@7.0.0 eslint-plugin-react@6.4.1 eslint-plugin-import@2.0.1 eslint-plugin-jsx-a11y@2.2.3 eslint-plugin-flowtype@2.21.0
184 | ```
185 |
186 | We recognize that this is suboptimal, but it is currently required due to the way we hide the ESLint dependency. The ESLint team is already [working on a solution to this](https://github.com/eslint/eslint/issues/3458) so this may become unnecessary in a couple of months.
187 |
188 | ## Installing a Dependency
189 |
190 | The generated project includes React and ReactDOM as dependencies. It also includes a set of scripts used by Create React App as a development dependency. You may install other dependencies (for example, React Router) with `npm`:
191 |
192 | ```
193 | npm install --save
194 | ```
195 |
196 | ## Importing a Component
197 |
198 | This project setup supports ES6 modules thanks to Babel.
199 | While you can still use `require()` and `module.exports`, we encourage you to use [`import` and `export`](http://exploringjs.com/es6/ch_modules.html) instead.
200 |
201 | For example:
202 |
203 | ### `Button.js`
204 |
205 | ```js
206 | import React, { Component } from 'react';
207 |
208 | class Button extends Component {
209 | render() {
210 | // ...
211 | }
212 | }
213 |
214 | export default Button; // Don’t forget to use export default!
215 | ```
216 |
217 | ### `DangerButton.js`
218 |
219 |
220 | ```js
221 | import React, { Component } from 'react';
222 | import Button from './Button'; // Import a component from another file
223 |
224 | class DangerButton extends Component {
225 | render() {
226 | return ;
227 | }
228 | }
229 |
230 | export default DangerButton;
231 | ```
232 |
233 | Be aware of the [difference between default and named exports](http://stackoverflow.com/questions/36795819/react-native-es-6-when-should-i-use-curly-braces-for-import/36796281#36796281). It is a common source of mistakes.
234 |
235 | We suggest that you stick to using default imports and exports when a module only exports a single thing (for example, a component). That’s what you get when you use `export default Button` and `import Button from './Button'`.
236 |
237 | Named exports are useful for utility modules that export several functions. A module may have at most one default export and as many named exports as you like.
238 |
239 | Learn more about ES6 modules:
240 |
241 | * [When to use the curly braces?](http://stackoverflow.com/questions/36795819/react-native-es-6-when-should-i-use-curly-braces-for-import/36796281#36796281)
242 | * [Exploring ES6: Modules](http://exploringjs.com/es6/ch_modules.html)
243 | * [Understanding ES6: Modules](https://leanpub.com/understandinges6/read#leanpub-auto-encapsulating-code-with-modules)
244 |
245 | ## Adding a Stylesheet
246 |
247 | This project setup uses [Webpack](https://webpack.github.io/) for handling all assets. Webpack offers a custom way of “extending” the concept of `import` beyond JavaScript. To express that a JavaScript file depends on a CSS file, you need to **import the CSS from the JavaScript file**:
248 |
249 | ### `Button.css`
250 |
251 | ```css
252 | .Button {
253 | padding: 20px;
254 | }
255 | ```
256 |
257 | ### `Button.js`
258 |
259 | ```js
260 | import React, { Component } from 'react';
261 | import './Button.css'; // Tell Webpack that Button.js uses these styles
262 |
263 | class Button extends Component {
264 | render() {
265 | // You can use them as regular CSS styles
266 | return ;
267 | }
268 | }
269 | ```
270 |
271 | **This is not required for React** but many people find this feature convenient. You can read about the benefits of this approach [here](https://medium.com/seek-ui-engineering/block-element-modifying-your-javascript-components-d7f99fcab52b). However you should be aware that this makes your code less portable to other build tools and environments than Webpack.
272 |
273 | In development, expressing dependencies this way allows your styles to be reloaded on the fly as you edit them. In production, all CSS files will be concatenated into a single minified `.css` file in the build output.
274 |
275 | If you are concerned about using Webpack-specific semantics, you can put all your CSS right into `src/index.css`. It would still be imported from `src/index.js`, but you could always remove that import if you later migrate to a different build tool.
276 |
277 | ## Post-Processing CSS
278 |
279 | This project setup minifies your CSS and adds vendor prefixes to it automatically through [Autoprefixer](https://github.com/postcss/autoprefixer) so you don’t need to worry about it.
280 |
281 | For example, this:
282 |
283 | ```css
284 | .App {
285 | display: flex;
286 | flex-direction: row;
287 | align-items: center;
288 | }
289 | ```
290 |
291 | becomes this:
292 |
293 | ```css
294 | .App {
295 | display: -webkit-box;
296 | display: -ms-flexbox;
297 | display: flex;
298 | -webkit-box-orient: horizontal;
299 | -webkit-box-direction: normal;
300 | -ms-flex-direction: row;
301 | flex-direction: row;
302 | -webkit-box-align: center;
303 | -ms-flex-align: center;
304 | align-items: center;
305 | }
306 | ```
307 |
308 | There is currently no support for preprocessors such as Less, or for sharing variables across CSS files.
309 |
310 | ## Adding Images and Fonts
311 |
312 | With Webpack, using static assets like images and fonts works similarly to CSS.
313 |
314 | You can **`import` an image right in a JavaScript module**. This tells Webpack to include that image in the bundle. Unlike CSS imports, importing an image or a font gives you a string value. This value is the final image path you can reference in your code.
315 |
316 | Here is an example:
317 |
318 | ```js
319 | import React from 'react';
320 | import logo from './logo.png'; // Tell Webpack this JS file uses this image
321 |
322 | console.log(logo); // /logo.84287d09.png
323 |
324 | function Header() {
325 | // Import result is the URL of your image
326 | return ;
327 | }
328 |
329 | export default Header;
330 | ```
331 |
332 | This ensures that when the project is built, Webpack will correctly move the images into the build folder, and provide us with correct paths.
333 |
334 | This works in CSS too:
335 |
336 | ```css
337 | .Logo {
338 | background-image: url(./logo.png);
339 | }
340 | ```
341 |
342 | Webpack finds all relative module references in CSS (they start with `./`) and replaces them with the final paths from the compiled bundle. If you make a typo or accidentally delete an important file, you will see a compilation error, just like when you import a non-existent JavaScript module. The final filenames in the compiled bundle are generated by Webpack from content hashes. If the file content changes in the future, Webpack will give it a different name in production so you don’t need to worry about long-term caching of assets.
343 |
344 | Please be advised that this is also a custom feature of Webpack.
345 |
346 | **It is not required for React** but many people enjoy it (and React Native uses a similar mechanism for images).
347 | An alternative way of handling static assets is described in the next section.
348 |
349 | ## Using the `public` Folder
350 |
351 | >Note: this feature is available with `react-scripts@0.5.0` and higher.
352 |
353 | Normally we encourage you to `import` assets in JavaScript files as described above. This mechanism provides a number of benefits:
354 |
355 | * Scripts and stylesheets get minified and bundled together to avoid extra network requests.
356 | * Missing files cause compilation errors instead of 404 errors for your users.
357 | * Result filenames include content hashes so you don’t need to worry about browsers caching their old versions.
358 |
359 | However there is an **escape hatch** that you can use to add an asset outside of the module system.
360 |
361 | If you put a file into the `public` folder, it will **not** be processed by Webpack. Instead it will be copied into the build folder untouched. To reference assets in the `public` folder, you need to use a special variable called `PUBLIC_URL`.
362 |
363 | Inside `index.html`, you can use it like this:
364 |
365 | ```html
366 |
367 | ```
368 |
369 | Only files inside the `public` folder will be accessible by `%PUBLIC_URL%` prefix. If you need to use a file from `src` or `node_modules`, you’ll have to copy it there to explicitly specify your intention to make this file a part of the build.
370 |
371 | When you run `npm run build`, Create React App will substitute `%PUBLIC_URL%` with a correct absolute path so your project works even if you use client-side routing or host it at a non-root URL.
372 |
373 | In JavaScript code, you can use `process.env.PUBLIC_URL` for similar purposes:
374 |
375 | ```js
376 | render() {
377 | // Note: this is an escape hatch and should be used sparingly!
378 | // Normally we recommend using `import` for getting asset URLs
379 | // as described in “Adding Images and Fonts” above this section.
380 | return ;
381 | }
382 | ```
383 |
384 | Keep in mind the downsides of this approach:
385 |
386 | * None of the files in `public` folder get post-processed or minified.
387 | * Missing files will not be called at compilation time, and will cause 404 errors for your users.
388 | * Result filenames won’t include content hashes so you’ll need to add query arguments or rename them every time they change.
389 |
390 | However, it can be handy for referencing assets like [`manifest.webmanifest`](https://developer.mozilla.org/en-US/docs/Web/Manifest) from HTML, or including small scripts like [`pace.js`](http://github.hubspot.com/pace/docs/welcome/) outside of the bundled code.
391 |
392 | Note that if you add a `