Je ne comprends pas bien ce que Node.js est tout au sujet. C'est peut-être parce que je suis principalement développeur d'applications Web. Qu'est-ce que c'est et à quoi ça sert?
Jusqu'à présent, je comprends que:
- Le modèle de programmation est axée sur l' événement, en particulier la façon dont il gère les E / S .
- Il utilise JavaScript et l'analyseur est V8 .
- Il peut être facilement utilisé pour créer des applications serveur simultanées.
Mes compréhensions sont-elles correctes? Si oui, alors quels sont les avantages des E / S éventuelles, est-ce juste plus pour les choses simultanées? En outre, la direction de Node.js doit-elle devenir un modèle de programmation basé sur JavaScript (basé sur V8)?
J'utilise Node.js au travail et le trouve très puissant. Forcé de choisir un mot pour décrire Node.js, je dirais "intéressant" (qui n'est pas un adjectif purement positif). La communauté est dynamique et en croissance. JavaScript, malgré ses bizarreries, peut être un excellent langage pour coder. Et vous repenserez quotidiennement votre propre compréhension des "meilleures pratiques" et des modèles de code bien structuré. Il y a une énorme énergie d'idées qui coule dans Node.js en ce moment, et y travailler vous expose à toutes ces pensées - une excellente haltérophilie mentale.
Node.js en production est certainement possible, mais loin du déploiement "clé en main" apparemment promis par la documentation. Avec Node.js v0.6.x, "cluster" a été intégré à la plate-forme, fournissant l'un des blocs de construction essentiels, mais mon script "production.js" est toujours ~ 150 lignes de logique pour gérer des choses comme la création du journal répertoire, recyclage des travailleurs morts, etc. Pour un service de production "sérieux", vous devez également être prêt à limiter les connexions entrantes et à faire tout ce que fait Apache pour PHP . Pour être juste, Ruby on Rails a exactement ce problème. Il est résolu via deux mécanismes complémentaires: 1) Mettre Ruby on Rails / Node.Apache / Lighttd ). Le serveur Web peut servir efficacement le contenu statique, accéder à la journalisation, réécrire les URL, mettre fin à SSL , appliquer les règles d'accès et gérer plusieurs sous-services. Pour les demandes qui atteignent le service de nœud réel, le serveur Web procède par procuration à la demande. 2) Utiliser un framework comme Unicorn qui gérera les processus de travail, les recyclera périodiquement, etc. Je n'ai pas encore trouvé de framework de service Node.js qui semble complètement cuit; il peut exister, mais je ne l'ai pas encore trouvé et j'utilise toujours ~ 150 lignes dans mon "production.js" roulé à la main.
La lecture de frameworks comme Express donne l'impression que la pratique standard consiste à tout servir par le biais d'un service Node.js polyvalent ... "app.use (express.static (__ dirname + '/ public'))" . Pour les services et le développement à faible charge, c'est probablement bien. Mais dès que vous essayez d'imposer une charge de temps importante à votre service et de le faire fonctionner 24h / 24 et 7j / 7, vous découvrirez rapidement les motivations qui poussent les grands sites à avoir un code C bien cuit et durci comme Nginx qui gère leur site et gère tous des demandes de contenu statique (... jusqu'à ce que vous configuriez un CDN , comme Amazon CloudFront )). Pour un point de vue quelque peu humoristique et sans vergogne, voyez ce gars .
Node.js trouve également de plus en plus d'utilisations hors service. Même si vous utilisez autre chose pour servir du contenu Web, vous pouvez toujours utiliser Node.js comme outil de construction, en utilisant des modules npm pour organiser votre code, Browserify pour l' assembler en un seul actif et uglify-js pour le réduire pour le déploiement . Pour traiter avec le Web, JavaScript est une correspondance d'impédance parfaite et fréquemment, ce qui en fait la voie d'attaque la plus simple. Par exemple, si vous voulez parcourir un tas de charges utiles de réponse JSON , vous devez utiliser mon module de soulignement-CLI , la ceinture utilitaire de données structurées.
Avantages / inconvénients:
Vers un modèle simple à un processus par demande ( LAMP ):
Contre l'écriture d'un "vrai" service en Java / C # / C (C? Vraiment?)
Pour une autre perspective sur JavaScript et Node.js, consultez De Java à Node.js , un article de blog sur les impressions et les expériences d'un développeur Java en apprenant Node.js.
Modules Lorsque vous envisagez un nœud, gardez à l'esprit que votre choix de bibliothèques JavaScript DÉFINIRA votre expérience. La plupart des gens en utilisent au moins deux, un assistant de modèle asynchrone (Step, Futures, Async) et un module de sucre JavaScript ( Underscore.js ).
Helper / JavaScript Sugar:
Modules de motifs asynchrones:
Ou pour tout savoir sur les bibliothèques asynchrones, consultez cet entretien avec les auteurs.
Cadre Web:
Essai:
Consultez également la liste officielle des modules Node.js recommandés. Cependant, le Wiki Node Modules de GitHub est beaucoup plus complet et une bonne ressource.
Pour comprendre Node, il est utile de considérer quelques-uns des choix de conception clés:
Node.js est basé sur les événements et asynchrone / non bloquant. Les événements, comme une connexion HTTP entrante, déclencheront une fonction JavaScript qui fait un peu de travail et lance d'autres tâches asynchrones comme la connexion à une base de données ou l'extraction de contenu d'un autre serveur. Une fois ces tâches lancées, la fonction d'événement se termine et Node.js se rendort. Dès que quelque chose se produit, comme la connexion à la base de données établie ou le serveur externe répondant avec du contenu, les fonctions de rappel se déclenchent et plus de code JavaScript s'exécute, ce qui peut potentiellement déclencher encore plus de tâches asynchrones (comme une requête de base de données). De cette façon, Node.js entrelacera avec plaisir les activités de plusieurs workflows parallèles, exécutant toutes les activités débloquées à tout moment. C'est pourquoi Node.js fait un excellent travail en gérant des milliers de connexions simultanées.
Pourquoi ne pas simplement utiliser un processus / thread par connexion comme tout le monde?Dans Node.js, une nouvelle connexion n'est qu'une très petite allocation de tas. Faire tourner un nouveau processus prend beaucoup plus de mémoire, un mégaoctet sur certaines plates-formes. Mais le coût réel est le surcoût associé au changement de contexte. Lorsque vous avez 10 ^ 6 threads de noyau, le noyau doit faire beaucoup de travail pour déterminer qui doit exécuter ensuite. Un tas de travail a été consacré à la création d'un planificateur O (1) pour Linux, mais en fin de compte, c'est juste beaucoup plus efficace d'avoir un seul processus événementiel que 10 ^ 6 processus en compétition pour le temps CPU. En outre, dans des conditions de surcharge, le modèle multi-processus se comporte très mal, affamant les services d'administration et de gestion critiques, en particulier SSHD (ce qui signifie que vous ne pouvez même pas vous connecter à la boîte pour comprendre à quel point il est vraiment vissé).
Node.js est UNIQUE FILETÉ et FREE LOCK . Node.js, en tant que choix de conception très délibéré, n'a qu'un seul thread par processus. Pour cette raison, il est fondamentalement impossible pour plusieurs threads d'accéder simultanément aux données. Ainsi, aucun verrou n'est nécessaire. Les fils sont durs. Vraiment vraiment dur. Si vous n'y croyez pas, vous n'avez pas fait assez de programmation threadée. Obtenir un verrouillage correct est difficile et entraîne des bogues très difficiles à détecter. L'élimination des verrous et du multi-threading fait disparaître l'une des classes de bugs les plus méchantes. Cela pourrait être le plus grand avantage du nœud.
Mais comment puis-je profiter de ma boîte à 16 cœurs?
Deux façons:
Node.js vous permet de faire des choses vraiment puissantes sans transpirer. Supposons que vous ayez un programme Node.js qui effectue diverses tâches, écoute les commandes sur unport TCP , code certaines images, peu importe. Avec cinq lignes de code, vous pouvez ajouter un portail de gestion Web basé sur HTTP qui affiche l'état actuel des tâches actives. Cela est facile à faire:
Vous pouvez maintenant frapper une URL et vérifier l'état de votre processus en cours. Ajoutez quelques boutons, et vous avez un "portail de gestion". Si vous avez un script Perl / Python / Ruby en cours d'exécution, simplement "lancer un portail de gestion" n'est pas exactement simple.
Mais JavaScript n'est-il pas lent / mauvais / diabolique / apparition du diable? JavaScript a des bizarreries bizarres, mais avec "les bonnes parties" il y a un langage très puissant là-dedans, et en tout cas, JavaScript est LE langage sur le client (navigateur). JavaScript est là pour rester; d'autres langues le ciblent en tant qu'IL, et des talents de classe mondiale sont en concurrence pour produire les moteurs JavaScript les plus avancés. En raison du rôle de JavaScript dans le navigateur, une énorme quantité d'efforts d'ingénierie sont déployés pour rendre le JavaScript flamboyant rapide. V8est le dernier et le meilleur moteur javascript, au moins pour ce mois. Il fait exploser les autres langages de script en termes d'efficacité ET de stabilité (en vous regardant, Ruby). Et cela ne fera que s'améliorer avec d'énormes équipes travaillant sur le problème chez Microsoft, Google et Mozilla, en compétition pour construire le meilleur moteur JavaScript (Ce n'est plus un "interprète" JavaScript car tous les moteurs modernes font des tonnes de JITcompilation sous le capot avec interprétation uniquement comme solution de rechange pour le code à exécution unique). Oui, nous souhaitons tous pouvoir corriger quelques-uns des choix de langage JavaScript les plus étranges, mais ce n'est vraiment pas si mal. Et le langage est tellement flexible que vous ne codez vraiment pas JavaScript, vous codez Step ou jQuery - plus que tout autre langage, en JavaScript, les bibliothèques définissent l'expérience. Pour créer des applications Web, vous devez à peu près tout de même connaître JavaScript, donc le codage avec lui sur le serveur a une sorte de synergie de compétences. Cela ne m'a pas fait peur d'écrire du code client.
De plus, si vous détestez VRAIMENT JavaScript, vous pouvez utiliser du sucre syntaxique comme CoffeeScript . Ou tout autre élément qui crée du code JavaScript, comme Google Web Toolkit (GWT).
En parlant de JavaScript, qu'est-ce qu'une "fermeture"? - Une façon plutôt élégante de dire que vous conservez des variables à portée lexicale sur les chaînes d'appels. ;) Comme ça:
Voyez comment vous pouvez simplement utiliser "myData" sans rien faire de gênant comme le ranger dans un objet? Et contrairement à Java, la variable "myData" n'a pas besoin d'être en lecture seule. Cette puissante fonctionnalité de langage rend la programmation asynchrone beaucoup moins verbeuse et moins douloureuse.
L'écriture de code asynchrone sera toujours plus complexe que l'écriture d'un simple script à un seul thread, mais avec Node.js, ce n'est pas beaucoup plus difficile et vous obtenez de nombreux avantages en plus de l'efficacité et de l'évolutivité de milliers de connexions simultanées. ..
la source
V8 est une implémentation de JavaScript. Il vous permet d'exécuter des applications JavaScript autonomes (entre autres).
Node.js est simplement une bibliothèque écrite pour V8 qui fait des E / S éventuelles. Ce concept est un peu plus compliqué à expliquer, et je suis sûr que quelqu'un répondra avec une meilleure explication que je ... L'essentiel est que , plutôt que de faire une entrée ou de sortie et d' attendre que cela se produise, il vous suffit ne pas attendre pour qu'il se termine. Par exemple, demandez la dernière heure de modification d'un fichier:
Cela peut prendre quelques millisecondes ou quelques secondes. Avec les E / S éventuelles, vous déclenchez simplement la demande et au lieu d'attendre, vous attachez un rappel qui s'exécute lorsque la demande se termine:
Cela ressemble beaucoup au code JavaScript dans le navigateur (par exemple, avec la fonctionnalité de style Ajax ).
Pour plus d'informations, vous devriez consulter l'article Node.js est vraiment passionnant, ce qui était mon introduction à la bibliothèque / plate-forme ... Je l'ai trouvé assez bon.
la source
Node.js est un outil de ligne de commande open source conçu pour le code JavaScript côté serveur. Vous pouvez télécharger une archive tar , compiler et installer la source. Il vous permet d'exécuter des programmes JavaScript.
Le JavaScript est exécuté par le V8 , un moteur JavaScript développé par Google qui est utilisé dans le navigateur Chrome . Il utilise une API JavaScript pour accéder au réseau et au système de fichiers.
Il est populaire pour ses performances et sa capacité à effectuer des opérations parallèles.
Voici quelques bons articles sur le sujet.
la source
Les fermetures sont un moyen d'exécuter du code dans le contexte dans lequel il a été créé.
Par souci de concordance, cela signifie que vous pouvez définir des variables, puis lancer une fonction d' E / S non bloquante et lui envoyer une fonction anonyme pour son rappel.
Une fois la tâche terminée, la fonction de rappel s'exécutera dans le contexte des variables, c'est la fermeture.
La raison pour laquelle les fermetures sont si bonnes pour écrire des applications avec des E / S non bloquantes est qu'il est très facile de gérer le contexte des fonctions s'exécutant de manière asynchrone.
la source
Deux bons exemples concernent la façon dont vous gérez les modèles et utilisez les améliorations progressives avec. Vous avez juste besoin de quelques morceaux légers de code JavaScript pour le faire fonctionner parfaitement.
Je vous recommande fortement de regarder et de lire ces articles:
Choisissez n'importe quelle langue et essayez de vous rappeler comment vous géreriez vos modèles de fichiers HTML et ce que vous deviez faire pour mettre à jour un nom de classe CSS unique dans votre structure DOM (par exemple, un utilisateur a cliqué sur un élément de menu et vous voulez qu'il soit marqué comme "sélectionné" et mettre à jour le contenu de la page).
Avec Node.js, c'est aussi simple que de le faire en code JavaScript côté client. Obtenez votre nœud DOM et appliquez votre classe CSS à cela. Obtenez votre nœud DOM et innerHTML votre contenu (vous aurez besoin de code JavaScript supplémentaire pour ce faire. Lisez l'article pour en savoir plus).
Un autre bon exemple est que vous pouvez rendre votre page Web compatible avec JavaScript activé ou désactivé avec le même morceau de code. Imaginez que vous ayez sélectionné une date en JavaScript qui permettrait à vos utilisateurs de choisir n'importe quelle date à l'aide d'un calendrier. Vous pouvez écrire (ou utiliser) le même morceau de code JavaScript pour le faire fonctionner avec votre JavaScript activé ou désactivé.
la source
Il existe une très bonne analogie avec les fast-foods qui explique le mieux le modèle événementiel de Node.js, voir l'article complet, Node.js, Doctor's Offices and Fast Food Restaurants - Understanding Event-driven Programming
En voici un résumé:
Node.js est piloté par les événements, mais la plupart des serveurs Web sont basés sur des threads. York explique comment fonctionne Node.js:
Vous utilisez votre navigateur Web pour effectuer une demande de "/about.html" sur un serveur Web Node.js.
Le serveur Node.js accepte votre demande et appelle une fonction pour récupérer ce fichier à partir du disque.
Pendant que le serveur Node.js attend la récupération du fichier, il traite la prochaine demande Web.
Lorsque le fichier est récupéré, une fonction de rappel est insérée dans la file d'attente des serveurs Node.js.
Le serveur Node.js exécute cette fonction qui dans ce cas afficherait la page "/about.html" et la renverrait à votre navigateur Web. "
la source
Eh bien, je comprends que
Pour moi, cela signifie que vous aviez raison dans les trois hypothèses. La bibliothèque semble prometteuse!
la source
N'oubliez pas non plus de mentionner que le V8 de Google est TRÈS rapide. Il convertit en fait le code JavaScript en code machine avec les performances correspondantes du binaire compilé. Donc, avec toutes les autres grandes choses, c'est incroyablement rapide.
la source
Q: Le modèle de programmation est commandé événement, en particulier la façon dont il gère les E / S .
Correct. Il utilise des rappels, donc toute demande d'accès au système de fichiers entraînerait l'envoi d'une demande au système de fichiers, puis Node.js commencerait à traiter sa prochaine demande. Il ne s'inquiéterait de la demande d'E / S qu'une fois qu'il obtiendrait une réponse du système de fichiers, auquel cas il exécuterait le code de rappel. Cependant, il est possible d'effectuer des demandes d'E / S synchrones (c'est-à-dire des demandes de blocage). Il appartient au développeur de choisir entre asynchrone (rappels) ou synchrone (en attente).
Q: Il utilise JavaScript et l'analyseur est V8.
Oui
Q: Il peut être facilement utilisé pour créer des applications serveur simultanées.
Oui, bien que vous ayez besoin de coder manuellement beaucoup de JavaScript. Il serait peut-être préférable de regarder un framework, tel que http://www.easynodejs.com/ - qui est fourni avec une documentation en ligne complète et un exemple d'application.
la source