Home » Nodejs » Folder structure for both server side and thick client web app

Folder structure for both server side and thick client web app

Posted by: admin November 30, 2017 Leave a comment

Questions:

Currently I am using Node.js for the backend and either extjs or backbone for the client and I am now completely confused on the folder structure.

Using express my folder structure is as follow

appname
  |--controllers
  |--models
  |  |--appmodel.js
  |--public
  |  |--css
  |  |--js // any client-side javascripts
  |--routes
  |  |--router.js
  |--views
  |  |--appview.ejs
  |--app.js

where app.js is the point of entry and it uses router.js to handle routing and rendering of the views. This works fine if it is only server-side development. Now if I want to use ExtJS or Backbone for the client, how should I organize my code? Should I add it to public folder or views?

appname
  |--controllers
  |  |--extbasedcontroller.js // correct location?
  |--models
  |  |--appmodel.js
  |  |--extbasedmodels.js // correct location?
  |--public
  |  |--css
  |  |--js
  |  |  |--extjs // extjs files
  |--routes
  |  |--router.js
  |--views
  |  |--appview.ejs
  |  |--extbasedview.ejs // correct location?
  |--app.js

If this is the case, where should I put the model for my extjs files? If I put it in models folder it feels like I’m mixing up client and server code in one folder and it’s going to be confusing…

Answers:

In your place, I would do that way:

appname
  |--ServerCode
  |  |--controllers
  |  |--models
  |  |  |--appmodel.js
  |  |--routes
  |  |  |--router.js
  |  |--views
  |  |  |--appview.ejs
  |  |--app.js
  |--public
  |  |--css
  |  |--js // any client-side javascripts
  |  |--models
  |  |--controllers
  |  |--...

The main idea is to place public folder outside of the scope of your server javascript files.

See an example here: https://github.com/madhums/node-express-mongoose-demo/

Questions:
Answers:

Just put the whole /webapp under /public so you’ll end creating, for instance, frontend’s models under /public/webapp/models

appname
  |--models
  |  |--appmodel.js
  |--public
  |  |  |--webapp // extjs/backbone files
  |  |  |  |--models
  |  |  |  |--controllers
  |  |  |  |--css
  |  |  |  |--js
  |  |  |  |--img
  |  |  |  |--views
  |  |  |  |  |--appview.ejs
  |  |  |  |  |--extbasedview.ejs
  |--routes
  |  |--router.js
  |--app.js

Questions:
Answers:

Heres my suggested folder structure:

appname
  |--webapp
  |  |--img
  |  |--js
  |  |  |--controllers
  |  |  |  |--controller.js
  |  |  |--something.js
  |  |--css
  |  |--views
  |  |  |-- appview.ejs
  |  |--index
  |  |--404 etc.
  |--app.js
  |--package.json
  |--README
  |-- etc.

I think its very tidy and easy to navigate in, because all the server and node_modules stuff is outside and the files I need for the application is in the “webapp” folder. If you really need a folder called “public” (I cant remember if express needs one or not) I think you can just rename the “webapp” folder to “public”, or drop the “webapp” folder inside “public”. I would also recommend using AngularJS instead of .ejs, but do what you want to do. 🙂