Node.js v6 suporta praticamente toda a especificação ES6/ES2015
Com o release da 6ª versão do Node.js podemos contar com o suporte de praticamente toda especificação ES6/ES2015! Além de diversas mudanças notáveis, a versão 6 conta com a atualização do V8 para a versão 5.0, o que nos deixa com incríveis 93% de suporte para as features ES6/ES2015. Note que essa atualização inclui praticamente todas features realmente úteis para os desenvolvedores, já que o V8 (assim como outras implementações) tendem a priorizar o que é mais importante/relevante.
A versão 6 já é a versão atual e pode ser baixada agora mesmo! Se você usa o nvm, o upgrade pode ser feito via linha de comando: bash nvm install v6
Sintaxe ES6/ES2015
Vamos ver algumas das features introduzidas com a versão 6:
default parameters
Nos permite inicializar parâmetros com valores padrão, caso nenhum valor tenha sido especificado, ou caso o valor seja undefined
.
(function braziljs( date = '26 e 27 de Agosto', city = 'Porto Alegre' ) { console.log(`BrazilJS Conf, ${date}, ${city}`); }());
Veja mais sobre default parameters.
RegExp flags "y" e "u"
A RegExp /y
, também chamada de sticky, busca apenas a partir do índice indicado pela propriedade lastIndex
da expressão regular na string.
// Exemplo retirado da MDN var str = '#foo#'; var regex = /foo/y; regex.lastIndex = 1; regex.test(str); // true regex.lastIndex = 5; regex.test(str); // false (lastIndex é levado em conta com a flag /y) regex.lastIndex; // 0
A RefExp /u
(unicode) lida com pares substitutos (tais como \uD83D\uDE80
) como code points e permite que você use code points escapes Unicode (como o \u{1F680}
) em expressões regulares.
"𠮷".match(/^.$/u)[0].length === 2;
Leia mais: http://www.2ality.com/2015/07/regexp-es6.html https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/RegExp/sticky http://stackoverflow.com/questions/4542304/what-does-regex-flag-y-do
PS: Para realmente entender Unicode na ES6/ES2015 (eu não entendi :/), leia o artigo do Mathias Bynens: https://mathiasbynens.be/notes/es6-unicode-regex
Destructuring
É uma expressão JavaScript que torna possível extrair dados de qualquer objeto que seja iterável e coloca-los em outras variáveis.
// Arrays var [event, year] = ['BrazilJS', 2016] console.log(event); // BrazilJS console.log(year); // 2016 Arrays var braziljs = ["BrazilJS", "26 e 27 de Agosto", "Porto Alegre"]; var [event, date, city] = braziljs; console.log(event); // "BrazilJS" console.log(date); // "26 e 27 de Agosto" console.log(city); // "Porto Alegre"
// Objetos var event = { name: 'BrazilJS', date: '26 e 27 de Agosto' }; var { name, date } = event; console.log(name); // BrazilJS console.log(date); // 26 e 27 de Agosto
// Generator function* informacoes() { yield "BrazilJS"; yield "26 e 27 de Agosto"; yield "Porto Alegre"; } var [event, date] = informacoes(); console.log(event); // BrazilJS console.log(date); // 26 e 27 de Agosto
Veja mais sobre Destructuring. let O let
já era suportado, porém somente em strict-mode
. A partir da versão 6 já é possível usar o let
a qualquer momento. O let
declara uma variável em um escopo por bloco. (function() { if(!braziljs) { let event = 'BrazilJS'; console.log(event); // BrazilJS } console.log(event); // event não existe }());
Vale lembrar que as semânticas do let
em modo "sloppy" são diferentes, então o recomendado ainda é usar ele em strict-mode
. Veja mais sobre o let. class o suporte ao uso do class
somente era possível em outras versões utilizando a flag --harmony
. A partir da versão 6 o uso de classes pode ser feito a qualquer momento. breathe () { console.log(`${this.name} is breathing`); } } class Dog extends Animal { constructor(name) { super(name); } bark() { console.log("Woof! Woof! " + this.name + ' is barking'); } } let dog = new Dog('Costelinha'); dog.breathe(); // Costelinha is breathing dog.bark(); // Woof! Woof! Costelinha is barking // Exemplo original em: https://github.com/jaydson/js-future-in-the-present
Leia mais sobre classes. Proxy Proxy é um objeto usado para definir um comportamento customizado para operações. var handler = { get: function (target, name) { console.log(`Pegando ${name}`); } }; var event = new Proxy({}, handler); event.name = 'BrazilJS'; var n = event.name; // Pegando name
Saiba mais sobre Proxy. Reflect É um objeto que fornece métodos para operações que podem ser capturadas. var obj = { name: "BrazilJS" }; var name = Reflect.get(obj, "name"); console.log(name); //BrazilJS
Saiba mais sobre Reflect. Sobre módulos Mas e a sintaxe de módulos ES6/ES2015? Nem o V8 e nem o Node.js ainda possuem suporte a módulos ES6/ES2015. Essa parte não é tão fácil de ser implementada e precisa de um estudo maior, que é o que está acontecendo no momento. Existem issues abertas no projeto node-eps
, que é um repositório para discussões sobre possíveis funcionalidades futuras do Node.js. Além disso, existe uma proposta bem sólida, elaborada por Dave Herman, Yehuda Katz e Caridy Patiño, para solucionar o uso de módulos ES6/ES2015 no ambiente Node.js. Saiba mais sobre módulos. Conclusão Ainda existem muitas outras features ES6/ES2015 não cobertas neste artigo, mas é possível notar que o suporte no Node.js está quase completo. É muito bom ver a evolução da plataforma e ver como o projeto está maduro e caminhando para um futuro cada vez mais promissor.