2

J'écris une application JavaScript côté serveur et côté client basée sur NodeJS. J'ai des contrôleurs, des modèles, des vues et des présentateurs. Le problème auquel je suis confronté est que certaines parties du code doivent être uniquement côté serveur, côté client et les deux. Par exemple, les contrôleurs sont une pure chose côté serveur pour moi, donc ils ne devraient pas être disponibles côté client. Les présentateurs, d'un autre côté, sont purement côté client et devraient donc être disponibles côté client.Comment structurer des modèles et des vues dans NodeJS?

Jetez un oeil à ma mauvaise structure actuelle:

project\ 
project\public\index.js 
project\public\images\ 
project\protected\controllers\ 
project\protected\models\ 
project\protected\views\ 
project\protected\presenters\ 

Le problème est que je fais face à dossier public est la racine du document et protégé est en dehors de la racine du document. Je dois pouvoir utiliser Views du côté client et côté serveur. Donc, mes vues ne peuvent pas être protégées. La même chose s'applique aux modèles et à des tonnes d'autres choses. Je dois aussi pouvoir y accéder côté client.

Je commence à penser que je dois mettre toute la structure sous la racine du document à l'exception de certains fichiers de configuration. Est-ce ce que je devrais faire? Y a-t-il des problèmes avec cette approche? Je pose la question parce que la plupart des frameworks web (Django, Zend Framework) fonctionnent de la même façon que le framework est en dehors de la racine du document.

Répondre

3

My github structure (hors datée)

-- Main level 
project\ 
-- Your main app. Keep light 
project\app.js 
-- All your configuration, development/production setups 
project\app-configure 
-- Your server-side controllers/routing. Keep light 
project\controllers\ 
-- Any WebSocket specific code. 
project\socket-io\ 
-- Server side test 
project\test\ 
-- Your public folder. Client side can access these files. 
-- Serve this folder as static content 
project\public\ 
-- I keep my backbone collections here. Used on both server & client 
project\public\collections 
-- public css files 
project\public\css 
-- public js files. Including a main.js to bootstrap the router 
project\public\js 
-- public models used on both server & client. 
project\public\models 
-- client side router, used to router hashbang urls. Can use same routing 
-- logic as the server. This is virtually a second set of controllers around 
-- All your models 
project\public\routers\ 
-- public tests. QUnit based 
project\public\test\ 
-- View files 
project\public\views 
-- Templates used to render HTML. Used on client & server 
project\public\views\templates 
-- Backbone view files. Used to code up interaction, and business logic 
-- This uses templates to render HTML and DOM events to handle interaction 
project\public\views\backbone-views 

Ceci est basé sur express et backbone. Les contrôleurs sont express-controllers routeurs publics \ sont routage côté client à l'aide davis

Fondamentalement parce que le MVC est si fortement réutilisée à travers des tests client et le serveur, la seule chose qui est pas publique sont côté serveur et les contrôleurs côté serveur. Ainsi que les paramètres de configuration et tout code basé sur socket-io.

Mon conseil est simple tout ce qui est utilisé dans les deux va dans \public\

Parce que MVC réutilisation sur le client et le serveur est une chose nouvelle, il n'y a pas d'exemples que vous pouvez regarder. En dehors de la chasse aux grands sites open source node.js sur github.

+0

Merci pour vos idées. Je suppose que l'on pourrait aussi mettre les contrôleurs, les tests et le reste en public aussi longtemps que la configuration/les clés/mots de passe resteront éteints. Cela me rend plus confus si les points de vue, les modèles, les présentateurs sont en public, mais les contrôleurs sont un peu en retrait. Je sais que c'est basé sur une décision logique, mais cela semble encombré. Pensez-vous qu'il y a des inconvénients à tout mettre en public étant donné que le code est entièrement compilé dans la poubelle pour la production et que la configuration avec des clés/mots de passe potentiels est protégée? – Tower

+0

@rFactor Il n'est pas nécessaire de placer du code côté serveur uniquement en public. Le client est open source. Le client javascript ne peut pas être caché/closed-source. Tu n'as pas le choix. Ajout de plus de détails à la structure du fichier. Et oui, les clés/mots de passe, etc ne sont pas en public. – Raynos

+0

@Raynos - existe-t-il une raison pour laquelle vous utilisez Davis plutôt que des routeurs Backbone? – Tauren

Questions connexes