Question

Je ne soient pas totalement ce que Node.js est tout au sujet. Peut-être parce que je suis principalement un développeur d'applications basées sur le Web. Qu'est-ce et quel est l'usage?

Si je comprends bien ce jour est que:

  1. Le modèle de programmation est commandé événement, en particulier la façon dont il gère E / S .
  2. Il utilise JavaScript et l'analyseur est V8 .
  3. Il peut être facilement utilisé pour créer des applications concurrentes de serveur.

sont mes compréhensions correctes? Si oui, quels sont les avantages de evented E / S, est-il un peu plus pour les choses de la concurrence? En outre, la direction est de Node.js pour devenir un cadre comme, JavaScript basé (V8 basé) modèle de programmation?

Était-ce utile?

La solution

Je pense que les avantages sont les suivants:

  1. Développement Web dans un langage dynamique (JavaScript) sur une machine virtuelle qui est incroyablement rapide (V8). Il est beaucoup plus rapide que Ruby, Python ou Perl.

  2. Capacité à gérer des milliers de connexions simultanées avec une surcharge minimale sur un seul processus.

  3. JavaScript est parfait pour les boucles événement avec des objets de première fonction de la classe et les fermetures. Les gens savent déjà comment l'utiliser de cette façon ayant utilisé dans le navigateur pour répondre aux événements initiés par l'utilisateur.

  4. Beaucoup de gens connaissent déjà JavaScript, même les gens qui ne prétendent pas être les programmeurs. Il est sans doute le langage de programmation le plus populaire.

  5. Utilisation de JavaScript sur un serveur web ainsi que le navigateur réduit la désadaptation d'impédance entre les deux environnements de programmation qui peuvent communiquer des structures de données via JSON qui fonctionnent de la même des deux côtés de l'équation. DUPLICATA code de validation peut être partagée entre le serveur et le client, etc.

Autres conseils

J'utilise Node.js au travail, et je trouve qu'il est très puissant. Contraint de choisir un mot pour décrire Node.js, je dirais « intéressant » (ce qui est un adjectif purement positif). La communauté est dynamique et en pleine croissance. JavaScript, en dépit de ses bizarreries peut être une grande langue au code. Et vous revoir tous les jours votre propre compréhension des « meilleures pratiques » et les modèles de code bien structuré. Il y a une énergie énorme d'idées qui se jettent dans Node.js en ce moment, et qui y travaillent vous expose à toute cette pensée -. Grande Haltérophilie mentale

Node.js dans la production est certainement possible, mais loin du déploiement « clés en main » apparemment promis par la documentation. Avec Node.js v0.6.x, « cluster » a été intégré dans la plate-forme, fournissant un des éléments essentiels, mais mon script « de production.js » est toujours ~ 150 lignes de la logique pour gérer des choses comme la création du journal annuaire, le recyclage des travailleurs morts, etc. pour un service de production « sérieux », vous devez également être prêt à accélérer les connexions entrantes et faire toutes les choses que Apache fait pour PHP . Pour être juste, Ruby on Rails a cette exactement problème. Il est résolu par deux mécanismes complémentaires: 1) Mettre Ruby on Rails / Node.js derrière un serveur web dédié (écrit en C et testé en enfer et le dos) comme Nginx (ou Apache / < a href = "http://en.wikipedia.org/wiki/Lighttpd" rel = "nofollow noreferrer"> Lighttd ). Le serveur Web peut servir efficacement du contenu statique, l'enregistrement d'accès, réécriture des URL, mettre fin à SSL , appliquer des règles d'accès et gérer des sous-services multiples. Pour les demandes qui ont frappé le service de nœud réel, le serveur Web proxie la demande par l'intermédiaire. 2) L'utilisation d'un cadre comme Licorne qui va gérer les processus de travail, les recycler périodiquement, etc. J'ai encore à trouver un cadre au service Node.js qui semble complètement cuit; il peut exister, mais je n'ai pas encore trouvé et toujours utiliser ~ 150 lignes dans mes roulés à la main « production.js ».

cadres de lecture comme express fait paraître comme la pratique courante est de servir juste tout à travers une prise-of service de tous les corps de métier ... "app.use (express.static (__ dirname + '/ public'))". Pour les services à faible charge et le développement, qui est probablement très bien. Mais dès que vous essayez de mettre grand temps de chargement sur votre service et le faire tourner 24/7, vous découvrirez rapidement les motivations qui poussent les grands sites d'avoir bien cuit au four, C code durci comme Nginx fronting leur site et le traitement de toutes les demandes de contenu statique (... jusqu'à ce que vous configurez un CDN, comme Amazon CloudFront )). Pour une prise quelque peu humoristique et sans vergogne négatif sur ce sujet, consultez ce type .

Node.js est également de trouver de plus en plus utilise sans service. Même si vous utilisez quelque chose d'autre pour servir du contenu web, vous pouvez toujours utiliser Node.js comme outil de construction, en utilisant NPM modules pour organiser votre code, Browserify pour piquer en un seul atout, et enlaidir-js pour rapetisser pour le déploiement Pour traiter le web, JavaScript est un parfait noreferrer JSON charges utiles de réponse , vous devez utiliser mon souligner-CLI module , l'utilitaire de ceinture de données structurées.

Avantages / inconvénients:

  • Pro: Pour un type de serveur, JavaScript écrit sur le back-end a été une « drogue passerelle » à l'apprentissage des modèles d'interface utilisateur moderne. Je ne redoute plus l'écriture de code client.
  • Pro: erreur tend à encourager une bonne vérification (erreur est retourné par la quasi-totalité des callbacks, lancinante du programmeur pour le manipuler, aussi, async.js et autres bibliothèques gèrent la « échouer si l'une de ces sous-tâches échoue » paradigme beaucoup mieux que code synchrone typique)
  • Pro: Certaines intéressant et normalement les tâches difficiles deviennent triviales - comme l'obtention du statut des tâches en vol, la communication entre les travailleurs, ou le partage de l'état du cache
  • Pro: communauté énorme et des tonnes de grandes bibliothèques à partir d'un gestionnaire de paquets solide (NPM)
  • Con: JavaScript n'a pas de bibliothèque standard. Vous obtenez tellement habitué à la fonctionnalité que l'importation fait bizarre lorsque vous utilisez JSON.parse ou une autre construction de méthode qui ne nécessite pas l'ajout d'un module NPM. Cela signifie qu'il ya de tout cinq versions. Même les modules inclus dans les Node.js « de base » ont cinq autres variantes devraient vous être satisfait de l'implémentation par défaut. Cela conduit à une évolution rapide, mais aussi un certain niveau de confusion.

par rapport à un modèle simple d'un processus par demande ( LAMP ):

  • Pro: Adaptable à des milliers de connexions actives. Très rapide et très efficace. Pour une flotte web, cela pourrait signifier une 10X réduction du nombre de cases requises par rapport à PHP ou Ruby
  • Pro: L'écriture des motifs parallèles est facile. Imaginez que vous avez besoin d'aller chercher trois (ou N) de blobs Memcached. Faites ceci en PHP ... vous avez juste écrire le code le récupérera la première blob, puis le second, puis le troisième? Wow, c'est lent. Module Il y a une PECL pour résoudre ce problème spécifique pour Memcached, mais si vous voulez pour aller chercher des données Memcached en parallèle avec votre requête de base de données? En Node.js, parce que le paradigme est asynchrone, ayant une demande web faire plusieurs choses en parallèle est très naturel.
  • Con: code asynchrone est fondamentalement plus complexe que le code synchrone et la courbe d'apprentissage à l'avance peut être difficile pour les développeurs sans une solide compréhension de ce que l'exécution simultanée signifie en fait. Pourtant, il est nettement moins difficile que d'écrire tout type de code multithread avec verrouillage.
  • Con: Si une demande de calcul intensif dure, par exemple, 100 ms, il sera le traitement décrochage d'autres demandes qui sont traitées dans le même processus Node.js ... Alias, coopérative multi-tâches. Ceci peut être atténué avec le modèle Web Workers (essaimage un sous-processus pour faire face à la tâche coûteuse). Sinon, vous pouvez utiliser un grand nombre de travailleurs Node.js et ne laisser chacun gérer simultanément une seule demande (encore assez efficace, car il n'y a pas de recyclage processus).
  • Con: Exécution d'un système de production est beaucoup plus compliqué qu'un modèle CGI comme Apache + PHP, Ruby , etc. exceptions non gérées apporteront vers le bas l'ensemble du processus, la logique qui nécessite de redémarrer les travailleurs défectueux (voir groupe ). les modules avec voiturette code natif peut dur plantage du processus. a chaque fois qu'un travailleur décède, les demandes qui lui manipulait sont abandonnées, donc une API buggy peut facilement dégrader le service pour d'autres API a co-organisé.

Versus écrire un service "réel" en Java / C # / C (C? Vraiment?)

  • Pro: Faire asynchrone Node.js est plus facile que de faire-fil de sécurité partout ailleurs et sans doute plus avantageux offre. Node.js est de loin le moins paradigme asynchrone douloureux que j'ai jamais travaillé. Avec de bonnes bibliothèques, il est seulement un peu plus difficile que l'écriture de code synchrone.
  • Pro: Non multithreading / bugs de verrouillage. Il est vrai que vous investissez à l'avant dans l'écriture de code plus verbeux qui exprime un flux de travail asynchrone approprié sans opérations de blocage. Et vous avez besoin d'écrire des tests et obtenir la chose à travailler (il est un langage de script et de graisse doigtés noms de variables n'est pris au moment de l'unité-test). Mais, une fois que vous obtenez de travailler, la surface bug logiciel inhabituel - des problèmes étranges qui ne manifeste une fois dans un million de pistes - cette surface est juste beaucoup plus faible. Les taxes d'écriture Code Node.js sont fortement chargés avant dans la phase de codage. Ensuite, vous avez tendance à finir avec le code stable.
  • Pro: JavaScript est beaucoup plus léger pour exprimer la fonctionnalité. Il est difficile de prouver avec des mots, mais JSON , typage dynamique, la notation lambda, l'héritage prototypique, modules légers, peu importe ... il tend juste à prendre moins de code pour exprimer les mêmes idées.
  • Con: Peut-être que vous avez vraiment, vraiment comme le codage des services en Java

Pour une autre perspective sur JavaScript et Node.js, consultez de Java à Node.js , un billet de blog sur les impressions des développeurs Java et des expériences d'apprentissage Node.js.


Modules Lorsque le noeud considérant, garder à l'esprit que votre choix de bibliothèques JavaScript sera DEFINIR votre expérience. La plupart des gens utilisent au moins deux, un assistant de modèle asynchrone (étape, à terme, Async), et un module de sucre JavaScript ( Underscore.js ).

Aide / JavaScript sucre:

  • Underscore.js - utiliser. Simplement fais-le. Votre code est agréable et facile à lire avec des trucs comme _.isString (), et _.isArray (). Je ne suis pas sûr de savoir comment vous pouvez écrire du code en toute sécurité autrement. En outre, pour la ligne de commande-fu améliorée, consultez mon -CLI Souligné.

Modules de modèle asynchrone:

  • étape - d'une manière très élégante d'exprimer les combinaisons d'actions série et parallèle. Mon reccomendation personnel. Voir mon message sur quel code étape ressemble.
  • Futures - beaucoup plus flexible (est-ce vraiment une bonne chose?) Façon d'exprimer la commande parexigences. Peut exprimer des choses comme "commencer a, b, c en parallèle. Lorsque A, et la finition B, AB commencer. Lorsque A, et la finition C, commencer AC." Une telle flexibilité, il faut plus de soin pour éviter des bugs dans votre flux de travail (comme jamais appeler le rappel ou l'appeler plusieurs fois). Voir poste Raynos sur l'utilisation des contrats à terme (ce qui est le poste qui m'a fait "get" à terme).
  • Async - plus bibliothèque traditionnelle avec une méthode pour chaque motif. J'ai commencé avec cela avant ma conversion religieuse à l'étape et la réalisation ultérieure que tous les modèles de Async pourraient être exprimées à l'étape avec un paradigme unique plus lisible.
  • TameJS - Écrit par OKCupid, c'est un précompilateur qui ajoute une nouvelle langue primative « attendre » pour l'écriture élégante série et des flux parallèles. Le modèle semble incroyable, mais il nécessite de pré-compilation. Je fais toujours mon esprit sur celui-ci.
  • StreamlineJS - concurrent TameJS. Je penche vers Tame, mais vous pouvez faire votre propre opinion.

Ou lire tout sur les bibliothèques asynchrones, consultez ce panel- entrevue avec les auteurs.

Cadre Web:

  • Exprimez Grand Ruby on Rails-cadre ESK pour l'organisation des sites Web. Il utilise JADE comme moteur de templating XML / HTML, ce qui rend la construction HTML beaucoup moins douloureux, même presque élégante.
  • jQuery En devenant pas techniquement un module de noeud, jQuery est rapidement de facto standard pour interface utilisateur côté client. jQuery fournit des sélecteurs CSS comme à la « requête » pour les ensembles d'éléments DOM qui peuvent ensuite être opérés (gestionnaires d'ensemble, propriétés, styles, etc.). Dans le même ordre d'idées, Twitter Bootstrap cadre de CSS, Backbone.js un le motif de MVC, et Browserify.js pour assembler tous vos fichiers JavaScript dans un seul fichier. Ces modules sont de plus en normes de facto de sorte que vous devriez au moins les vérifier si vous ne l'avez pas entendu parler d'eux.

Test:

  • JSHint - Doit utiliser; Je n'ai pas utilisé cela d'abord qui semble aujourd'hui incompréhensible. JSLint rajoute un tas de vérifications de base que vous obtenez avec un langage compilé comme Java. entre parenthèses Mismatched, variables non déclarées, typeos de nombreuses formes et tailles. Vous pouvez également activer diverses formes de ce que j'appelle « le mode anal » où vous vérifiez le style d'espaces et ainsi de suite, ce qui est bien si c'est votre tasse de thé - mais la valeur réelle vient d'obtenir une rétroaction instantanée sur le numéro de ligne exact où vous avez oublié une fermeture « ) » ... sans avoir à exécuter votre code et appuyez sur la ligne incriminée. "JSHint" est une variante plus configurable de Douglas Crockford 's JSLint .
  • concurrent Mocha pour Serment quiJe commence à préférer. Les deux cadres gèrent les bases assez bien, mais les modèles complexes ont tendance à être plus facile à exprimer Mocha.
  • Serment de Serment est vraiment très élégant. Et il affiche un joli rapport (--spec) vous montrant quels cas de test réussi / échoué. Passez 30 minutes d'apprentissage, et vous pouvez créer des tests de base pour vos modules avec un minimum d'effort.
  • Zombie - test Headless HTML et JavaScript à l'aide JSDom comme virtuel "navigateur". Substance très puissante. Combiner avec Replay pour obtenir des tests rapides comme l'éclair déterministe de code dans le navigateur.
  • Un commentaire sur la façon de « penser à » test:
    • Le test est non facultative. Avec un langage dynamique comme le JavaScript, il y a très quelques contrôles statiques. Par exemple, en passant deux paramètres à une méthode qui attend 4 ne cassera pas jusqu'à ce que le code est exécuté. Assez bas pour créer la barre des bugs en JavaScript. tests de base sont essentiels pour faire l'écart de vérification avec les langages compilés.
    • Oubliez la validation, il suffit de faire votre code exécuter. Pour chaque méthode, mon premier cas de validation est « casse rien », et c'est le cas qui se déclenche le plus souvent. Prouver que votre code fonctionne sans jeter les prises 80% des insectes et fera beaucoup pour améliorer votre confiance de code que vous vous trouvez retourner et en ajoutant les cas de validation nuancées vous avez sauté.
    • Commencez petit et de briser la barrière d'inertie. Nous sommes tous paresseux, et pressés par le temps, et il est facile de voir que le test « travail supplémentaire ». Donc, commencer petit. Ecrire cas test 0 - charger votre module et rapport succès. Si vous vous forcez à le faire autant, puis la barrière d'inertie à l'essai est cassé. C'est <30 min pour le faire la première fois, y compris la lecture de la documentation. Maintenant, écrivez cas test 1 - appeler un de vos méthodes et de vérifier « casse rien », c'est que vous ne recevez pas une erreur de retour. Cas de test 1 devrait vous prendre moins d'une minute. Avec l'inertie disparu, il devient facile d'étendre progressivement votre couverture de test.
    • Maintenant évoluer vos tests avec votre code. Ne vous laissez pas intimider par ce que le test de bout en bout « correcte » ressemblerait avec les serveurs maquettes et tout cela. Code commence simple et évolue pour traiter de nouveaux cas; Les tests devraient aussi. Comme vous ajoutez de nouveaux cas et nouvelle complexité à votre code, ajouter des cas de test à l'exercice du nouveau code. Comme vous trouvez des bugs, ajouter des vérifications et / ou nouveaux cas pour couvrir le code défectueux. Lorsque vous déboguez et perdre confiance dans un morceau de code, revenir en arrière et ajouter des tests pour prouver qu'il est en train de faire ce que vous pensez qu'il est. chaînes de capture de données par exemple (d'autres services que vous appelez, sites Web que vous grattez, peu importe) et de les nourrir à votre code d'analyse syntaxique. Quelques cas ici, l'amélioration il y a validation, et vous finirez avec un code très fiable.

En outre, consultez la liste officielle du nœud recommandé. js modules. Cependant, de GitHub modules Node wiki est beaucoup plus complet et une bonne ressource.


Pour comprendre nœud, il est utile d'examiner quelques-unes des choix de conception clés:

Node.js est EVENEMENT SUR LA BASE et ASYNCHRONE / non bloquante . Événements, comme une connexion HTTP entrant sera déclencher une fonction JavaScript qui fait un peu de travail et d'autres tâches démarre asynchrones comme la connexion à une base de données ou un contenu en tirant d'un autre serveur. Une fois ces tâches have été INAUGURÉ, les finitions de fonction d'événements et Node.js se rendort. Dès que quelque chose se passe, comme la connexion de base de données en cours d'établissement ou le serveur externe répondant avec le contenu, les fonctions de rappel feu, et plus de code JavaScript exécute, potentiellement le coup d'envoi des tâches encore plus asynchrones (comme une requête de base de données). De cette façon, Node.js se fera un plaisir entrelacer activités pour plusieurs flux de travail parallèles, en cours d'exécution des activités selon seront débloquées à tout moment. Voilà pourquoi Node.js fait un excellent travail pour gérer 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 est juste une allocation de tas très faible. Spinning un nouveau processus prend beaucoup plus de mémoire, un méga-octet sur certaines plates-formes. Mais le coût réel est la surcharge associée à contexte de commutation. Lorsque vous avez 10 ^ 6 threads noyau, le noyau doit faire beaucoup de travail déterminer qui devrait exécuter suivant. Un groupe de travail a été dans la construction d'un O (1) planificateur pour Linux, mais à la fin, il est juste moyen moyen plus efficace d'avoir un seul processus dirigé par les événements de 10 ^ 6 processus en compétition pour le temps CPU. En outre, en cas de surcharge, le modèle multi-processus se comporte très mal, mourir de faim les services d'administration et de gestion critiques, en particulier SSHD (ce qui signifie que vous ne pouvez même pas vous connecter dans la zone pour savoir comment visse il est vraiment).

Node.js est Single Threaded et FREE LOCK . Node.js, en tant que choix de conception très délibérée n'a qu'un seul fil par processus. À cause de cela, il est fondamentalement impossible pour plusieurs threads d'accéder aux données simultanément. Ainsi, pas de serrures sont nécessaires. Les discussions sont difficiles. Vraiment très dur. Si vous ne croyez pas, vous ne l'avez pas fait assez de programmation filetée. Obtenir verrouillage est juste dur et les résultats de bugs qui sont vraiment difficiles à traquer. L'élimination de serrures et multi-threading fait l'une des classes les plus méchants de bugs vont pas plus loin. Cela pourrait être le principal avantage de noeud.

Mais comment puis-je profite de ma boîte à 16 cœurs?

Deux façons:

  1. Pour les grandes lourdes tâches de calcul comme codage d'image, Node.js peut tirer des processus enfants ou envoyer des messages aux processus de travail supplémentaires. Dans cette conception, vous auriez un fil de gérer le flux des événements et des processus N faisant de lourdes tâches de calcul et de mâcher les autres 15 processeurs.
  2. Pour un débit d'échelle sur un webservice, vous devez exécuter plusieurs serveurs Node.js sur une boîte, un par noyau, en utilisant de cluster (avec Node.js v0.6.x, le fonctionnaire "module de cluster" lié ici remplace la version LearnBoost qui a une API différente). Ces serveurs Node.js locaux peuvent alors concurrencer sur un socket pour accepter de nouvelles connexions, d'équilibrage de charge à travers eux. Une fois qu'une connexion est acceptée, il devient fortement lié à un seul de ces processus partagés. En théorie, cela semble mauvais, mais dans la pratique, cela fonctionne très bien et permet d'éviter le mal de tête d'écriture de code thread-safe. En outre, cela signifie que Node.js obtient une excellente affinité du cache du processeur, en utilisant plus efficacement la bande passante mémoire.

Node.js vous permet de faire des choses vraiment puissantes sans casser une sueur. Supposons que vous avez un programme Node.js qui fait une variété de tâches, écoute sur un port TCP pour les commandes, encode des images, quel que soit. Avec cinq lignes de code, vous pouvez ajouter dans un portail de gestion web basé sur HTTP qui indique l'état actuel des tâches actives. Ceci est facile à faire:

var http = require('http');
http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end(myJavascriptObject.getSomeStatusInfo());
}).listen(1337, "127.0.0.1");

Maintenant, vous pouvez frapper une URL et vérifier l'état de votre processus en cours d'exécution. Ajouter quelques boutons, et vous avez un « por la gestiontal ». Si vous avez un cours d'exécution Perl / Python / script Ruby, juste "jeter dans un portail de gestion" est pas tout à fait simple.

Mais n'est pas JavaScript lent / mauvais / mal / spawn-of-the-diable? JavaScript a quelques bizarreries étranges, mais avec "les bonnes parties" il y a un langage très puissant là-bas, et en tout cas, JavaScript est la langue sur le client (navigateur). JavaScript est là pour rester; d'autres langues ciblent comme une IL, et le talent de classe mondiale est en compétition pour produire des moteurs les plus avancés JavaScript. En raison du rôle de JavaScript dans le navigateur, une énorme quantité d'effort d'ingénierie est jeté à rendre JavaScript ultra-rapide. V8 est le dernier et le plus grand moteur javascript, au moins pour ce mois-ci. Il souffle loin les autres langages de script à la fois l'efficacité et la stabilité (en vous regardant, Ruby). Et il ne va que s'améliorer avec des équipes énormes travaillant sur le problème à Microsoft, Google et Mozilla, en compétition pour construire le meilleur moteur JavaScript (Il est plus un JavaScript « interprète » comme tous les moteurs modernes faire des tonnes de JIT compilation sous le capot avec interprétation seulement comme solution de repli pour exécuter une fois-code). Oui, nous souhaitons tous que nous pourrions corriger quelques-unes des choix linguistiques JavaScript Odder, mais il est vraiment pas si mal que ça. Et la langue est si sacrément souple que vous êtes vraiment pas encodé JavaScript, vous codez étape ou jQuery - plus que toute autre langue, en JavaScript, les bibliothèques définissent l'expérience. Pour créer des applications web, vous avez à peu près savoir JavaScript de toute façon, avec le codage sur le serveur a une sorte de synergie ensemble de compétences. Il m'a fait redouter de ne pas écrire le code client.

D'ailleurs, si vous détestez vraiment JavaScript, vous pouvez utiliser le sucre syntaxique comme CoffeeScript . Ou tout ce qui crée un code JavaScript, comme Google Web Toolkit (GWT).

En parlant de JavaScript, ce qui est une « fermeture » - Quasiment une façon de dire que vous conserviez les variables à travers les chaînes scope lexicalement d'appel. ;) Comme ceci:

var myData = "foo";
database.connect( 'user:pass', function myCallback( result ) {
    database.query("SELECT * from Foo where id = " + myData);
} );
// Note that doSomethingElse() executes _BEFORE_ "database.query" which is inside a callback
doSomethingElse();

Voyez comment vous pouvez utiliser « myData » sans rien faire maladroit comme stashing dans un objet? Et contrairement à Java, la variable « myData » ne doit pas être en lecture seule. Cette puissante fonctionnalité de langage fait programmation asynchrone beaucoup moins bavard et moins douloureux.

L'écriture du code asynchrone va toujours être plus complexe que d'écrire un simple script mono-thread, mais avec Node.js, ce n'est pas beaucoup plus difficile et vous obtenez beaucoup d'avantages en plus de l'efficacité et l'évolutivité à des milliers de connexions simultanées ...

V8 est une implémentation de JavaScript. Il vous permet d'exécuter des applications autonomes JavaScript (entre autres).

Node.js est simplement une bibliothèque écrite pour V8 qui fait evented E / S. 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, que vous venez de don « t attendre qu'elle se termine. Ainsi, par exemple, demander pour la dernière fois sous la direction d'un fichier:

// Pseudo code
stat( 'somefile' )

Cela pourrait prendre quelques millisecondes, ou il peut prendre quelques secondes. Avec E / S simplement le feu de la demande et au lieu d'autour de vous joindre en attente un rappel qui obtient exécuté lorsque la demande se termine:

// Pseudo code
stat( 'somefile', function( result ) {
  // Use the result here
} );
// ...more code here

Cela en fait un peu comme code JavaScript dans le navigateur (par exemple, Ajax fonctionnalité de style ).

Pour plus d'informations, vous devriez vérifier l'article Node.js est vraiment excitant qui était mon introduction à la bibliothèque / plate-forme ... je l'ai trouvé très bon.

Node.js est un outil de ligne de commande open source construit pour activer le code côté serveur. Vous pouvez télécharger une tarball, compiler et installer la source. Il vous permet d'exécuter des programmes JavaScript.

Le code 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 le système de fichiers.

Il est apprécié pour ses performances et la capacité d'effectuer des opérations parallèles.

  

Comprendre Node.js est meilleure explication de Node.js J'ai trouvé à ce jour.

Voici quelques bons articles sur le sujet.

  

Les fermetures sont un moyen d'exécuter du code dans le contexte, il a été créé.

Qu'est-ce que cela signifie pour concurency est que vous pouvez définir des variables, puis lancer un bloquante E / S fonction , et l'envoyer une fonction anonyme pour son rappel.

Lorsque la tâche est terminée, la fonction de rappel sera exécutée dans le contexte avec les variables, c'est la fermeture.

La fermeture raison sont si bonnes pour les applications d'écriture avec bloquante I / O est qu'il est très facile de gérer le contexte des fonctions d'exécution de manière asynchrone.

Deux bons exemples sont la façon dont vous gérez au sujet de modèles et d'utiliser des améliorations progressives avec elle. Vous avez juste besoin de quelques morceaux légers de code JavaScript pour le faire fonctionner parfaitement.

Je recommande fortement que vous regardez et lire ces articles:

Ramassez toute langue et essayer de se rappeler comment vous gérer vos modèles de fichiers HTML et ce que vous aviez à faire pour mettre à jour un seul CSS nom de classe dans votre DOM structure (par exemple, un utilisateur cliqué sur un élément de menu et que vous voulez qui a marqué comme « sélectionné » et mettre à jour le contenu de la page).

Avec Node.js, il est aussi simple que de le faire dans le code JavaScript côté client. Obtenez votre noeud DOM et appliquer votre classe CSS à cela. Obtenez votre noeud DOM et innerHtml votre contenu (vous aurez besoin d'un code JavaScript supplémentaire pour le faire. Lire l'article pour en savoir plus).

Un autre bon exemple, est que vous pouvez rendre votre page Web compatible à la fois avec JavaScript activé ou désactivé avec le même morceau de code. Imaginez que vous avez une sélection date faite en JavaScript qui permettra à vos utilisateurs de ramasser une 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é.

Il y a une très bonne analogie fast food qui explique le mieux l'événement modèle axé sur des Node.js, voir l'article complet, Node.js, cabinets médicaux et restauration rapide - comprendre la programmation événementielle

Voici un résumé:

  

Si le fast-food suivi d'un modèle à base de fil traditionnel, vous souhaitez commander votre repas et attendez en ligne jusqu'à ce que vous l'avez reçu. La personne derrière vous ne seriez pas en mesure de commander jusqu'à ce que votre commande a été fait. Dans un modèle événementiel, vous commandez votre nourriture, puis sortez de la ligne à attendre. Tout le monde est alors libre de commander.

Node.js est l'événement axé sur, mais la plupart des serveurs web sont thread-based.York explique comment fonctionne Node.js:

  • Vous utilisez votre navigateur Web pour faire 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.

  • Alors que le serveur Node.js est en attente pour le fichier à restituer, il la demande de services Web suivante.

  • Lorsque le fichier est récupéré, il y a une fonction de rappel qui est inséré dans la file d'attente des serveurs Node.js.

  • Le serveur Node.js exécute cette fonction dans ce cas serait rendre la page "/about.html" et l'envoyer à votre navigateur Web. "

Eh bien, Je comprends que

  
      
  • L'objectif de nœud est de fournir un moyen facile   pour créer des programmes de réseau évolutifs.
  •   
  • Le noeud est similaire dans la conception et influencé par des systèmes comme machine de l'événement Ruby ou Twisted Python.
  •   
  • Evented E / S pour javascript V8.
  •   

Pour moi, cela signifie que vous aviez raison dans les trois hypothèses. La bibliothèque semble que prometteuse!

En outre, ne pas oublier de mentionner que le V8 de Google est très rapide. Il convertit en fait le code JavaScript en code machine avec la performance apparié de binaire compilé. Donc, ainsi que toutes les autres grandes choses, il est incroyablement rapide.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top