cujoJS's mission is to provide the missing, yet vital, architectural tools and guidance that developers and library authors need to easily create unique and amazing applications.
The web is an incredible application platform. It delivers the best user experience to the widest audience: desktops, phones, tablets, TVs. The trend to deliver ever larger applications and richer, more responsive user experiences continues unabated. We recognize that this trend necessarily increases the complexity of browser-based front-end applications.
Larger, more complex front-end applications require carefully crafted architecture and deliberate code organization.
As the size of software systems increases, the algorithms and data structures of the computation no longer constitute the major design problems. When systems are constructed from many components, the organization of the overall system — the software architecture — presents a new set of design problems.
— An Introduction to Software Architecture, Garlan & Shaw
The developer community has embraced the challenge to deliver richer apps with an impressive variety of specialized libraries and frameworks. Frameworks provide an easy startup experience for developers but lack the architectural tools necessary to address the unique needs of each application. They inevitably become a significant limiting factor as applications grow. Application developers must invent, develop, test, and maintain custom solutions to scale beyond the framework's limitations.
Our goals are simple. We strive to:
A great end user experience is the ultimate goal. cujoJS places absolutely no restrictions on how you achieve this. We encourage you to choose any third-party widgets, libraries, or toolkits, and if they're reasonably open, we will integrate with them.
We understand that performance is tantamount to user experience. We obsess on performance as much as we obsess on openness.
While we understand that some of cujoJS's concepts may be novel to web developers, we do our best to craft APIs that are flexible, consumable, and intuitive for all experience levels.
In a world where components are easily composed and connected, there's no need to amass multiple components into a tool or lib. Library authors shouldn't reinvent yet another silo of interlocked models, views, controllers, message systems, and/or routers. Just deliver an awesome modeling lib or a great templating lib, for instance, and use architecturally sound patterns to integrate with other awesome libs.