Problemas de nó js

Node.js permite o uso de Javascript no lado do servidor. É isso aí. O Node.js está tentando resolver o problema que os programadores iniciantes e ruins têm: eles tendem a pensar que tudo se resume ao aprendizado de linguagens. Já que você precisa de Javascript de qualquer maneira, é melhor usá-lo no back-end, argumentam eles.

No entanto, é uma linguagem lamentavelmente inadequada. É muito melhor limitar o uso de Javascript no front-end e usar uma linguagem melhor no back-end. E assim, sim, existem muitas alternativas. Melhores alternativas. Estruturas Python. Estruturas Ruby. Frameworks Java. Estruturas de Haskell.

O Node foi criado com o objetivo de permitir que programadores ruins tenham a ilusão de que realmente podem fazer do lado do servidor. Em vez de resolver o problema aprendendo tecnologias reais do lado do servidor, os criadores do Node decidiram que a zona de conforto é mais importante do que a solução de problemas e, ao aderir às mesmas práticas ruins que usam no cliente, terão sucesso no servidor. Em vez disso, eles criaram uma bolha monstruosa de ferramentas complexas e com vazamento e, o triste, sua incapacidade de seguir boas práticas empurra os outros, interessados ​​em cortar atalhos, economizar no aprendizado e no autoaperfeiçoamento. O JavaScript nasceu no navegador e tem que ficar onde pertence - no navegador. Não é adequado para o servidor e nunca será, pois a motivação por trás do Node é a motivação errada - a intenção de fugir ao invés de resolver.

Em primeiro lugar, o Node.js fornece um sistema sem bloqueio para lidar com um grande número de solicitações. Isso é obtido por meio do procedimento de loop de evento. Em segundo lugar, a linguagem é Javascript, portanto, podem-se usar os mesmos objetos e infraestrutura usados ​​no cliente (front end) e no servidor (back end). Terceiro, mas não menos importante: as solicitações do cliente podem interferir umas nas outras, porque o servidor Node.js (que é um processo Node.js em execução no back end) está ouvindo as solicitações e usa o mesmo pool de dados comum (que é o memória do processo) para todos os clientes. Para ser mais específico, você pode configurar um cenário, por exemplo, algumas mesas de pôquer, e ouvir as solicitações de modificação desse cenário, por exemplo, novas mesas, jogadores entrando e saindo das mesas, cartas jogadas, etc. Todas essas solicitações são captadas pelo único Nó .js instância que atua como um servidor no back end e após o processamento dessas solicitações (via procedimento de loop de evento), o servidor Node.js pode mudar o cenário e sinalizar mudanças para todos os clientes onde cada cliente tem sempre uma solicitação aberta que aguarda por tal alterar. Cada cliente que recebe essas alterações pode adaptar o cenário local no front end e definir outra solicitação aguardando por novas alterações e assim por diante até que o cliente se desconecte do servidor usando uma solicitação de desconexão específica, etc.

Bem, nodejs é inspirado no servidor nginx. Em um servidor como o xampp, para cada solicitação, uma thread separada é alocada, o que requer muita memória, o nodejs não gera novas threads para cada solicitação que usa loop de evento e libuv para falsificar o comportamento de threading, portanto, usa menos memória. Ele roda V8, que é escrito em c ++. Se você estiver procurando por uma alternativa, eu diria que dê uma olhada em go. Go é escrito pelo Google e usa algo chamado rotinas go, que é muito leve. Foi feito para programação do lado do servidor. E no que diz respeito ao dimensionamento, lembre-se de que o nodejs não precisa dimensionar o seu aplicativo. Portanto, depende do que você faz depois de atingir a escala de limite máximo. Netflix usa nodejs agora eles estão migrando para Go se eu estiver correto. Há uma boa palestra no YouTube “nodejs at Netflix” ou algo parecido, você terá uma boa ideia sobre a arquitetura nodejs e suas vantagens e desvantagens em escala.

Eu nunca vi uma declaração do tipo “nós somos Node. Todas as outras linguagens estão com [branco] errado, então vamos resolver isso ”. Dito isso, alguns dos problemas que vi resolver em ação são

  • Fragmentação de equipe / projeto. A frente e o verso compartilham o mesmo código principal, então quase não há "a equipe de front-end está esperando que a equipe de back-end termine ____, então eles começarão nesse recurso"
  • Multiprocessamento. Java e outros têm uma vantagem com o multithreading, mas há questões de arquitetura que vêm junto com ele. A natureza assíncrona e não bloqueadora do Node permite que ele trabalhe muito mais com um único thread sem nem mesmo tocar na simultaneidade. Java diz “Preciso de mais 7 pessoas para me ajudar com isso”. Node diz “Vou começar a fazer isso, mas posso fazer outras coisas enquanto estiver trabalhando”.
  • Portabilidade: não é uma VM no sentido que o Java é, mas suas dependências estão mais no binário (e nos pacotes de nós instalados) em si e não no sistema. Portanto, se eu escrever uma ferramenta usando o Node v7 na minha máquina local e enviá-la para o servidor que está executando o Node v7, executo `npm install && npm run start`, e as coisas simplesmente funcionam. Mesmo se eu escrever essa ferramenta no linux e compartilhar com um colega de trabalho que usa mac.

Acho que o Node.js se limitava a permitir que os programadores familiarizados com JavaScript trouxessem suas habilidades do front-end para o back-end.

Existe uma tecnologia madura o suficiente para uma alternativa? Claro, muitos deles. Java, C #, Python, SmallTalk, Ruby, existem várias opções mais maduras. Node.js é muito novo, na verdade, tem apenas 8 anos. Não é maduro, como tal.

Como eu disse, acho que se trata apenas de permitir que as pessoas familiarizadas com JavaScript tragam suas habilidades para o backend. Acho que é muito bobo, pois qualquer programador decente que pode trabalhar em JS pode trabalhar em outra linguagem com bastante facilidade.

Eu acho que é loucura termos que continuar fingindo que aprender um novo idioma é um grande negócio. Em vez de apenas aprender um bom idioma, colocamos um idioma horrível no servidor para que as pessoas evitem aprender algo novo.

O que o Node.js realmente está tentando resolver?

O objetivo principal era permitir que o JavaScript fosse usado para o desenvolvimento de scripts e servidores, como é um caso de uso comum para uma variedade de linguagens de programação. Isso teve o efeito imediato de segunda ordem de reduzir o atrito cognitivo associado ao desenvolvimento no navegador e no servidor; ser capaz de usar um único idioma é uma bênção.

Além disso, o Node.js procurou tornar mais fácil escrever aplicativos do lado do servidor que não experimentavam o bloqueio de IO, aproveitando um modelo de execução assíncrona que fazia sentido com o Event Loop do JavaScript. Na época, isso era incomum para linguagens de programação digitadas dinamicamente e tinha implicações de desempenho impressionantes que o tornavam atraente para o desenvolvimento em.

Existe uma tecnologia madura o suficiente para ser escolhida como alternativa ao Node.js?

Embora não existam alternativas reais para o desenvolvimento de aplicativos do lado do servidor em JavaScript, existem muitas opções maduras e robustas para tal desenvolvimento em outras linguagens.

PHP, Ruby e Python são linguagens de back-end comuns que compartilham a tipagem dinâmica do JavaScript. C, C #, C ++, Java, etc. são mais maduros (e geralmente mais capazes por recurso computacional), tirando vantagem da tipagem estática e são frequentemente vistos em grandes corporações.

Bem, esta é uma pergunta surpreendente com respostas surpreendentes.

  1. O que é Node.js e o que ele está tentando resolver?
  2. O que é Node.js: Node.js é um sistema do lado do servidor que se baseia no mecanismo JavaScript v8 do Chromium
  3. A v8 é muito madura com três compiladores diferentes e implementando alguns conceitos muito interessantes quando se trata de design de compilador
  4. JavaScript também é uma linguagem madura. Eu aceito que tem suas falhas, mas é ótimo à sua maneira.
  5. O que ele está tentando resolver: O mecanismo v8 JS está muito bem conservado, é open source e já temos uma coleção enorme de bibliotecas JS. JS é bem articulado pela especificação ECMAScript. Com tudo no lugar e nenhum fornecedor controlando qualquer coisa específica, seria uma pena não adotá-lo como uma opção do lado do servidor.
  6. Finalmente: a própria v8 é extensível, portanto, você não está realmente limitado pelo JavaScript (ao contrário da maioria das reivindicações). Os aplicativos de nó podem ter a maioria de seus blocos de código em C / C ++, se necessário.
  7. O que é realmente bom em
  8. Velocidade de desenvolvimento
  9. Excelente gerenciador de pacotes
  10. Grande portabilidade (muito raramente você encontra cenários em que, para a mesma versão do nodejs, o programa funciona bem em um computador, mas falha em outro -> é claro que existem alguns pacotes dependentes do sistema operacional)
  11. O que é realmente ruim em
  12. Você precisa de muitos pacotes externos (desenvolvidos por vários clientes de terceiros usando diferentes - às vezes licenças incompatíveis) para começar com um projeto típico
  13. Ainda não tão maduro quanto o Java, por exemplo, quando se trata de bibliotecas devops do lado do servidor
  14. O teste de unidade é menos trivial em comparação com Ruby, por exemplo
  15. Ainda é uma linguagem interpretada, então você pode perder alguns problemas
  16. O próprio JavaScript é bastante estranho por ser muito assíncrono e não ter nenhum controle de thread adequado. Portanto, as pessoas costumam achar que o Node teria problemas de dimensionamento.
  17. O que as pessoas muitas vezes esquecem ao descrever o nó
  18. Ele pode realmente aceitar o código C como parte de um pacote -> Então você tem um plugin extensível e rápido incrível -> e você pode interagir com este componente C a partir de JavaScript
  19. NodeJS já suporta ES6, então é mais fácil escrever provas formais para seus programas. (usando expressões lambda - ES6 Lambda Expressions • Chris Ng)
  20. Os pesquisadores também estão bastante entusiasmados com a criação de boas bibliotecas para o node.
  21. Alternativas para nó
  22. Este é o único servidor web JavaScript que conheço
  23. Mas se você estiver olhando para qualquer linguagem de programação do lado do servidor, há muitas para citar. Java para começar.

Como nenhuma das respostas anteriores citou qualquer fonte, citarei Ryan Dahl (criador do Node):

Este é o projeto node.js:
Para fornecer uma infra-estrutura puramente de eventos e sem bloqueio para criar scripts de programas altamente simultâneos.

O deck de slides ainda pode ser encontrado em

http://tinyclouds.org/jsconf.pdf

.

O Node foi originalmente inspirado por EventMachine e Twisted, que são provavelmente antecessores conceituais. Contudo; não há nada citando especificamente o Node apenas como uma tecnologia da web.

Existem outras bibliotecas para escrever código JavaScript do lado do servidor.

Eclipse Vert.x

amadureceu mais, embora pareça ter enfatizado Java recentemente. Um tempo de execução baseado em Rhino chamado

280north / narwhal

é outra, mas nunca realmente ganhou impulso. De modo geral, não há nenhum outro tempo de execução de JavaScript que amadureceu para o nível que o Node tem.

No que diz respeito à escolha de tecnologias alternativas, existem toneladas de opções maduras. C, C ++, Java, Elixir, Ruby, Golang e várias outras linguagens podem realizar muitas das mesmas operações de alto nível que o Node pode. Lembre-se de que a tecnologia sempre trata de escolher ou criar a ferramenta certa para uma tarefa, portanto, não há uma resposta geral para essa pergunta.

O nó evoluiu para um ecossistema. Este ecossistema desempenhou um papel importante na popularização do JavaScript. Acessibilidade (graças ao npm) e engajamento (graças à popularidade do JavaScript) são indiscutivelmente os novos desafios enfrentados pela comunidade Node.js. Desenvolvedores de todas as áreas incorporaram o Node em seu cinto de ferramentas. Embora possa ser difícil filtrar o ruído de tantas vozes, no final das contas isso move todo o setor de software para a frente, trazendo à tona os melhores conceitos e implementações à medida que aumentam de popularidade. A partir dessa perspectiva, comunidades alternativas envolvem principalmente linguagens de nível inferior, como C / C ++ / Java, que forneceram avanços semelhantes para o campo da programação. Embora diferente, Golang também tem uma série de semelhanças que ressoam bem com os conceitos do Node, incluindo uma comunidade crescente.

O Node.JS está tentando criar um único ecossistema onde todos os componentes de um aplicativo, seja ele front-end, back-end, aplicativo de desktop, aplicativo móvel, podem ser escritos em uma linguagem, que é Java Script.

O Node.JS também fornece flexibilidade, chamadas assíncronas e, o mais importante, pode ser feito para se comportar funcional e orientado a objetos conforme e quando necessário (esta propriedade é basicamente devida ao JavaScript, mas pode ser usada em muitos aplicativos exclusivos)

O ecossistema de código aberto é um boom por causa do Node e NPM, basta pensar em um pacote e já está lá no NPM, basta instalar e usar. Isso é muito útil para desenvolvedores que agora podem se concentrar no desenvolvimento de aplicativos em vez de componentes individuais.

A única falha que o Node.JS sofre é que os aplicativos escritos em Node não podem ser escalados além de um limite, embora o limite seja grande, mas ainda existem muitos sistemas práticos que excedem esse limite. Para escalar, você precisa modificar a arquitetura completamente ou usar alguns pacotes diferentes, mas esta é uma solução de curto prazo. Para uma solução de longo prazo, eu sugiro mudar para Scala, com seu comportamento OOP e funcional, é o novo player no mercado. Mas aprender é uma tarefa muito difícil.

Portanto, primeiro dê uma olhada no scala e depois decida. Scala também possui frameworks como “akka” para camada HTTP e “Slick” para gerenciamento de banco de dados.

Existem dois problemas principais que o NodeJS resolve. O primeiro, que outros já mencionaram, é ter um único idioma para todas as partes do seu aplicativo. Não subestime os benefícios disso. Ele permite uma refatoração mais simples da lógica entre as camadas e abre a porta para a transição de talentos entre as funções tradicionais de retaguarda e front-end. Também permite algumas ferramentas consistentes, incluindo gerenciamento de pacotes, bibliotecas, etc. Jogue em algo como Cordova e você pode desenvolver para o servidor, navegador e dispositivo móvel com uma equipe.

A segunda é lidar com E / S de maneira não bloqueadora. Embora a maioria das linguagens e tempos de execução orientados para a web agora tenham uma biblioteca ou framework orientado a eventos sem bloqueio - por exemplo, Twisted for Python (ok, Twisted antecede NodeJS, mas não era tão comumente usado até recentemente), EventMachine para Ruby, ReactPHP para PHP, Reactor para JVM, etc. - este é um fenômeno relativamente novo. Anteriormente, você tinha bloqueio de E / S em tempos de execução imperativos de thread único ou era forçado a escrever seu próprio multi-threading para lidar com isso. Como a maioria dos aspectos dos sites são I / O, você teve que esperar muito, muitas vezes guardando memória para cada solicitação durante essa espera. Nesses casos, o NodeJS permitiu uma maior taxa de transferência e densidade de solicitação do que outros tempos de execução. Agora isso veio com problemas de simultaneidade ilimitada e ter que planejar a contrapressão em um sistema de alto volume, mas ainda era um progresso.

Com a introdução desses outros frameworks, é discutível se NodeJS é a solução certa para

seu

caso de uso. Mas você desenvolve com a equipe que tem, não a equipe que você quer ou deseja ter mais tarde - parafraseando uma certa pessoa infame. Em nosso caso, se eu quiser uma API leve e vinculada a I / O, provavelmente irei começar com NodeJS. Isso porque somos principalmente uma loja de PHP e - para ser franco - não confio no ReactPHP ainda (

PHP foi feito para morrer

)