Skip to content
This repository was archived by the owner on May 14, 2025. It is now read-only.

Latest commit

History

19 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Caution

This repository is archived and no longer actively maintained.

We are no longer accepting issues, feature requests, or pull requests. For additional support or questions, please visit the Express.js Discussions page.

A comparison of server-side node frameworks. This may include frameworks with a browser-side component.

Frameworks

Only frameworks with over 1,000 stars are currently added. Feel free to add your own. The frameworks are listed by number of watchers, descending, as of March 18, 2014.

FrameworkSponsor(s) / Author(s)WatchersStars
MeteorMeteor Development Group97311,687
ExpressStrongLoop / TJ Holowaychuk82812,824
SailsMike McNeil4855,582
KoaTJ Holowaychuk2323,160
DerbyNate SmithBrian Noguchi2133,079
KrakenPayPal2102,424
HapiWalmart Labs2041,981
ConnectSencha Labs2024,180
LoopBackStrongLoop1872,602
RestifyMark Cavage1222,001
GeddyMatthew Eernisse1011,703
CompoundJSAnatoliy Chakkaev911,542
FlatironNodejitsu751,146

Stack Integration

Traditionally, frameworks are explicitly server-side. However, there are now frameworks that are vertically integrated, i.e. integrate the client with the server.

FrameworkServer-sideClient-side
Meteor
Express
Sails
Koa
Derby
Kraken
Hapi
Connect
LoopBack
Restify
Geddy
CompoundJS
Flatiron

Dependencies

Some frameworks are built upon other frameworks.

FrameworkDependencies
Meteor
ExpressConnect for < 4.0.0
SailsExpress
Koa
Derby
KrakenExpress
Hapi
Connect
LoopBackExpress
Restify
Geddy
CompoundJS
Flatiron

Source Lines of Code

This is the lines of code a framework uses, not including comments. This is used to gauge complexity and modularity of a framework.

FrameworkSource Lines of CodeVersion
Meteor
Express1,1504.0.0-rc3
Sails5,3500.10.0-rc4
Koa5500.5.1
Derby1,4500.6.0-alpha3
Kraken6800.7.
Hapi4,7503.0.0
Connect1203.0.0-rc1
LoopBack10,4722.8.0
Restify3,9702.6.3
Geddy5,6600.12.4
CompoundJS3,0101.1.13-1
Flatiron5810.3.11

Note: sloc is used to calculate the SLOC. Most are simply counted by running sloc lib and lines of source code is used.

Middleware/Plugin Signature

Different frameworks use plugins and middleware differently. Some use objects, others use functions. Some work with node's req and res objects, whereas many others do not.

A framework "supports node" if node's req and res objects are passed to plugins and middleware, and using node's req and res objects is supported.

FrameworkSignatureSupports Node
Meteor×
Expressapp.use(function (req, res, next) {})
Sailsfunction(req, res, next)
Koaapp.use(function* (next) {})×
Derby
Krakenapp.use(function (req, res, next) {})
Hapiapp.ext('onRequest', function (req, next) {})×
Connectapp.use(function (req, res, next) {})
LoopBackapp.use(function (req, res, next) {})
Restifyapp.use(function (req, res, next) {})
Geddythis.before(function (req, res) {})
CompoundJS
Flatiron

Error Handling

Error handling in node.js is wonderful! The current solution to catch uncaught exceptions (emitters and streams throwing errors everywhere) is to use domains (unless you listen to every error). If a framework does not handle uncaught exceptions, then domains should probably use domains.

FrameworkMiddleware/PluginUncaught Exceptions Handling
Meteor
Expressnext(err) / app.use(function (err, req, res, next) {})×
Sails
Koatry/catch× - Unnecessary with generators
Derby
Krakennext(err) / app.use(function (err, req, res, next) {})
Hapidomains
Connectnext(err) / app.use(function (err, req, res, next) {})×
LoopBacknext(err) / app.use(function (err, req, res, next) {})x
Restifynext(err)
Geddy
CompoundJS
Flatiron

Control Flow

Most frameworks use only node's traditional callbacks for control. As we move towards ES6, we will see frameworks that use generators and promises to avoid callback hell. Any framework without a control flow is assumed to use callbacks unless otherwise specified.

FrameworkControl Flow
Meteorfibers
Express
Sails
Koagenerators - co
Derby
Kraken
Hapi
Connect
LoopBack
Restify
Geddy
CompoundJS
Flatiron

Included Features

If a feature is not included, there is a very good possibility that it can be used via middleware or plugin. Which features a framework includes or does not include is unimportant - its philosophy is.

FrameworkContent NegotiationCookie ManagementRoutingView SystemBody ParsingMultipart Parsing
Meteor
Express
Sails
Koa
Derby
Kraken
Hapi
Connect
LoopBack
Restify
Geddy
CompoundJS
Flatiron
FrameworkSession ManagementCSRF ProtectionCompressionFile UploadsBasic Authentication
Meteor
Express
Sails
Koa
Derby
Kraken
Hapi
Connect
LoopBack
Restify
Geddy
CompoundJS
Flatiron
  • Content Negotiation - ability to negotiation server response types and the request's acceptable types.
  • Cookie Management - ability to parse cookies as well as set cookies
  • Routing -
  • View System - ability to choose a templating system and render templates by their name
  • Body Parsing - ability to parse urlencoded and json request bodies
  • Multipart Parsing - ability to part multipart request bodies
  • Session Management - ability to provide non-authenticated cookie-based sessions
  • CSRF Protection - built in CSRF protection
  • Compression - built-in gzip and deflate response compression
  • File Uploads - built-in ability to send local files to the client
  • Basic Authentication

Database

FrameworkRequired DatabasesRecommended DatabasesCompatible Databases
MeteorMongoDB
Express
SailsMongoDB, MySQL, Postgres
Koa
Derby
Kraken
Hapi
Connect
LoopBackMicrosoft SQL Server, MongoDB, MySQL, Oracle, Postgres
Restify
GeddyLevelDB, MongoDB, MySQL, Postgres, Riak, SQLite
CompoundJS
Flatiron

Templating

FrameworkRequired Templating SystemsRecommended Templating SystemsCompatible Templating Systems
Meteorhandlebars
Expressconsolidate
Sailsconsolidate
Koa
Derbyhandlebars-like
Krakendustjsconsolidate
Hapi
Connect
LoopBackconsolidate
Restify
Geddyhandlebars, EJS, Jade, Swig, mustache
CompoundJS
Flatiron

consolidate means that the framework supports any templating system supported by consolidate.js.

Contributing

When adding a new framework, you must add the simplest metadata such as links, SLOC, stack, and dependencies. Frameworks without a decent amount of stars are not welcomed. Do not spam your brand new framework.

Performance comparisons are not welcomed.

Metadata should be updated for the latest stable versions, including release candidates, but not including alpha or beta versions.

License

The MIT License (MIT)

Copyright (c) 2014 Jonathan Ong me@jongleberry.com

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

About

A comparison of server-side node frameworks

Resources

Code of conduct

Security policy

Stars

310 stars

Watchers

5 watching

Forks

Releases

Sponsor this project

Packages

Contributors

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - pillarjs/node-frameworks: A comparison of server-side node frameworks · GitHub
Skip to content
This repository was archived by the owner on May 14, 2025. It is now read-only.

Latest commit

History

19 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Caution

This repository is archived and no longer actively maintained.

We are no longer accepting issues, feature requests, or pull requests. For additional support or questions, please visit the Express.js Discussions page.

A comparison of server-side node frameworks. This may include frameworks with a browser-side component.

Frameworks

Only frameworks with over 1,000 stars are currently added. Feel free to add your own. The frameworks are listed by number of watchers, descending, as of March 18, 2014.

FrameworkSponsor(s) / Author(s)WatchersStars
MeteorMeteor Development Group97311,687
ExpressStrongLoop / TJ Holowaychuk82812,824
SailsMike McNeil4855,582
KoaTJ Holowaychuk2323,160
DerbyNate SmithBrian Noguchi2133,079
KrakenPayPal2102,424
HapiWalmart Labs2041,981
ConnectSencha Labs2024,180
LoopBackStrongLoop1872,602
RestifyMark Cavage1222,001
GeddyMatthew Eernisse1011,703
CompoundJSAnatoliy Chakkaev911,542
FlatironNodejitsu751,146

Stack Integration

Traditionally, frameworks are explicitly server-side. However, there are now frameworks that are vertically integrated, i.e. integrate the client with the server.

FrameworkServer-sideClient-side
Meteor
Express
Sails
Koa
Derby
Kraken
Hapi
Connect
LoopBack
Restify
Geddy
CompoundJS
Flatiron

Dependencies

Some frameworks are built upon other frameworks.

FrameworkDependencies
Meteor
ExpressConnect for < 4.0.0
SailsExpress
Koa
Derby
KrakenExpress
Hapi
Connect
LoopBackExpress
Restify
Geddy
CompoundJS
Flatiron

Source Lines of Code

This is the lines of code a framework uses, not including comments. This is used to gauge complexity and modularity of a framework.

FrameworkSource Lines of CodeVersion
Meteor
Express1,1504.0.0-rc3
Sails5,3500.10.0-rc4
Koa5500.5.1
Derby1,4500.6.0-alpha3
Kraken6800.7.
Hapi4,7503.0.0
Connect1203.0.0-rc1
LoopBack10,4722.8.0
Restify3,9702.6.3
Geddy5,6600.12.4
CompoundJS3,0101.1.13-1
Flatiron5810.3.11

Note: sloc is used to calculate the SLOC. Most are simply counted by running sloc lib and lines of source code is used.

Middleware/Plugin Signature

Different frameworks use plugins and middleware differently. Some use objects, others use functions. Some work with node's req and res objects, whereas many others do not.

A framework "supports node" if node's req and res objects are passed to plugins and middleware, and using node's req and res objects is supported.

FrameworkSignatureSupports Node
Meteor×
Expressapp.use(function (req, res, next) {})
Sailsfunction(req, res, next)
Koaapp.use(function* (next) {})×
Derby
Krakenapp.use(function (req, res, next) {})
Hapiapp.ext('onRequest', function (req, next) {})×
Connectapp.use(function (req, res, next) {})
LoopBackapp.use(function (req, res, next) {})
Restifyapp.use(function (req, res, next) {})
Geddythis.before(function (req, res) {})
CompoundJS
Flatiron

Error Handling

Error handling in node.js is wonderful! The current solution to catch uncaught exceptions (emitters and streams throwing errors everywhere) is to use domains (unless you listen to every error). If a framework does not handle uncaught exceptions, then domains should probably use domains.

FrameworkMiddleware/PluginUncaught Exceptions Handling
Meteor
Expressnext(err) / app.use(function (err, req, res, next) {})×
Sails
Koatry/catch× - Unnecessary with generators
Derby
Krakennext(err) / app.use(function (err, req, res, next) {})
Hapidomains
Connectnext(err) / app.use(function (err, req, res, next) {})×
LoopBacknext(err) / app.use(function (err, req, res, next) {})x
Restifynext(err)
Geddy
CompoundJS
Flatiron

Control Flow

Most frameworks use only node's traditional callbacks for control. As we move towards ES6, we will see frameworks that use generators and promises to avoid callback hell. Any framework without a control flow is assumed to use callbacks unless otherwise specified.

FrameworkControl Flow
Meteorfibers
Express
Sails
Koagenerators - co
Derby
Kraken
Hapi
Connect
LoopBack
Restify
Geddy
CompoundJS
Flatiron

Included Features

If a feature is not included, there is a very good possibility that it can be used via middleware or plugin. Which features a framework includes or does not include is unimportant - its philosophy is.

FrameworkContent NegotiationCookie ManagementRoutingView SystemBody ParsingMultipart Parsing
Meteor
Express
Sails
Koa
Derby
Kraken
Hapi
Connect
LoopBack
Restify
Geddy
CompoundJS
Flatiron
FrameworkSession ManagementCSRF ProtectionCompressionFile UploadsBasic Authentication
Meteor
Express
Sails
Koa
Derby
Kraken
Hapi
Connect
LoopBack
Restify
Geddy
CompoundJS
Flatiron
  • Content Negotiation - ability to negotiation server response types and the request's acceptable types.
  • Cookie Management - ability to parse cookies as well as set cookies
  • Routing -
  • View System - ability to choose a templating system and render templates by their name
  • Body Parsing - ability to parse urlencoded and json request bodies
  • Multipart Parsing - ability to part multipart request bodies
  • Session Management - ability to provide non-authenticated cookie-based sessions
  • CSRF Protection - built in CSRF protection
  • Compression - built-in gzip and deflate response compression
  • File Uploads - built-in ability to send local files to the client
  • Basic Authentication

Database

FrameworkRequired DatabasesRecommended DatabasesCompatible Databases
MeteorMongoDB
Express
SailsMongoDB, MySQL, Postgres
Koa
Derby
Kraken
Hapi
Connect
LoopBackMicrosoft SQL Server, MongoDB, MySQL, Oracle, Postgres
Restify
GeddyLevelDB, MongoDB, MySQL, Postgres, Riak, SQLite
CompoundJS
Flatiron

Templating

FrameworkRequired Templating SystemsRecommended Templating SystemsCompatible Templating Systems
Meteorhandlebars
Expressconsolidate
Sailsconsolidate
Koa
Derbyhandlebars-like
Krakendustjsconsolidate
Hapi
Connect
LoopBackconsolidate
Restify
Geddyhandlebars, EJS, Jade, Swig, mustache
CompoundJS
Flatiron

consolidate means that the framework supports any templating system supported by consolidate.js.

Contributing

When adding a new framework, you must add the simplest metadata such as links, SLOC, stack, and dependencies. Frameworks without a decent amount of stars are not welcomed. Do not spam your brand new framework.

Performance comparisons are not welcomed.

Metadata should be updated for the latest stable versions, including release candidates, but not including alpha or beta versions.

License

The MIT License (MIT)

Copyright (c) 2014 Jonathan Ong me@jongleberry.com

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

About

A comparison of server-side node frameworks

Resources

Code of conduct

Security policy

Stars

310 stars

Watchers

5 watching

Forks

Releases

Sponsor this project

Packages

Contributors

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - pillarjs/node-frameworks: A comparison of server-side node frameworks · GitHub
Skip to content
This repository was archived by the owner on May 14, 2025. It is now read-only.

Latest commit

History

19 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Caution

This repository is archived and no longer actively maintained.

We are no longer accepting issues, feature requests, or pull requests. For additional support or questions, please visit the Express.js Discussions page.

A comparison of server-side node frameworks. This may include frameworks with a browser-side component.

Frameworks

Only frameworks with over 1,000 stars are currently added. Feel free to add your own. The frameworks are listed by number of watchers, descending, as of March 18, 2014.

FrameworkSponsor(s) / Author(s)WatchersStars
MeteorMeteor Development Group97311,687
ExpressStrongLoop / TJ Holowaychuk82812,824
SailsMike McNeil4855,582
KoaTJ Holowaychuk2323,160
DerbyNate SmithBrian Noguchi2133,079
KrakenPayPal2102,424
HapiWalmart Labs2041,981
ConnectSencha Labs2024,180
LoopBackStrongLoop1872,602
RestifyMark Cavage1222,001
GeddyMatthew Eernisse1011,703
CompoundJSAnatoliy Chakkaev911,542
FlatironNodejitsu751,146

Stack Integration

Traditionally, frameworks are explicitly server-side. However, there are now frameworks that are vertically integrated, i.e. integrate the client with the server.

FrameworkServer-sideClient-side
Meteor
Express
Sails
Koa
Derby
Kraken
Hapi
Connect
LoopBack
Restify
Geddy
CompoundJS
Flatiron

Dependencies

Some frameworks are built upon other frameworks.

FrameworkDependencies
Meteor
ExpressConnect for < 4.0.0
SailsExpress
Koa
Derby
KrakenExpress
Hapi
Connect
LoopBackExpress
Restify
Geddy
CompoundJS
Flatiron

Source Lines of Code

This is the lines of code a framework uses, not including comments. This is used to gauge complexity and modularity of a framework.

FrameworkSource Lines of CodeVersion
Meteor
Express1,1504.0.0-rc3
Sails5,3500.10.0-rc4
Koa5500.5.1
Derby1,4500.6.0-alpha3
Kraken6800.7.
Hapi4,7503.0.0
Connect1203.0.0-rc1
LoopBack10,4722.8.0
Restify3,9702.6.3
Geddy5,6600.12.4
CompoundJS3,0101.1.13-1
Flatiron5810.3.11

Note: sloc is used to calculate the SLOC. Most are simply counted by running sloc lib and lines of source code is used.

Middleware/Plugin Signature

Different frameworks use plugins and middleware differently. Some use objects, others use functions. Some work with node's req and res objects, whereas many others do not.

A framework "supports node" if node's req and res objects are passed to plugins and middleware, and using node's req and res objects is supported.

FrameworkSignatureSupports Node
Meteor×
Expressapp.use(function (req, res, next) {})
Sailsfunction(req, res, next)
Koaapp.use(function* (next) {})×
Derby
Krakenapp.use(function (req, res, next) {})
Hapiapp.ext('onRequest', function (req, next) {})×
Connectapp.use(function (req, res, next) {})
LoopBackapp.use(function (req, res, next) {})
Restifyapp.use(function (req, res, next) {})
Geddythis.before(function (req, res) {})
CompoundJS
Flatiron

Error Handling

Error handling in node.js is wonderful! The current solution to catch uncaught exceptions (emitters and streams throwing errors everywhere) is to use domains (unless you listen to every error). If a framework does not handle uncaught exceptions, then domains should probably use domains.

FrameworkMiddleware/PluginUncaught Exceptions Handling
Meteor
Expressnext(err) / app.use(function (err, req, res, next) {})×
Sails
Koatry/catch× - Unnecessary with generators
Derby
Krakennext(err) / app.use(function (err, req, res, next) {})
Hapidomains
Connectnext(err) / app.use(function (err, req, res, next) {})×
LoopBacknext(err) / app.use(function (err, req, res, next) {})x
Restifynext(err)
Geddy
CompoundJS
Flatiron

Control Flow

Most frameworks use only node's traditional callbacks for control. As we move towards ES6, we will see frameworks that use generators and promises to avoid callback hell. Any framework without a control flow is assumed to use callbacks unless otherwise specified.

FrameworkControl Flow
Meteorfibers
Express
Sails
Koagenerators - co
Derby
Kraken
Hapi
Connect
LoopBack
Restify
Geddy
CompoundJS
Flatiron

Included Features

If a feature is not included, there is a very good possibility that it can be used via middleware or plugin. Which features a framework includes or does not include is unimportant - its philosophy is.

FrameworkContent NegotiationCookie ManagementRoutingView SystemBody ParsingMultipart Parsing
Meteor
Express
Sails
Koa
Derby
Kraken
Hapi
Connect
LoopBack
Restify
Geddy
CompoundJS
Flatiron
FrameworkSession ManagementCSRF ProtectionCompressionFile UploadsBasic Authentication
Meteor
Express
Sails
Koa
Derby
Kraken
Hapi
Connect
LoopBack
Restify
Geddy
CompoundJS
Flatiron
  • Content Negotiation - ability to negotiation server response types and the request's acceptable types.
  • Cookie Management - ability to parse cookies as well as set cookies
  • Routing -
  • View System - ability to choose a templating system and render templates by their name
  • Body Parsing - ability to parse urlencoded and json request bodies
  • Multipart Parsing - ability to part multipart request bodies
  • Session Management - ability to provide non-authenticated cookie-based sessions
  • CSRF Protection - built in CSRF protection
  • Compression - built-in gzip and deflate response compression
  • File Uploads - built-in ability to send local files to the client
  • Basic Authentication

Database

FrameworkRequired DatabasesRecommended DatabasesCompatible Databases
MeteorMongoDB
Express
SailsMongoDB, MySQL, Postgres
Koa
Derby
Kraken
Hapi
Connect
LoopBackMicrosoft SQL Server, MongoDB, MySQL, Oracle, Postgres
Restify
GeddyLevelDB, MongoDB, MySQL, Postgres, Riak, SQLite
CompoundJS
Flatiron

Templating

FrameworkRequired Templating SystemsRecommended Templating SystemsCompatible Templating Systems
Meteorhandlebars
Expressconsolidate
Sailsconsolidate
Koa
Derbyhandlebars-like
Krakendustjsconsolidate
Hapi
Connect
LoopBackconsolidate
Restify
Geddyhandlebars, EJS, Jade, Swig, mustache
CompoundJS
Flatiron

consolidate means that the framework supports any templating system supported by consolidate.js.

Contributing

When adding a new framework, you must add the simplest metadata such as links, SLOC, stack, and dependencies. Frameworks without a decent amount of stars are not welcomed. Do not spam your brand new framework.

Performance comparisons are not welcomed.

Metadata should be updated for the latest stable versions, including release candidates, but not including alpha or beta versions.

License

The MIT License (MIT)

Copyright (c) 2014 Jonathan Ong me@jongleberry.com

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

About

A comparison of server-side node frameworks

Resources

Code of conduct

Security policy

Stars

310 stars

Watchers

5 watching

Forks

Releases

Sponsor this project

Packages

Contributors

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - pillarjs/node-frameworks: A comparison of server-side node frameworks · GitHub
Skip to content
This repository was archived by the owner on May 14, 2025. It is now read-only.

Latest commit

History

19 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Caution

This repository is archived and no longer actively maintained.

We are no longer accepting issues, feature requests, or pull requests. For additional support or questions, please visit the Express.js Discussions page.

A comparison of server-side node frameworks. This may include frameworks with a browser-side component.

Frameworks

Only frameworks with over 1,000 stars are currently added. Feel free to add your own. The frameworks are listed by number of watchers, descending, as of March 18, 2014.

FrameworkSponsor(s) / Author(s)WatchersStars
MeteorMeteor Development Group97311,687
ExpressStrongLoop / TJ Holowaychuk82812,824
SailsMike McNeil4855,582
KoaTJ Holowaychuk2323,160
DerbyNate SmithBrian Noguchi2133,079
KrakenPayPal2102,424
HapiWalmart Labs2041,981
ConnectSencha Labs2024,180
LoopBackStrongLoop1872,602
RestifyMark Cavage1222,001
GeddyMatthew Eernisse1011,703
CompoundJSAnatoliy Chakkaev911,542
FlatironNodejitsu751,146

Stack Integration

Traditionally, frameworks are explicitly server-side. However, there are now frameworks that are vertically integrated, i.e. integrate the client with the server.

FrameworkServer-sideClient-side
Meteor
Express
Sails
Koa
Derby
Kraken
Hapi
Connect
LoopBack
Restify
Geddy
CompoundJS
Flatiron

Dependencies

Some frameworks are built upon other frameworks.

FrameworkDependencies
Meteor
ExpressConnect for < 4.0.0
SailsExpress
Koa
Derby
KrakenExpress
Hapi
Connect
LoopBackExpress
Restify
Geddy
CompoundJS
Flatiron

Source Lines of Code

This is the lines of code a framework uses, not including comments. This is used to gauge complexity and modularity of a framework.

FrameworkSource Lines of CodeVersion
Meteor
Express1,1504.0.0-rc3
Sails5,3500.10.0-rc4
Koa5500.5.1
Derby1,4500.6.0-alpha3
Kraken6800.7.
Hapi4,7503.0.0
Connect1203.0.0-rc1
LoopBack10,4722.8.0
Restify3,9702.6.3
Geddy5,6600.12.4
CompoundJS3,0101.1.13-1
Flatiron5810.3.11

Note: sloc is used to calculate the SLOC. Most are simply counted by running sloc lib and lines of source code is used.

Middleware/Plugin Signature

Different frameworks use plugins and middleware differently. Some use objects, others use functions. Some work with node's req and res objects, whereas many others do not.

A framework "supports node" if node's req and res objects are passed to plugins and middleware, and using node's req and res objects is supported.

FrameworkSignatureSupports Node
Meteor×
Expressapp.use(function (req, res, next) {})
Sailsfunction(req, res, next)
Koaapp.use(function* (next) {})×
Derby
Krakenapp.use(function (req, res, next) {})
Hapiapp.ext('onRequest', function (req, next) {})×
Connectapp.use(function (req, res, next) {})
LoopBackapp.use(function (req, res, next) {})
Restifyapp.use(function (req, res, next) {})
Geddythis.before(function (req, res) {})
CompoundJS
Flatiron

Error Handling

Error handling in node.js is wonderful! The current solution to catch uncaught exceptions (emitters and streams throwing errors everywhere) is to use domains (unless you listen to every error). If a framework does not handle uncaught exceptions, then domains should probably use domains.

FrameworkMiddleware/PluginUncaught Exceptions Handling
Meteor
Expressnext(err) / app.use(function (err, req, res, next) {})×
Sails
Koatry/catch× - Unnecessary with generators
Derby
Krakennext(err) / app.use(function (err, req, res, next) {})
Hapidomains
Connectnext(err) / app.use(function (err, req, res, next) {})×
LoopBacknext(err) / app.use(function (err, req, res, next) {})x
Restifynext(err)
Geddy
CompoundJS
Flatiron

Control Flow

Most frameworks use only node's traditional callbacks for control. As we move towards ES6, we will see frameworks that use generators and promises to avoid callback hell. Any framework without a control flow is assumed to use callbacks unless otherwise specified.

FrameworkControl Flow
Meteorfibers
Express
Sails
Koagenerators - co
Derby
Kraken
Hapi
Connect
LoopBack
Restify
Geddy
CompoundJS
Flatiron

Included Features

If a feature is not included, there is a very good possibility that it can be used via middleware or plugin. Which features a framework includes or does not include is unimportant - its philosophy is.

FrameworkContent NegotiationCookie ManagementRoutingView SystemBody ParsingMultipart Parsing
Meteor
Express
Sails
Koa
Derby
Kraken
Hapi
Connect
LoopBack
Restify
Geddy
CompoundJS
Flatiron
FrameworkSession ManagementCSRF ProtectionCompressionFile UploadsBasic Authentication
Meteor
Express
Sails
Koa
Derby
Kraken
Hapi
Connect
LoopBack
Restify
Geddy
CompoundJS
Flatiron
  • Content Negotiation - ability to negotiation server response types and the request's acceptable types.
  • Cookie Management - ability to parse cookies as well as set cookies
  • Routing -
  • View System - ability to choose a templating system and render templates by their name
  • Body Parsing - ability to parse urlencoded and json request bodies
  • Multipart Parsing - ability to part multipart request bodies
  • Session Management - ability to provide non-authenticated cookie-based sessions
  • CSRF Protection - built in CSRF protection
  • Compression - built-in gzip and deflate response compression
  • File Uploads - built-in ability to send local files to the client
  • Basic Authentication

Database

FrameworkRequired DatabasesRecommended DatabasesCompatible Databases
MeteorMongoDB
Express
SailsMongoDB, MySQL, Postgres
Koa
Derby
Kraken
Hapi
Connect
LoopBackMicrosoft SQL Server, MongoDB, MySQL, Oracle, Postgres
Restify
GeddyLevelDB, MongoDB, MySQL, Postgres, Riak, SQLite
CompoundJS
Flatiron

Templating

FrameworkRequired Templating SystemsRecommended Templating SystemsCompatible Templating Systems
Meteorhandlebars
Expressconsolidate
Sailsconsolidate
Koa
Derbyhandlebars-like
Krakendustjsconsolidate
Hapi
Connect
LoopBackconsolidate
Restify
Geddyhandlebars, EJS, Jade, Swig, mustache
CompoundJS
Flatiron

consolidate means that the framework supports any templating system supported by consolidate.js.

Contributing

When adding a new framework, you must add the simplest metadata such as links, SLOC, stack, and dependencies. Frameworks without a decent amount of stars are not welcomed. Do not spam your brand new framework.

Performance comparisons are not welcomed.

Metadata should be updated for the latest stable versions, including release candidates, but not including alpha or beta versions.

License

The MIT License (MIT)

Copyright (c) 2014 Jonathan Ong me@jongleberry.com

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

About

A comparison of server-side node frameworks

Resources

Code of conduct

Security policy

Stars

310 stars

Watchers

5 watching

Forks

Releases

Sponsor this project

Packages

Contributors

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - pillarjs/node-frameworks: A comparison of server-side node frameworks · GitHub
Skip to content
This repository was archived by the owner on May 14, 2025. It is now read-only.

Latest commit

History

19 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Caution

This repository is archived and no longer actively maintained.

We are no longer accepting issues, feature requests, or pull requests. For additional support or questions, please visit the Express.js Discussions page.

A comparison of server-side node frameworks. This may include frameworks with a browser-side component.

Frameworks

Only frameworks with over 1,000 stars are currently added. Feel free to add your own. The frameworks are listed by number of watchers, descending, as of March 18, 2014.

FrameworkSponsor(s) / Author(s)WatchersStars
MeteorMeteor Development Group97311,687
ExpressStrongLoop / TJ Holowaychuk82812,824
SailsMike McNeil4855,582
KoaTJ Holowaychuk2323,160
DerbyNate SmithBrian Noguchi2133,079
KrakenPayPal2102,424
HapiWalmart Labs2041,981
ConnectSencha Labs2024,180
LoopBackStrongLoop1872,602
RestifyMark Cavage1222,001
GeddyMatthew Eernisse1011,703
CompoundJSAnatoliy Chakkaev911,542
FlatironNodejitsu751,146

Stack Integration

Traditionally, frameworks are explicitly server-side. However, there are now frameworks that are vertically integrated, i.e. integrate the client with the server.

FrameworkServer-sideClient-side
Meteor
Express
Sails
Koa
Derby
Kraken
Hapi
Connect
LoopBack
Restify
Geddy
CompoundJS
Flatiron

Dependencies

Some frameworks are built upon other frameworks.

FrameworkDependencies
Meteor
ExpressConnect for < 4.0.0
SailsExpress
Koa
Derby
KrakenExpress
Hapi
Connect
LoopBackExpress
Restify
Geddy
CompoundJS
Flatiron

Source Lines of Code

This is the lines of code a framework uses, not including comments. This is used to gauge complexity and modularity of a framework.

FrameworkSource Lines of CodeVersion
Meteor
Express1,1504.0.0-rc3
Sails5,3500.10.0-rc4
Koa5500.5.1
Derby1,4500.6.0-alpha3
Kraken6800.7.
Hapi4,7503.0.0
Connect1203.0.0-rc1
LoopBack10,4722.8.0
Restify3,9702.6.3
Geddy5,6600.12.4
CompoundJS3,0101.1.13-1
Flatiron5810.3.11

Note: sloc is used to calculate the SLOC. Most are simply counted by running sloc lib and lines of source code is used.

Middleware/Plugin Signature

Different frameworks use plugins and middleware differently. Some use objects, others use functions. Some work with node's req and res objects, whereas many others do not.

A framework "supports node" if node's req and res objects are passed to plugins and middleware, and using node's req and res objects is supported.

FrameworkSignatureSupports Node
Meteor×
Expressapp.use(function (req, res, next) {})
Sailsfunction(req, res, next)
Koaapp.use(function* (next) {})×
Derby
Krakenapp.use(function (req, res, next) {})
Hapiapp.ext('onRequest', function (req, next) {})×
Connectapp.use(function (req, res, next) {})
LoopBackapp.use(function (req, res, next) {})
Restifyapp.use(function (req, res, next) {})
Geddythis.before(function (req, res) {})
CompoundJS
Flatiron

Error Handling

Error handling in node.js is wonderful! The current solution to catch uncaught exceptions (emitters and streams throwing errors everywhere) is to use domains (unless you listen to every error). If a framework does not handle uncaught exceptions, then domains should probably use domains.

FrameworkMiddleware/PluginUncaught Exceptions Handling
Meteor
Expressnext(err) / app.use(function (err, req, res, next) {})×
Sails
Koatry/catch× - Unnecessary with generators
Derby
Krakennext(err) / app.use(function (err, req, res, next) {})
Hapidomains
Connectnext(err) / app.use(function (err, req, res, next) {})×
LoopBacknext(err) / app.use(function (err, req, res, next) {})x
Restifynext(err)
Geddy
CompoundJS
Flatiron

Control Flow

Most frameworks use only node's traditional callbacks for control. As we move towards ES6, we will see frameworks that use generators and promises to avoid callback hell. Any framework without a control flow is assumed to use callbacks unless otherwise specified.

FrameworkControl Flow
Meteorfibers
Express
Sails
Koagenerators - co
Derby
Kraken
Hapi
Connect
LoopBack
Restify
Geddy
CompoundJS
Flatiron

Included Features

If a feature is not included, there is a very good possibility that it can be used via middleware or plugin. Which features a framework includes or does not include is unimportant - its philosophy is.

FrameworkContent NegotiationCookie ManagementRoutingView SystemBody ParsingMultipart Parsing
Meteor
Express
Sails
Koa
Derby
Kraken
Hapi
Connect
LoopBack
Restify
Geddy
CompoundJS
Flatiron
FrameworkSession ManagementCSRF ProtectionCompressionFile UploadsBasic Authentication
Meteor
Express
Sails
Koa
Derby
Kraken
Hapi
Connect
LoopBack
Restify
Geddy
CompoundJS
Flatiron
  • Content Negotiation - ability to negotiation server response types and the request's acceptable types.
  • Cookie Management - ability to parse cookies as well as set cookies
  • Routing -
  • View System - ability to choose a templating system and render templates by their name
  • Body Parsing - ability to parse urlencoded and json request bodies
  • Multipart Parsing - ability to part multipart request bodies
  • Session Management - ability to provide non-authenticated cookie-based sessions
  • CSRF Protection - built in CSRF protection
  • Compression - built-in gzip and deflate response compression
  • File Uploads - built-in ability to send local files to the client
  • Basic Authentication

Database

FrameworkRequired DatabasesRecommended DatabasesCompatible Databases
MeteorMongoDB
Express
SailsMongoDB, MySQL, Postgres
Koa
Derby
Kraken
Hapi
Connect
LoopBackMicrosoft SQL Server, MongoDB, MySQL, Oracle, Postgres
Restify
GeddyLevelDB, MongoDB, MySQL, Postgres, Riak, SQLite
CompoundJS
Flatiron

Templating

FrameworkRequired Templating SystemsRecommended Templating SystemsCompatible Templating Systems
Meteorhandlebars
Expressconsolidate
Sailsconsolidate
Koa
Derbyhandlebars-like
Krakendustjsconsolidate
Hapi
Connect
LoopBackconsolidate
Restify
Geddyhandlebars, EJS, Jade, Swig, mustache
CompoundJS
Flatiron

consolidate means that the framework supports any templating system supported by consolidate.js.

Contributing

When adding a new framework, you must add the simplest metadata such as links, SLOC, stack, and dependencies. Frameworks without a decent amount of stars are not welcomed. Do not spam your brand new framework.

Performance comparisons are not welcomed.

Metadata should be updated for the latest stable versions, including release candidates, but not including alpha or beta versions.

License

The MIT License (MIT)

Copyright (c) 2014 Jonathan Ong me@jongleberry.com

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

About

A comparison of server-side node frameworks

Resources

Code of conduct

Security policy

Stars

310 stars

Watchers

5 watching

Forks

Releases

Sponsor this project

Packages

Contributors

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - pillarjs/node-frameworks: A comparison of server-side node frameworks · GitHub
Skip to content
This repository was archived by the owner on May 14, 2025. It is now read-only.

Latest commit

History

19 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Caution

This repository is archived and no longer actively maintained.

We are no longer accepting issues, feature requests, or pull requests. For additional support or questions, please visit the Express.js Discussions page.

A comparison of server-side node frameworks. This may include frameworks with a browser-side component.

Frameworks

Only frameworks with over 1,000 stars are currently added. Feel free to add your own. The frameworks are listed by number of watchers, descending, as of March 18, 2014.

FrameworkSponsor(s) / Author(s)WatchersStars
MeteorMeteor Development Group97311,687
ExpressStrongLoop / TJ Holowaychuk82812,824
SailsMike McNeil4855,582
KoaTJ Holowaychuk2323,160
DerbyNate SmithBrian Noguchi2133,079
KrakenPayPal2102,424
HapiWalmart Labs2041,981
ConnectSencha Labs2024,180
LoopBackStrongLoop1872,602
RestifyMark Cavage1222,001
GeddyMatthew Eernisse1011,703
CompoundJSAnatoliy Chakkaev911,542
FlatironNodejitsu751,146

Stack Integration

Traditionally, frameworks are explicitly server-side. However, there are now frameworks that are vertically integrated, i.e. integrate the client with the server.

FrameworkServer-sideClient-side
Meteor
Express
Sails
Koa
Derby
Kraken
Hapi
Connect
LoopBack
Restify
Geddy
CompoundJS
Flatiron

Dependencies

Some frameworks are built upon other frameworks.

FrameworkDependencies
Meteor
ExpressConnect for < 4.0.0
SailsExpress
Koa
Derby
KrakenExpress
Hapi
Connect
LoopBackExpress
Restify
Geddy
CompoundJS
Flatiron

Source Lines of Code

This is the lines of code a framework uses, not including comments. This is used to gauge complexity and modularity of a framework.

FrameworkSource Lines of CodeVersion
Meteor
Express1,1504.0.0-rc3
Sails5,3500.10.0-rc4
Koa5500.5.1
Derby1,4500.6.0-alpha3
Kraken6800.7.
Hapi4,7503.0.0
Connect1203.0.0-rc1
LoopBack10,4722.8.0
Restify3,9702.6.3
Geddy5,6600.12.4
CompoundJS3,0101.1.13-1
Flatiron5810.3.11

Note: sloc is used to calculate the SLOC. Most are simply counted by running sloc lib and lines of source code is used.

Middleware/Plugin Signature

Different frameworks use plugins and middleware differently. Some use objects, others use functions. Some work with node's req and res objects, whereas many others do not.

A framework "supports node" if node's req and res objects are passed to plugins and middleware, and using node's req and res objects is supported.

FrameworkSignatureSupports Node
Meteor×
Expressapp.use(function (req, res, next) {})
Sailsfunction(req, res, next)
Koaapp.use(function* (next) {})×
Derby
Krakenapp.use(function (req, res, next) {})
Hapiapp.ext('onRequest', function (req, next) {})×
Connectapp.use(function (req, res, next) {})
LoopBackapp.use(function (req, res, next) {})
Restifyapp.use(function (req, res, next) {})
Geddythis.before(function (req, res) {})
CompoundJS
Flatiron

Error Handling

Error handling in node.js is wonderful! The current solution to catch uncaught exceptions (emitters and streams throwing errors everywhere) is to use domains (unless you listen to every error). If a framework does not handle uncaught exceptions, then domains should probably use domains.

FrameworkMiddleware/PluginUncaught Exceptions Handling
Meteor
Expressnext(err) / app.use(function (err, req, res, next) {})×
Sails
Koatry/catch× - Unnecessary with generators
Derby
Krakennext(err) / app.use(function (err, req, res, next) {})
Hapidomains
Connectnext(err) / app.use(function (err, req, res, next) {})×
LoopBacknext(err) / app.use(function (err, req, res, next) {})x
Restifynext(err)
Geddy
CompoundJS
Flatiron

Control Flow

Most frameworks use only node's traditional callbacks for control. As we move towards ES6, we will see frameworks that use generators and promises to avoid callback hell. Any framework without a control flow is assumed to use callbacks unless otherwise specified.

FrameworkControl Flow
Meteorfibers
Express
Sails
Koagenerators - co
Derby
Kraken
Hapi
Connect
LoopBack
Restify
Geddy
CompoundJS
Flatiron

Included Features

If a feature is not included, there is a very good possibility that it can be used via middleware or plugin. Which features a framework includes or does not include is unimportant - its philosophy is.

FrameworkContent NegotiationCookie ManagementRoutingView SystemBody ParsingMultipart Parsing
Meteor
Express
Sails
Koa
Derby
Kraken
Hapi
Connect
LoopBack
Restify
Geddy
CompoundJS
Flatiron
FrameworkSession ManagementCSRF ProtectionCompressionFile UploadsBasic Authentication
Meteor
Express
Sails
Koa
Derby
Kraken
Hapi
Connect
LoopBack
Restify
Geddy
CompoundJS
Flatiron
  • Content Negotiation - ability to negotiation server response types and the request's acceptable types.
  • Cookie Management - ability to parse cookies as well as set cookies
  • Routing -
  • View System - ability to choose a templating system and render templates by their name
  • Body Parsing - ability to parse urlencoded and json request bodies
  • Multipart Parsing - ability to part multipart request bodies
  • Session Management - ability to provide non-authenticated cookie-based sessions
  • CSRF Protection - built in CSRF protection
  • Compression - built-in gzip and deflate response compression
  • File Uploads - built-in ability to send local files to the client
  • Basic Authentication

Database

FrameworkRequired DatabasesRecommended DatabasesCompatible Databases
MeteorMongoDB
Express
SailsMongoDB, MySQL, Postgres
Koa
Derby
Kraken
Hapi
Connect
LoopBackMicrosoft SQL Server, MongoDB, MySQL, Oracle, Postgres
Restify
GeddyLevelDB, MongoDB, MySQL, Postgres, Riak, SQLite
CompoundJS
Flatiron

Templating

FrameworkRequired Templating SystemsRecommended Templating SystemsCompatible Templating Systems
Meteorhandlebars
Expressconsolidate
Sailsconsolidate
Koa
Derbyhandlebars-like
Krakendustjsconsolidate
Hapi
Connect
LoopBackconsolidate
Restify
Geddyhandlebars, EJS, Jade, Swig, mustache
CompoundJS
Flatiron

consolidate means that the framework supports any templating system supported by consolidate.js.

Contributing

When adding a new framework, you must add the simplest metadata such as links, SLOC, stack, and dependencies. Frameworks without a decent amount of stars are not welcomed. Do not spam your brand new framework.

Performance comparisons are not welcomed.

Metadata should be updated for the latest stable versions, including release candidates, but not including alpha or beta versions.

License

The MIT License (MIT)

Copyright (c) 2014 Jonathan Ong me@jongleberry.com

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

About

A comparison of server-side node frameworks

Resources

Code of conduct

Security policy

Stars

310 stars

Watchers

5 watching

Forks

Releases

Sponsor this project

Packages

Contributors

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - pillarjs/node-frameworks: A comparison of server-side node frameworks · GitHub
Skip to content
This repository was archived by the owner on May 14, 2025. It is now read-only.

Latest commit

History

19 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Caution

This repository is archived and no longer actively maintained.

We are no longer accepting issues, feature requests, or pull requests. For additional support or questions, please visit the Express.js Discussions page.

A comparison of server-side node frameworks. This may include frameworks with a browser-side component.

Frameworks

Only frameworks with over 1,000 stars are currently added. Feel free to add your own. The frameworks are listed by number of watchers, descending, as of March 18, 2014.

FrameworkSponsor(s) / Author(s)WatchersStars
MeteorMeteor Development Group97311,687
ExpressStrongLoop / TJ Holowaychuk82812,824
SailsMike McNeil4855,582
KoaTJ Holowaychuk2323,160
DerbyNate SmithBrian Noguchi2133,079
KrakenPayPal2102,424
HapiWalmart Labs2041,981
ConnectSencha Labs2024,180
LoopBackStrongLoop1872,602
RestifyMark Cavage1222,001
GeddyMatthew Eernisse1011,703
CompoundJSAnatoliy Chakkaev911,542
FlatironNodejitsu751,146

Stack Integration

Traditionally, frameworks are explicitly server-side. However, there are now frameworks that are vertically integrated, i.e. integrate the client with the server.

FrameworkServer-sideClient-side
Meteor
Express
Sails
Koa
Derby
Kraken
Hapi
Connect
LoopBack
Restify
Geddy
CompoundJS
Flatiron

Dependencies

Some frameworks are built upon other frameworks.

FrameworkDependencies
Meteor
ExpressConnect for < 4.0.0
SailsExpress
Koa
Derby
KrakenExpress
Hapi
Connect
LoopBackExpress
Restify
Geddy
CompoundJS
Flatiron

Source Lines of Code

This is the lines of code a framework uses, not including comments. This is used to gauge complexity and modularity of a framework.

FrameworkSource Lines of CodeVersion
Meteor
Express1,1504.0.0-rc3
Sails5,3500.10.0-rc4
Koa5500.5.1
Derby1,4500.6.0-alpha3
Kraken6800.7.
Hapi4,7503.0.0
Connect1203.0.0-rc1
LoopBack10,4722.8.0
Restify3,9702.6.3
Geddy5,6600.12.4
CompoundJS3,0101.1.13-1
Flatiron5810.3.11

Note: sloc is used to calculate the SLOC. Most are simply counted by running sloc lib and lines of source code is used.

Middleware/Plugin Signature

Different frameworks use plugins and middleware differently. Some use objects, others use functions. Some work with node's req and res objects, whereas many others do not.

A framework "supports node" if node's req and res objects are passed to plugins and middleware, and using node's req and res objects is supported.

FrameworkSignatureSupports Node
Meteor×
Expressapp.use(function (req, res, next) {})
Sailsfunction(req, res, next)
Koaapp.use(function* (next) {})×
Derby
Krakenapp.use(function (req, res, next) {})
Hapiapp.ext('onRequest', function (req, next) {})×
Connectapp.use(function (req, res, next) {})
LoopBackapp.use(function (req, res, next) {})
Restifyapp.use(function (req, res, next) {})
Geddythis.before(function (req, res) {})
CompoundJS
Flatiron

Error Handling

Error handling in node.js is wonderful! The current solution to catch uncaught exceptions (emitters and streams throwing errors everywhere) is to use domains (unless you listen to every error). If a framework does not handle uncaught exceptions, then domains should probably use domains.

FrameworkMiddleware/PluginUncaught Exceptions Handling
Meteor
Expressnext(err) / app.use(function (err, req, res, next) {})×
Sails
Koatry/catch× - Unnecessary with generators
Derby
Krakennext(err) / app.use(function (err, req, res, next) {})
Hapidomains
Connectnext(err) / app.use(function (err, req, res, next) {})×
LoopBacknext(err) / app.use(function (err, req, res, next) {})x
Restifynext(err)
Geddy
CompoundJS
Flatiron

Control Flow

Most frameworks use only node's traditional callbacks for control. As we move towards ES6, we will see frameworks that use generators and promises to avoid callback hell. Any framework without a control flow is assumed to use callbacks unless otherwise specified.

FrameworkControl Flow
Meteorfibers
Express
Sails
Koagenerators - co
Derby
Kraken
Hapi
Connect
LoopBack
Restify
Geddy
CompoundJS
Flatiron

Included Features

If a feature is not included, there is a very good possibility that it can be used via middleware or plugin. Which features a framework includes or does not include is unimportant - its philosophy is.

FrameworkContent NegotiationCookie ManagementRoutingView SystemBody ParsingMultipart Parsing
Meteor
Express
Sails
Koa
Derby
Kraken
Hapi
Connect
LoopBack
Restify
Geddy
CompoundJS
Flatiron
FrameworkSession ManagementCSRF ProtectionCompressionFile UploadsBasic Authentication
Meteor
Express
Sails
Koa
Derby
Kraken
Hapi
Connect
LoopBack
Restify
Geddy
CompoundJS
Flatiron
  • Content Negotiation - ability to negotiation server response types and the request's acceptable types.
  • Cookie Management - ability to parse cookies as well as set cookies
  • Routing -
  • View System - ability to choose a templating system and render templates by their name
  • Body Parsing - ability to parse urlencoded and json request bodies
  • Multipart Parsing - ability to part multipart request bodies
  • Session Management - ability to provide non-authenticated cookie-based sessions
  • CSRF Protection - built in CSRF protection
  • Compression - built-in gzip and deflate response compression
  • File Uploads - built-in ability to send local files to the client
  • Basic Authentication

Database

FrameworkRequired DatabasesRecommended DatabasesCompatible Databases
MeteorMongoDB
Express
SailsMongoDB, MySQL, Postgres
Koa
Derby
Kraken
Hapi
Connect
LoopBackMicrosoft SQL Server, MongoDB, MySQL, Oracle, Postgres
Restify
GeddyLevelDB, MongoDB, MySQL, Postgres, Riak, SQLite
CompoundJS
Flatiron

Templating

FrameworkRequired Templating SystemsRecommended Templating SystemsCompatible Templating Systems
Meteorhandlebars
Expressconsolidate
Sailsconsolidate
Koa
Derbyhandlebars-like
Krakendustjsconsolidate
Hapi
Connect
LoopBackconsolidate
Restify
Geddyhandlebars, EJS, Jade, Swig, mustache
CompoundJS
Flatiron

consolidate means that the framework supports any templating system supported by consolidate.js.

Contributing

When adding a new framework, you must add the simplest metadata such as links, SLOC, stack, and dependencies. Frameworks without a decent amount of stars are not welcomed. Do not spam your brand new framework.

Performance comparisons are not welcomed.

Metadata should be updated for the latest stable versions, including release candidates, but not including alpha or beta versions.

License

The MIT License (MIT)

Copyright (c) 2014 Jonathan Ong me@jongleberry.com

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

About

A comparison of server-side node frameworks

Resources

Code of conduct

Security policy

Stars

310 stars

Watchers

5 watching

Forks

Releases

Sponsor this project

Packages

Contributors

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); GitHub - pillarjs/node-frameworks: A comparison of server-side node frameworks · GitHub
Skip to content
This repository was archived by the owner on May 14, 2025. It is now read-only.

Latest commit

History

19 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Caution

This repository is archived and no longer actively maintained.

We are no longer accepting issues, feature requests, or pull requests. For additional support or questions, please visit the Express.js Discussions page.

A comparison of server-side node frameworks. This may include frameworks with a browser-side component.

Frameworks

Only frameworks with over 1,000 stars are currently added. Feel free to add your own. The frameworks are listed by number of watchers, descending, as of March 18, 2014.

FrameworkSponsor(s) / Author(s)WatchersStars
MeteorMeteor Development Group97311,687
ExpressStrongLoop / TJ Holowaychuk82812,824
SailsMike McNeil4855,582
KoaTJ Holowaychuk2323,160
DerbyNate SmithBrian Noguchi2133,079
KrakenPayPal2102,424
HapiWalmart Labs2041,981
ConnectSencha Labs2024,180
LoopBackStrongLoop1872,602
RestifyMark Cavage1222,001
GeddyMatthew Eernisse1011,703
CompoundJSAnatoliy Chakkaev911,542
FlatironNodejitsu751,146

Stack Integration

Traditionally, frameworks are explicitly server-side. However, there are now frameworks that are vertically integrated, i.e. integrate the client with the server.

FrameworkServer-sideClient-side
Meteor
Express
Sails
Koa
Derby
Kraken
Hapi
Connect
LoopBack
Restify
Geddy
CompoundJS
Flatiron

Dependencies

Some frameworks are built upon other frameworks.

FrameworkDependencies
Meteor
ExpressConnect for < 4.0.0
SailsExpress
Koa
Derby
KrakenExpress
Hapi
Connect
LoopBackExpress
Restify
Geddy
CompoundJS
Flatiron

Source Lines of Code

This is the lines of code a framework uses, not including comments. This is used to gauge complexity and modularity of a framework.

FrameworkSource Lines of CodeVersion
Meteor
Express1,1504.0.0-rc3
Sails5,3500.10.0-rc4
Koa5500.5.1
Derby1,4500.6.0-alpha3
Kraken6800.7.
Hapi4,7503.0.0
Connect1203.0.0-rc1
LoopBack10,4722.8.0
Restify3,9702.6.3
Geddy5,6600.12.4
CompoundJS3,0101.1.13-1
Flatiron5810.3.11

Note: sloc is used to calculate the SLOC. Most are simply counted by running sloc lib and lines of source code is used.

Middleware/Plugin Signature

Different frameworks use plugins and middleware differently. Some use objects, others use functions. Some work with node's req and res objects, whereas many others do not.

A framework "supports node" if node's req and res objects are passed to plugins and middleware, and using node's req and res objects is supported.

FrameworkSignatureSupports Node
Meteor×
Expressapp.use(function (req, res, next) {})
Sailsfunction(req, res, next)
Koaapp.use(function* (next) {})×
Derby
Krakenapp.use(function (req, res, next) {})
Hapiapp.ext('onRequest', function (req, next) {})×
Connectapp.use(function (req, res, next) {})
LoopBackapp.use(function (req, res, next) {})
Restifyapp.use(function (req, res, next) {})
Geddythis.before(function (req, res) {})
CompoundJS
Flatiron

Error Handling

Error handling in node.js is wonderful! The current solution to catch uncaught exceptions (emitters and streams throwing errors everywhere) is to use domains (unless you listen to every error). If a framework does not handle uncaught exceptions, then domains should probably use domains.

FrameworkMiddleware/PluginUncaught Exceptions Handling
Meteor
Expressnext(err) / app.use(function (err, req, res, next) {})×
Sails
Koatry/catch× - Unnecessary with generators
Derby
Krakennext(err) / app.use(function (err, req, res, next) {})
Hapidomains
Connectnext(err) / app.use(function (err, req, res, next) {})×
LoopBacknext(err) / app.use(function (err, req, res, next) {})x
Restifynext(err)
Geddy
CompoundJS
Flatiron

Control Flow

Most frameworks use only node's traditional callbacks for control. As we move towards ES6, we will see frameworks that use generators and promises to avoid callback hell. Any framework without a control flow is assumed to use callbacks unless otherwise specified.

FrameworkControl Flow
Meteorfibers
Express
Sails
Koagenerators - co
Derby
Kraken
Hapi
Connect
LoopBack
Restify
Geddy
CompoundJS
Flatiron

Included Features

If a feature is not included, there is a very good possibility that it can be used via middleware or plugin. Which features a framework includes or does not include is unimportant - its philosophy is.

FrameworkContent NegotiationCookie ManagementRoutingView SystemBody ParsingMultipart Parsing
Meteor
Express
Sails
Koa
Derby
Kraken
Hapi
Connect
LoopBack
Restify
Geddy
CompoundJS
Flatiron
FrameworkSession ManagementCSRF ProtectionCompressionFile UploadsBasic Authentication
Meteor
Express
Sails
Koa
Derby
Kraken
Hapi
Connect
LoopBack
Restify
Geddy
CompoundJS
Flatiron
  • Content Negotiation - ability to negotiation server response types and the request's acceptable types.
  • Cookie Management - ability to parse cookies as well as set cookies
  • Routing -
  • View System - ability to choose a templating system and render templates by their name
  • Body Parsing - ability to parse urlencoded and json request bodies
  • Multipart Parsing - ability to part multipart request bodies
  • Session Management - ability to provide non-authenticated cookie-based sessions
  • CSRF Protection - built in CSRF protection
  • Compression - built-in gzip and deflate response compression
  • File Uploads - built-in ability to send local files to the client
  • Basic Authentication

Database

FrameworkRequired DatabasesRecommended DatabasesCompatible Databases
MeteorMongoDB
Express
SailsMongoDB, MySQL, Postgres
Koa
Derby
Kraken
Hapi
Connect
LoopBackMicrosoft SQL Server, MongoDB, MySQL, Oracle, Postgres
Restify
GeddyLevelDB, MongoDB, MySQL, Postgres, Riak, SQLite
CompoundJS
Flatiron

Templating

FrameworkRequired Templating SystemsRecommended Templating SystemsCompatible Templating Systems
Meteorhandlebars
Expressconsolidate
Sailsconsolidate
Koa
Derbyhandlebars-like
Krakendustjsconsolidate
Hapi
Connect
LoopBackconsolidate
Restify
Geddyhandlebars, EJS, Jade, Swig, mustache
CompoundJS
Flatiron

consolidate means that the framework supports any templating system supported by consolidate.js.

Contributing

When adding a new framework, you must add the simplest metadata such as links, SLOC, stack, and dependencies. Frameworks without a decent amount of stars are not welcomed. Do not spam your brand new framework.

Performance comparisons are not welcomed.

Metadata should be updated for the latest stable versions, including release candidates, but not including alpha or beta versions.

License

The MIT License (MIT)

Copyright (c) 2014 Jonathan Ong me@jongleberry.com

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

About

A comparison of server-side node frameworks

Resources

Code of conduct

Security policy

Stars

310 stars

Watchers

5 watching

Forks

Releases

Sponsor this project

Packages

Contributors