264 votes

Comment puis-je partager du code entre Node.js et le navigateur?

Je suis entrain de créer une petite application avec un JavaScript client (dans le navigateur) et un Node.js serveur, la communication à l'aide de WebSocket.

Je voudrais partager du code entre le client et le serveur. J'ai tout juste commencé avec Node.js et ma connaissance de la moderne JavaScript est un peu rouillé, pour dire le moins. Je suis donc toujours obtenir ma tête autour de la CommonJS fonction require (). Si je crée mes paquets à l'aide de la "exporter" de l'objet, alors je ne vois pas comment je pourrais utiliser le même JS fichiers dans le navigateur.

Je veux créer un ensemble de méthodes et de classes qui sont utilisées sur les deux extrémités pour faciliter l'encodage et du décodage des messages, et d'autres en miroir des tâches. Cependant, le Nœud.js/CommonJS systèmes d'emballage semble m'empêche de créer des fichiers JS qui peut être utilisé sur les deux côtés.

J'ai aussi essayé d'utiliser JS.Class pour obtenir une plus OO modèle, mais j'ai abandonné parce que je ne pouvais pas comprendre comment obtenir la condition JS fichiers pour travailler avec require(). Il y a une chose qui me manque ici?

180voto

Caolan Points 1736

Si vous voulez écrire un module qui peut être utilisé à la fois côté client et côté serveur, j'ai un court billet de blog sur une méthode rapide et facile: http://caolanmcmahon.com/posts/writing_for_node_and_the_browser/ essentiellement le followig (où this est le même que window):

(function(exports){

    // your code goes here

   exports.test = function(){
        return 'hello world'
    };

})(typeof exports === 'undefined'? this['mymodule']={}: exports);

Sinon il y a certains projets visant à mettre en œuvre la node.js API côté client, tels que Marak gemini.

Vous pourriez également être intéressé par DNode, ce qui vous permet d'exposer une fonction JavaScript de sorte qu'il peut être appelé à partir d'un autre ordinateur à l'aide d'un simple basé sur JSON protocole réseau.

55voto

broesch Points 594

Epeli a une bonne solution ici http://epeli.github.com/piler/ qui fonctionne même sans la bibliothèque, il suffit de mettre cela dans un fichier appelé share.js

 (function(exports){

  exports.test = function(){
       return 'This is a function from shared module';
  };

}(typeof exports === 'undefined' ? this.share = {} : exports));
 

Du côté serveur, utilisez simplement:

 var require('./share.js');

share.test();
 

Et sur le côté client, il suffit de charger le fichier js et ensuite utiliser

 share.test();
 

26voto

two-bit-fool Points 2813

On dirait que cela pourrait être une meilleure solution:

https://github.com/substack/node-browserify

13voto

Dagg Nabbit Points 23918

N'oubliez pas que la chaîne de la représentation d'une fonction javascript représente le code source de la fonction. Vous pouvez simplement écrire vos fonctions et les constructeurs dans un contenant façon afin qu'ils puissent être toString()'d et envoyé au client.

Une autre façon de le faire est d'utiliser un système de build, mettre le code dans des fichiers séparés, puis les inclure à la fois le serveur et le client scripts. J'utilise cette approche pour un simple client/serveur de jeu via les WebSockets où le serveur et le client, les deux fonctionnent essentiellement de la même boucle de jeu et le client se synchronise avec le serveur à chaque tic pour s'assurer que personne ne triche.

Mon système de construction pour le jeu est un simple script bash qui exécute les fichiers par le préprocesseur C, puis à travers le sed pour nettoyer l'ordure du rpc laisse derrière elle, de sorte que je peux utiliser tous les normale de préprocesseur des trucs comme #include, #define, #ifdef, etc.

13voto

Husky Points 2221

Je recommande de regarder dans l' adaptateur RequireJS pour Node . Le problème est que le nœud de modèle de module CommonJS utilisé par défaut n'est pas asynchrone, ce qui bloque le chargement dans le navigateur Web. Exiger utilise le modèle AMD, qui est à la fois asynchrone et compatible avec le serveur et le client, à condition que vous utilisiez l'adaptateur r.js .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X