É muito bom termos diferentes empresas e pessoas investindo em diferentes ideias - isto traz evolução e facilidades, e quem ganha é o desenvolvedor que gosta de se atualizar.
Antes de falar de Node.js, segue uma breve contextualização histórica do Asp, conforme minha visão (E você entenderá a importância de conhecer o Node.js também para o uso em server) :
- o Asp antigo tinha como fundamento script server que misturava html e javascript no mesmo arquivo, como o PHP da época. Este foi completamente substituído pelo Asp.net;
- o Asp.net Webforms foi uma tentativa de facilitar a entrada de desenvolvedores .net Windows Forms para aplicações Web. Principalmente por abstrair o html com um desenvolvimento RAD. A Microsoft ainda mantém estas bibliotecas, mas não deverá evoluí-las, pois já fez as duas evoluções abaixo
- o Asp.net MVC foi uma resposta necessária a quem gostaria de desenvolver utilizando o MVC (padrão muito interessante), como no struts do Java e no Ruby on Rails. Também foi a primeira iniciativa de ser open source, conforme o post do ScottGu ASP.NET MVC, Web API, Razor and Open Source
- Houve facilidades para desenvolvimento colaborativo com o uso do Nuget (que permitiu atualizações mais rápidas, necessárias para não esperar a framework e utilização de pacotes de terceiros).
- Um segundo passo foi dado em 2014 quando direcionou o uso do Nuget para pacotes exclusivos .net e sugeriu o padrão de comunidade para task runners e front end, como cheguei a comentar no post Gulp, Grunt, Bower e npm no Visual Studio (Aqui já começa um pouco da parceria com o Node.js e porque deveríamos conhecer este ambiente javascript)
- Agora, o Asp.net Core olhou para a simplicidade, leveza, escalabilidade e desempenho do Node.js que está sendo amplamente utilizado também do lado server. Para superar o Node.js o trabalho não foi pequeno, demandando uma framework completamente nova e enxuta. O post "Como está a preocupação do ASPNET 5(Core) em relação a desempenho?" chegou a comentar as iniciativas em andamento na época
- O investimento em comunidade expandiu, com todo o fonte do Asp.net core no Github, com reuniões semanais divulgando evoluções do trabalho da Microsoft e da comunidade no ASP.NET Community Standup, suporte ao Linux e Mac para desenvolvimento (VS Code), e suporte ao Linux para produção - além do já esperado Windows.
Quem é este tal de Node.js?
No site oficial é explicado conforme abaixo:Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient. Node.js' package ecosystem, npm, is the largest ecosystem of open source libraries in the world.
Node.js é um runtime javascript construído em cima do engine Javascript do Chrome V8. Node.js usa uma orientação a evento, modelo I/O não bloqueante que o faz eficiente e leve. O ecossistema de pacotes do Node.js, npm, é o maior ecossistema de bibliotecas de código aberto do mundo.
(Tradução livre)
Fontes para conhecer e entender
O título deste post é sobre impressões porque toda a comparação foi feita com estudos introdutórios, uso de pacotes do Gulp (algumas análises de erros nestes pacotes e estudo dos fontes abaixo para um embasamento teórico maior):- Um introdução breve para o node.js https://github.com/maxogden/art-of-node
- Learn You The Node.js é um workshop introdutório NodeSchool.io. Trata de um conjunto de problemas de programação que introduzem padrões nodes comuns. Acessível através de linha de comando.
Por que usar o Node.js?
O post Top 10 Reasons To Use Node.js destaca bons motivos práticos e aproveitarei para tirar alguns aprendizados para pensarmos no mundo .net e .net core. Reforço que não tenho experiência prática com uso do Node.js além dos pacotes de task runner, por isso estou baseando na experiência do post.1. Conhecimento do Javascript
No desenvolvimento Web com certeza você utiliza o Javascript no cliente e poderia utilizar este conhecimento no server. Fácil de aprender, parece com Java, C# e se você trabalha com Web, já utiliza no lado cliente há anos.
Com o uso de Typescript ainda é possível trazer checagem de tipo estática e últimas funcionalidades do ECMAScript. A compatibilidade com navegadores é total, já que transpila para Javascript normal.
2. É rápido
Utiliza o engine v8 desenvolvido pelo Google para uso no Chrome e compila o javascript em código de máquina nativo. Ainda tem o “event loop”, que processa todas operções de I/O em uma única thread, de forma assíncrona.O Node.js é assíncrono por padrão em operações de I/O e isto orienta o desenvolvimento de maneira mais escalável e com maior desempenho. No artigo How To: Scale .NET Applications, bem antigo da Microsoft, esta ideia já é compartilhada e incentivada:
If your application contains tasks that can be performed simultaneously and independently of one another and the application runs on a single processor server, you should asynchronously execute the tasks. Asynchronous processing is more beneficial for I/O bound tasks and is less beneficial when the tasks are CPU bound and restricted to a single processor
Se sua aplicação contém tarefas que podem ser executadas simultaneamente e independentemente uma das outras e a aplicação executa em um servidor de processador único, você deve executar as tarefas assincronamente. Processamento assíncrono é mais benéfico para tarefas ligadas a I/O e menos benéfico quando as tarefas são ligadas ao CPU e restritas ao processador único.(Tradução livre)
3. Ferramentas
Há várias ferramentas para ajudar no ambiente. Npm que é o gerenciador de pacote muito bom e facilita muito a vida do desenvolvedor – rápido, robusto, consistente, ajudando inclusive a resolver dependências entre diferentes versões. Até ele tem concorrente, que é o Yarn feito pelo facebook.Todo o ambiente de Task Runner com o uso do Gulp, Grunt e Bower também.
4. Você já sabe javascript, novamente
É possível expandir a utilização do javascript no client, server e banco de dados em bancos documentais que salvam JSON como o MongoDB – na verdade este armazendo um BSON.5. Real-time de forma fácil
Node.js supera em conexões simultâneas e também no uso do protocolo websockets, que é uma conexão de duas vias entre o cliente e servidor.Na rodada 13 de testes do techempower foi a estreia do asp.net core que bateu o Node.js no cenário de plaintext pela primeira vez. Foram 1,822,366 requisições por segundo do asp.net contra 467,246 do Node.js.
Já o cenário de Json o Node continuou ganhando, fazendo 304,372 requisições por segundo contra 264,649 do asp.net core. Vamos esperar a rodada 14 para mais evoluções e dessa disputa que quem ganha são os desenvolvedores.
6. Streaming de dados
Node pode fazer stream para websockets e ler e escrever para http, fazendo um pipe.7. Uma base de código rodando no client e server
Neste tópico é citado da framework Meteor, que no post é citado da seguinte maneira:Meteor is a next-generation web framework built atop Node. It runs the same codebase on the both the client and server. This allows you to write client code that saves directly to a database. Then, that data is automatically persisted to the server. It works the other way too!Não tenho conhecimento para comentar sobre o Meteor
Meteor é uma framework web de próxima geração contruída em cima do Node. Ele roda a mesma base de código no cliente e servidor. Isto permite que você escreva código cliente que salve diretamente na base de dados. Então, o dados é automaticamente persitido noservidor. Ele funciona no outro caminho também!
8. Mantenedor corporativo
O risco de trabalhar com qualquer projeto código aberto é ele ser abandonado por seus mantenedores voluntários. O Node é mantido pela Joyent e utilizado por grandes empresas.9. Hosting
Há opções de host de PaaS (Product as a service) como o Modulus. Também o Heroku.O docker também é um facilitador para ambiente e host para Node e para asp.net core.
10. Todo desenvolvedor sabe (um pouco de) javascript
Já foi dito na vantagem 1 e 4 e o post repetiu na 10: achar desenvolvedores com conhecimento é sempre difícil, então pelo javascript ser tão utilizado, facilita este processo de encontrar profissionais ou até forma-los.Acrescendo outros que percebi
Facilidade de instalação e execução
Facilidade de executar programas, podendo escrever um simples arquivo texto que não precisa compilar ou até passar uma simples linha de comando com a string do código a ser executado com após o argumento -pe (Veja aqui todas as opçoes de argumentos), como exemplo:
node -pe "require('url').parse('/test?q=1', true)"
node -pe "require('url').parse('/test?q=1', true)"
O .net core introduziou também um CLI para competir neste área.