Repository files navigation

backbone-modulebone

backbone-modulebone is a frontend heavy single-page HTML5 boilerplate app with a Todo app, alerts, authentication, authorization, registration, profile edit, and password reset/change.

"We search for some kind of harmony between two intangibles: a form we have not yet designed and a context we cannot properly describe" -Christopher Alexander, the father of design patterns.

The app is designed using the JavaScript module pattern. It’s composed of a set of highly decoupled, distinct pieces of functionality stored in modules. Loose coupling facilitates easier maintainability by removing dependencies where possible. When this is implemented efficiently, it's quite easy to see how changes to one part of a system may affect another.

Everything each module needs to work should be confined into either the module or plugins that are shared among modules. In this regard, the fact that most modules depend on the Session module model and Alert module collection leaves much to be desired, so feedback is welcome.

Project Structure

Code is divided into modules that live under their own modules directory. A module has dependencies from the common libraries in the application and also has specific code for the packages execution alone; other packages should not require another packages dependencies. This project skeleton was generated using the yeoman generator-bbb. You can see available generators with npm search yeoman-generator and then install them with npm install [name].

app → Application sources
└ bower_components → Bower packages
└ img → Images
└ scripts → JavaScripts
└ modules → Modules
└ account → Account module views
└ nls → National Language Support module views
└ session → Session module views
└ todo → Todo module views, constants
about.js → About module router, views
account.js → Account module router, models, collection
base.js → Base module models
header.js → Header module views
macros.js → Macros module
meta.js → Meta module router, views
nls.js → National Language Support module
session.js → Session module router, model
thing.js → Thing module
todos.js → Todo module router, model, collection
utils.js → Utils module
└ vendor → Vendor JavaScripts
app.js → App
config.js → Require.js configuration
main.js → App entry
router.js → Main router
└ styles → Stylesheets
└ templates → Templates
.buildignore → Used for building
.htaccess → Web server config
404.html → ??? TODO
favicon.ico → Favicon
index.html → The single page that is loaded
robots.txt → Instructions to robots
test → Test scripts
.bowerrc →
.gitignore → Untracked files that git should ignore
.jshintrc →
Gruntfile.js → Workflow tasks
LICENSE → License
README.md → Used for Readme Driven Development
package.json → npm package list

The Backbone.js solves the JavaScript spaghetti problem by providing a MV framework that includes useful constructs such as Event, Router, Model, Collection, and View. It's dependent on Underscore.js (or Lo-Dash). Underscore provides a toolbelt of functional programming support for manipulating common JS data structures.

Continuing with the module pattern, each module can define its own module-specific routes. This is accomplished using the Backbone.subroute plugin. Authenticated views require a session before the route is triggered. The Backbone.routefilter plugin provides before and after filters.

The Backbone.layoutmanager plugin formalizes from start to finish the fetching of layouts and templates, the rendering in any engine, and assembling into the DOM.

The Todo module persists todos to local storage using the Backbone.localStorage adapter. The account module also persists the locale to local storage.

jQuery is used for DOM manipulation, animation, and AJAX. The Animate.less stylesheet is also included to provide a Cross-browser CSS3 animation library.

Maintaining the order of JavaScript includes is a waste of life. Require.js is used for AMD script async loading and file dependency management. The RequireJS text plugin assists with external template management. r.js is used for script optimization.

The goals here are to keep templates logic-less and in external files so that they're designer+developer team ready. Handlebars.js provides logic-less templating. The Backbone.layoutmanager plugin handles any fetching of templates.

Forms are validated using jQuery Validation and kept DRY using Handlebars helpers. Jed adds i18n support in gettext style. i18n bundles are defined using the RequireJS i18n plugin. Moment.js library provides functions for formatting dates.

Responsive templates are styled using Twitter Bootstrap and its JavaScript plugins.Source stylesheet categorization, naming convention, and formatting follows SMACSS.

Logging

javascript-debug provides Console logging with a configurable log level.

Testing

Mocha.js is the front end unit testing framework. It allows you to use any assertion library you want. I used Chai.js. The Sinon.js library is used for test spies, stubs and mocks.

Workflows

Yeoman is a collection of tools and best practices for scaffolding, package management, and build, preview, and test automation.

Install

  1. Install yeoman

  2. Install bower packages. This adds them to the app/bower_components directory.

     $ bower install
    
  3. Install grunt plugins. This adds them to the node_modules directory.

     $ npm install
    

Development process

Yeoman comes with a built-in preview server. While the server is running, the LiveReload watch process automatically compiles source files and refreshes your browser whenever a change is made. Scripts are automatically run against JSHint to ensure they're following language best-practices. The sources can be configured in Gruntfile.js.

If you'd like to use additional Yeoman (bower) packages, yeoman install <package name> them and then copy the necessary files from the component/app/component directories to the app/scripts/vendor directory.

  • Run yeoman server, write code, and watch your changes auto reload!

     $ grunt server
    

Build process

The build process constructs an optimized version of the app that's ready to deploy. The build process is an opinionated workflow. I substituted two tasks. Coffeescript is not used, so I aliased the coffee task with nothing. Less CSS is used instead of SASS so the compass task was aliased with the recess task.

  • Lint JavaScript code for errors and potential problems, create dist directory containing optimized version of app ready for deploying.

     $ grunt
    

Test process

Unit tests are run in a headless WebKit via PhantomJS.

  • Run yeoman server and mocha test runner.

     $ grunt test
    

Deployment process

Once deployed, this app will be a static website hosted on Amazon S3. Deployment is done with grunt-s3, a grunt task that automates the upload/download/delete of files to/from Amazon S3.

  1. Create a setenv.sh script containing the following:

     export AWS_ACCESS_KEY_ID=<ACCESS_KEY_ID>
    export AWS_SECRET_ACCESS_KEY=<SECRET_ACCESS_KEY>
    
  2. Build your app if you haven't done so yet.

  3. Deploy your code.

     $ grunt deploy
    

TODO

Acknowledgements

About

A frontend heavy single-page HTML5 backbone boilerplate app with a Todo app, notifications, authentication, authorization, registration, profile edit, and password reset/change

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n 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;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

backbone-modulebone

backbone-modulebone is a frontend heavy single-page HTML5 boilerplate app with a Todo app, alerts, authentication, authorization, registration, profile edit, and password reset/change.

"We search for some kind of harmony between two intangibles: a form we have not yet designed and a context we cannot properly describe" -Christopher Alexander, the father of design patterns.

The app is designed using the JavaScript module pattern. It’s composed of a set of highly decoupled, distinct pieces of functionality stored in modules. Loose coupling facilitates easier maintainability by removing dependencies where possible. When this is implemented efficiently, it's quite easy to see how changes to one part of a system may affect another.

Everything each module needs to work should be confined into either the module or plugins that are shared among modules. In this regard, the fact that most modules depend on the Session module model and Alert module collection leaves much to be desired, so feedback is welcome.

Project Structure

Code is divided into modules that live under their own modules directory. A module has dependencies from the common libraries in the application and also has specific code for the packages execution alone; other packages should not require another packages dependencies. This project skeleton was generated using the yeoman generator-bbb. You can see available generators with npm search yeoman-generator and then install them with npm install [name].

app → Application sources
└ bower_components → Bower packages
└ img → Images
└ scripts → JavaScripts
└ modules → Modules
└ account → Account module views
└ nls → National Language Support module views
└ session → Session module views
└ todo → Todo module views, constants
about.js → About module router, views
account.js → Account module router, models, collection
base.js → Base module models
header.js → Header module views
macros.js → Macros module
meta.js → Meta module router, views
nls.js → National Language Support module
session.js → Session module router, model
thing.js → Thing module
todos.js → Todo module router, model, collection
utils.js → Utils module
└ vendor → Vendor JavaScripts
app.js → App
config.js → Require.js configuration
main.js → App entry
router.js → Main router
└ styles → Stylesheets
└ templates → Templates
.buildignore → Used for building
.htaccess → Web server config
404.html → ??? TODO
favicon.ico → Favicon
index.html → The single page that is loaded
robots.txt → Instructions to robots
test → Test scripts
.bowerrc →
.gitignore → Untracked files that git should ignore
.jshintrc →
Gruntfile.js → Workflow tasks
LICENSE → License
README.md → Used for Readme Driven Development
package.json → npm package list

The Backbone.js solves the JavaScript spaghetti problem by providing a MV framework that includes useful constructs such as Event, Router, Model, Collection, and View. It's dependent on Underscore.js (or Lo-Dash). Underscore provides a toolbelt of functional programming support for manipulating common JS data structures.

Continuing with the module pattern, each module can define its own module-specific routes. This is accomplished using the Backbone.subroute plugin. Authenticated views require a session before the route is triggered. The Backbone.routefilter plugin provides before and after filters.

The Backbone.layoutmanager plugin formalizes from start to finish the fetching of layouts and templates, the rendering in any engine, and assembling into the DOM.

The Todo module persists todos to local storage using the Backbone.localStorage adapter. The account module also persists the locale to local storage.

jQuery is used for DOM manipulation, animation, and AJAX. The Animate.less stylesheet is also included to provide a Cross-browser CSS3 animation library.

Maintaining the order of JavaScript includes is a waste of life. Require.js is used for AMD script async loading and file dependency management. The RequireJS text plugin assists with external template management. r.js is used for script optimization.

The goals here are to keep templates logic-less and in external files so that they're designer+developer team ready. Handlebars.js provides logic-less templating. The Backbone.layoutmanager plugin handles any fetching of templates.

Forms are validated using jQuery Validation and kept DRY using Handlebars helpers. Jed adds i18n support in gettext style. i18n bundles are defined using the RequireJS i18n plugin. Moment.js library provides functions for formatting dates.

Responsive templates are styled using Twitter Bootstrap and its JavaScript plugins.Source stylesheet categorization, naming convention, and formatting follows SMACSS.

Logging

javascript-debug provides Console logging with a configurable log level.

Testing

Mocha.js is the front end unit testing framework. It allows you to use any assertion library you want. I used Chai.js. The Sinon.js library is used for test spies, stubs and mocks.

Workflows

Yeoman is a collection of tools and best practices for scaffolding, package management, and build, preview, and test automation.

Install

  1. Install yeoman

  2. Install bower packages. This adds them to the app/bower_components directory.

     $ bower install
    
  3. Install grunt plugins. This adds them to the node_modules directory.

     $ npm install
    

Development process

Yeoman comes with a built-in preview server. While the server is running, the LiveReload watch process automatically compiles source files and refreshes your browser whenever a change is made. Scripts are automatically run against JSHint to ensure they're following language best-practices. The sources can be configured in Gruntfile.js.

If you'd like to use additional Yeoman (bower) packages, yeoman install <package name> them and then copy the necessary files from the component/app/component directories to the app/scripts/vendor directory.

  • Run yeoman server, write code, and watch your changes auto reload!

     $ grunt server
    

Build process

The build process constructs an optimized version of the app that's ready to deploy. The build process is an opinionated workflow. I substituted two tasks. Coffeescript is not used, so I aliased the coffee task with nothing. Less CSS is used instead of SASS so the compass task was aliased with the recess task.

  • Lint JavaScript code for errors and potential problems, create dist directory containing optimized version of app ready for deploying.

     $ grunt
    

Test process

Unit tests are run in a headless WebKit via PhantomJS.

  • Run yeoman server and mocha test runner.

     $ grunt test
    

Deployment process

Once deployed, this app will be a static website hosted on Amazon S3. Deployment is done with grunt-s3, a grunt task that automates the upload/download/delete of files to/from Amazon S3.

  1. Create a setenv.sh script containing the following:

     export AWS_ACCESS_KEY_ID=<ACCESS_KEY_ID>
    export AWS_SECRET_ACCESS_KEY=<SECRET_ACCESS_KEY>
    
  2. Build your app if you haven't done so yet.

  3. Deploy your code.

     $ grunt deploy
    

TODO

Acknowledgements

About

A frontend heavy single-page HTML5 backbone boilerplate app with a Todo app, notifications, authentication, authorization, registration, profile edit, and password reset/change

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

backbone-modulebone

backbone-modulebone is a frontend heavy single-page HTML5 boilerplate app with a Todo app, alerts, authentication, authorization, registration, profile edit, and password reset/change.

"We search for some kind of harmony between two intangibles: a form we have not yet designed and a context we cannot properly describe" -Christopher Alexander, the father of design patterns.

The app is designed using the JavaScript module pattern. It’s composed of a set of highly decoupled, distinct pieces of functionality stored in modules. Loose coupling facilitates easier maintainability by removing dependencies where possible. When this is implemented efficiently, it's quite easy to see how changes to one part of a system may affect another.

Everything each module needs to work should be confined into either the module or plugins that are shared among modules. In this regard, the fact that most modules depend on the Session module model and Alert module collection leaves much to be desired, so feedback is welcome.

Project Structure

Code is divided into modules that live under their own modules directory. A module has dependencies from the common libraries in the application and also has specific code for the packages execution alone; other packages should not require another packages dependencies. This project skeleton was generated using the yeoman generator-bbb. You can see available generators with npm search yeoman-generator and then install them with npm install [name].

app → Application sources
└ bower_components → Bower packages
└ img → Images
└ scripts → JavaScripts
└ modules → Modules
└ account → Account module views
└ nls → National Language Support module views
└ session → Session module views
└ todo → Todo module views, constants
about.js → About module router, views
account.js → Account module router, models, collection
base.js → Base module models
header.js → Header module views
macros.js → Macros module
meta.js → Meta module router, views
nls.js → National Language Support module
session.js → Session module router, model
thing.js → Thing module
todos.js → Todo module router, model, collection
utils.js → Utils module
└ vendor → Vendor JavaScripts
app.js → App
config.js → Require.js configuration
main.js → App entry
router.js → Main router
└ styles → Stylesheets
└ templates → Templates
.buildignore → Used for building
.htaccess → Web server config
404.html → ??? TODO
favicon.ico → Favicon
index.html → The single page that is loaded
robots.txt → Instructions to robots
test → Test scripts
.bowerrc →
.gitignore → Untracked files that git should ignore
.jshintrc →
Gruntfile.js → Workflow tasks
LICENSE → License
README.md → Used for Readme Driven Development
package.json → npm package list

The Backbone.js solves the JavaScript spaghetti problem by providing a MV framework that includes useful constructs such as Event, Router, Model, Collection, and View. It's dependent on Underscore.js (or Lo-Dash). Underscore provides a toolbelt of functional programming support for manipulating common JS data structures.

Continuing with the module pattern, each module can define its own module-specific routes. This is accomplished using the Backbone.subroute plugin. Authenticated views require a session before the route is triggered. The Backbone.routefilter plugin provides before and after filters.

The Backbone.layoutmanager plugin formalizes from start to finish the fetching of layouts and templates, the rendering in any engine, and assembling into the DOM.

The Todo module persists todos to local storage using the Backbone.localStorage adapter. The account module also persists the locale to local storage.

jQuery is used for DOM manipulation, animation, and AJAX. The Animate.less stylesheet is also included to provide a Cross-browser CSS3 animation library.

Maintaining the order of JavaScript includes is a waste of life. Require.js is used for AMD script async loading and file dependency management. The RequireJS text plugin assists with external template management. r.js is used for script optimization.

The goals here are to keep templates logic-less and in external files so that they're designer+developer team ready. Handlebars.js provides logic-less templating. The Backbone.layoutmanager plugin handles any fetching of templates.

Forms are validated using jQuery Validation and kept DRY using Handlebars helpers. Jed adds i18n support in gettext style. i18n bundles are defined using the RequireJS i18n plugin. Moment.js library provides functions for formatting dates.

Responsive templates are styled using Twitter Bootstrap and its JavaScript plugins.Source stylesheet categorization, naming convention, and formatting follows SMACSS.

Logging

javascript-debug provides Console logging with a configurable log level.

Testing

Mocha.js is the front end unit testing framework. It allows you to use any assertion library you want. I used Chai.js. The Sinon.js library is used for test spies, stubs and mocks.

Workflows

Yeoman is a collection of tools and best practices for scaffolding, package management, and build, preview, and test automation.

Install

  1. Install yeoman

  2. Install bower packages. This adds them to the app/bower_components directory.

     $ bower install
    
  3. Install grunt plugins. This adds them to the node_modules directory.

     $ npm install
    

Development process

Yeoman comes with a built-in preview server. While the server is running, the LiveReload watch process automatically compiles source files and refreshes your browser whenever a change is made. Scripts are automatically run against JSHint to ensure they're following language best-practices. The sources can be configured in Gruntfile.js.

If you'd like to use additional Yeoman (bower) packages, yeoman install <package name> them and then copy the necessary files from the component/app/component directories to the app/scripts/vendor directory.

  • Run yeoman server, write code, and watch your changes auto reload!

     $ grunt server
    

Build process

The build process constructs an optimized version of the app that's ready to deploy. The build process is an opinionated workflow. I substituted two tasks. Coffeescript is not used, so I aliased the coffee task with nothing. Less CSS is used instead of SASS so the compass task was aliased with the recess task.

  • Lint JavaScript code for errors and potential problems, create dist directory containing optimized version of app ready for deploying.

     $ grunt
    

Test process

Unit tests are run in a headless WebKit via PhantomJS.

  • Run yeoman server and mocha test runner.

     $ grunt test
    

Deployment process

Once deployed, this app will be a static website hosted on Amazon S3. Deployment is done with grunt-s3, a grunt task that automates the upload/download/delete of files to/from Amazon S3.

  1. Create a setenv.sh script containing the following:

     export AWS_ACCESS_KEY_ID=<ACCESS_KEY_ID>
    export AWS_SECRET_ACCESS_KEY=<SECRET_ACCESS_KEY>
    
  2. Build your app if you haven't done so yet.

  3. Deploy your code.

     $ grunt deploy
    

TODO

Acknowledgements

About

A frontend heavy single-page HTML5 backbone boilerplate app with a Todo app, notifications, authentication, authorization, registration, profile edit, and password reset/change

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

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

Repository files navigation

backbone-modulebone

backbone-modulebone is a frontend heavy single-page HTML5 boilerplate app with a Todo app, alerts, authentication, authorization, registration, profile edit, and password reset/change.

"We search for some kind of harmony between two intangibles: a form we have not yet designed and a context we cannot properly describe" -Christopher Alexander, the father of design patterns.

The app is designed using the JavaScript module pattern. It’s composed of a set of highly decoupled, distinct pieces of functionality stored in modules. Loose coupling facilitates easier maintainability by removing dependencies where possible. When this is implemented efficiently, it's quite easy to see how changes to one part of a system may affect another.

Everything each module needs to work should be confined into either the module or plugins that are shared among modules. In this regard, the fact that most modules depend on the Session module model and Alert module collection leaves much to be desired, so feedback is welcome.

Project Structure

Code is divided into modules that live under their own modules directory. A module has dependencies from the common libraries in the application and also has specific code for the packages execution alone; other packages should not require another packages dependencies. This project skeleton was generated using the yeoman generator-bbb. You can see available generators with npm search yeoman-generator and then install them with npm install [name].

app → Application sources
└ bower_components → Bower packages
└ img → Images
└ scripts → JavaScripts
└ modules → Modules
└ account → Account module views
└ nls → National Language Support module views
└ session → Session module views
└ todo → Todo module views, constants
about.js → About module router, views
account.js → Account module router, models, collection
base.js → Base module models
header.js → Header module views
macros.js → Macros module
meta.js → Meta module router, views
nls.js → National Language Support module
session.js → Session module router, model
thing.js → Thing module
todos.js → Todo module router, model, collection
utils.js → Utils module
└ vendor → Vendor JavaScripts
app.js → App
config.js → Require.js configuration
main.js → App entry
router.js → Main router
└ styles → Stylesheets
└ templates → Templates
.buildignore → Used for building
.htaccess → Web server config
404.html → ??? TODO
favicon.ico → Favicon
index.html → The single page that is loaded
robots.txt → Instructions to robots
test → Test scripts
.bowerrc →
.gitignore → Untracked files that git should ignore
.jshintrc →
Gruntfile.js → Workflow tasks
LICENSE → License
README.md → Used for Readme Driven Development
package.json → npm package list

The Backbone.js solves the JavaScript spaghetti problem by providing a MV framework that includes useful constructs such as Event, Router, Model, Collection, and View. It's dependent on Underscore.js (or Lo-Dash). Underscore provides a toolbelt of functional programming support for manipulating common JS data structures.

Continuing with the module pattern, each module can define its own module-specific routes. This is accomplished using the Backbone.subroute plugin. Authenticated views require a session before the route is triggered. The Backbone.routefilter plugin provides before and after filters.

The Backbone.layoutmanager plugin formalizes from start to finish the fetching of layouts and templates, the rendering in any engine, and assembling into the DOM.

The Todo module persists todos to local storage using the Backbone.localStorage adapter. The account module also persists the locale to local storage.

jQuery is used for DOM manipulation, animation, and AJAX. The Animate.less stylesheet is also included to provide a Cross-browser CSS3 animation library.

Maintaining the order of JavaScript includes is a waste of life. Require.js is used for AMD script async loading and file dependency management. The RequireJS text plugin assists with external template management. r.js is used for script optimization.

The goals here are to keep templates logic-less and in external files so that they're designer+developer team ready. Handlebars.js provides logic-less templating. The Backbone.layoutmanager plugin handles any fetching of templates.

Forms are validated using jQuery Validation and kept DRY using Handlebars helpers. Jed adds i18n support in gettext style. i18n bundles are defined using the RequireJS i18n plugin. Moment.js library provides functions for formatting dates.

Responsive templates are styled using Twitter Bootstrap and its JavaScript plugins.Source stylesheet categorization, naming convention, and formatting follows SMACSS.

Logging

javascript-debug provides Console logging with a configurable log level.

Testing

Mocha.js is the front end unit testing framework. It allows you to use any assertion library you want. I used Chai.js. The Sinon.js library is used for test spies, stubs and mocks.

Workflows

Yeoman is a collection of tools and best practices for scaffolding, package management, and build, preview, and test automation.

Install

  1. Install yeoman

  2. Install bower packages. This adds them to the app/bower_components directory.

     $ bower install
    
  3. Install grunt plugins. This adds them to the node_modules directory.

     $ npm install
    

Development process

Yeoman comes with a built-in preview server. While the server is running, the LiveReload watch process automatically compiles source files and refreshes your browser whenever a change is made. Scripts are automatically run against JSHint to ensure they're following language best-practices. The sources can be configured in Gruntfile.js.

If you'd like to use additional Yeoman (bower) packages, yeoman install <package name> them and then copy the necessary files from the component/app/component directories to the app/scripts/vendor directory.

  • Run yeoman server, write code, and watch your changes auto reload!

     $ grunt server
    

Build process

The build process constructs an optimized version of the app that's ready to deploy. The build process is an opinionated workflow. I substituted two tasks. Coffeescript is not used, so I aliased the coffee task with nothing. Less CSS is used instead of SASS so the compass task was aliased with the recess task.

  • Lint JavaScript code for errors and potential problems, create dist directory containing optimized version of app ready for deploying.

     $ grunt
    

Test process

Unit tests are run in a headless WebKit via PhantomJS.

  • Run yeoman server and mocha test runner.

     $ grunt test
    

Deployment process

Once deployed, this app will be a static website hosted on Amazon S3. Deployment is done with grunt-s3, a grunt task that automates the upload/download/delete of files to/from Amazon S3.

  1. Create a setenv.sh script containing the following:

     export AWS_ACCESS_KEY_ID=<ACCESS_KEY_ID>
    export AWS_SECRET_ACCESS_KEY=<SECRET_ACCESS_KEY>
    
  2. Build your app if you haven't done so yet.

  3. Deploy your code.

     $ grunt deploy
    

TODO

Acknowledgements

About

A frontend heavy single-page HTML5 backbone boilerplate app with a Todo app, notifications, authentication, authorization, registration, profile edit, and password reset/change

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

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

Repository files navigation

backbone-modulebone

backbone-modulebone is a frontend heavy single-page HTML5 boilerplate app with a Todo app, alerts, authentication, authorization, registration, profile edit, and password reset/change.

"We search for some kind of harmony between two intangibles: a form we have not yet designed and a context we cannot properly describe" -Christopher Alexander, the father of design patterns.

The app is designed using the JavaScript module pattern. It’s composed of a set of highly decoupled, distinct pieces of functionality stored in modules. Loose coupling facilitates easier maintainability by removing dependencies where possible. When this is implemented efficiently, it's quite easy to see how changes to one part of a system may affect another.

Everything each module needs to work should be confined into either the module or plugins that are shared among modules. In this regard, the fact that most modules depend on the Session module model and Alert module collection leaves much to be desired, so feedback is welcome.

Project Structure

Code is divided into modules that live under their own modules directory. A module has dependencies from the common libraries in the application and also has specific code for the packages execution alone; other packages should not require another packages dependencies. This project skeleton was generated using the yeoman generator-bbb. You can see available generators with npm search yeoman-generator and then install them with npm install [name].

app → Application sources
└ bower_components → Bower packages
└ img → Images
└ scripts → JavaScripts
└ modules → Modules
└ account → Account module views
└ nls → National Language Support module views
└ session → Session module views
└ todo → Todo module views, constants
about.js → About module router, views
account.js → Account module router, models, collection
base.js → Base module models
header.js → Header module views
macros.js → Macros module
meta.js → Meta module router, views
nls.js → National Language Support module
session.js → Session module router, model
thing.js → Thing module
todos.js → Todo module router, model, collection
utils.js → Utils module
└ vendor → Vendor JavaScripts
app.js → App
config.js → Require.js configuration
main.js → App entry
router.js → Main router
└ styles → Stylesheets
└ templates → Templates
.buildignore → Used for building
.htaccess → Web server config
404.html → ??? TODO
favicon.ico → Favicon
index.html → The single page that is loaded
robots.txt → Instructions to robots
test → Test scripts
.bowerrc →
.gitignore → Untracked files that git should ignore
.jshintrc →
Gruntfile.js → Workflow tasks
LICENSE → License
README.md → Used for Readme Driven Development
package.json → npm package list

The Backbone.js solves the JavaScript spaghetti problem by providing a MV framework that includes useful constructs such as Event, Router, Model, Collection, and View. It's dependent on Underscore.js (or Lo-Dash). Underscore provides a toolbelt of functional programming support for manipulating common JS data structures.

Continuing with the module pattern, each module can define its own module-specific routes. This is accomplished using the Backbone.subroute plugin. Authenticated views require a session before the route is triggered. The Backbone.routefilter plugin provides before and after filters.

The Backbone.layoutmanager plugin formalizes from start to finish the fetching of layouts and templates, the rendering in any engine, and assembling into the DOM.

The Todo module persists todos to local storage using the Backbone.localStorage adapter. The account module also persists the locale to local storage.

jQuery is used for DOM manipulation, animation, and AJAX. The Animate.less stylesheet is also included to provide a Cross-browser CSS3 animation library.

Maintaining the order of JavaScript includes is a waste of life. Require.js is used for AMD script async loading and file dependency management. The RequireJS text plugin assists with external template management. r.js is used for script optimization.

The goals here are to keep templates logic-less and in external files so that they're designer+developer team ready. Handlebars.js provides logic-less templating. The Backbone.layoutmanager plugin handles any fetching of templates.

Forms are validated using jQuery Validation and kept DRY using Handlebars helpers. Jed adds i18n support in gettext style. i18n bundles are defined using the RequireJS i18n plugin. Moment.js library provides functions for formatting dates.

Responsive templates are styled using Twitter Bootstrap and its JavaScript plugins.Source stylesheet categorization, naming convention, and formatting follows SMACSS.

Logging

javascript-debug provides Console logging with a configurable log level.

Testing

Mocha.js is the front end unit testing framework. It allows you to use any assertion library you want. I used Chai.js. The Sinon.js library is used for test spies, stubs and mocks.

Workflows

Yeoman is a collection of tools and best practices for scaffolding, package management, and build, preview, and test automation.

Install

  1. Install yeoman

  2. Install bower packages. This adds them to the app/bower_components directory.

     $ bower install
    
  3. Install grunt plugins. This adds them to the node_modules directory.

     $ npm install
    

Development process

Yeoman comes with a built-in preview server. While the server is running, the LiveReload watch process automatically compiles source files and refreshes your browser whenever a change is made. Scripts are automatically run against JSHint to ensure they're following language best-practices. The sources can be configured in Gruntfile.js.

If you'd like to use additional Yeoman (bower) packages, yeoman install <package name> them and then copy the necessary files from the component/app/component directories to the app/scripts/vendor directory.

  • Run yeoman server, write code, and watch your changes auto reload!

     $ grunt server
    

Build process

The build process constructs an optimized version of the app that's ready to deploy. The build process is an opinionated workflow. I substituted two tasks. Coffeescript is not used, so I aliased the coffee task with nothing. Less CSS is used instead of SASS so the compass task was aliased with the recess task.

  • Lint JavaScript code for errors and potential problems, create dist directory containing optimized version of app ready for deploying.

     $ grunt
    

Test process

Unit tests are run in a headless WebKit via PhantomJS.

  • Run yeoman server and mocha test runner.

     $ grunt test
    

Deployment process

Once deployed, this app will be a static website hosted on Amazon S3. Deployment is done with grunt-s3, a grunt task that automates the upload/download/delete of files to/from Amazon S3.

  1. Create a setenv.sh script containing the following:

     export AWS_ACCESS_KEY_ID=<ACCESS_KEY_ID>
    export AWS_SECRET_ACCESS_KEY=<SECRET_ACCESS_KEY>
    
  2. Build your app if you haven't done so yet.

  3. Deploy your code.

     $ grunt deploy
    

TODO

Acknowledgements

About

A frontend heavy single-page HTML5 backbone boilerplate app with a Todo app, notifications, authentication, authorization, registration, profile edit, and password reset/change

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

backbone-modulebone

backbone-modulebone is a frontend heavy single-page HTML5 boilerplate app with a Todo app, alerts, authentication, authorization, registration, profile edit, and password reset/change.

"We search for some kind of harmony between two intangibles: a form we have not yet designed and a context we cannot properly describe" -Christopher Alexander, the father of design patterns.

The app is designed using the JavaScript module pattern. It’s composed of a set of highly decoupled, distinct pieces of functionality stored in modules. Loose coupling facilitates easier maintainability by removing dependencies where possible. When this is implemented efficiently, it's quite easy to see how changes to one part of a system may affect another.

Everything each module needs to work should be confined into either the module or plugins that are shared among modules. In this regard, the fact that most modules depend on the Session module model and Alert module collection leaves much to be desired, so feedback is welcome.

Project Structure

Code is divided into modules that live under their own modules directory. A module has dependencies from the common libraries in the application and also has specific code for the packages execution alone; other packages should not require another packages dependencies. This project skeleton was generated using the yeoman generator-bbb. You can see available generators with npm search yeoman-generator and then install them with npm install [name].

app → Application sources
└ bower_components → Bower packages
└ img → Images
└ scripts → JavaScripts
└ modules → Modules
└ account → Account module views
└ nls → National Language Support module views
└ session → Session module views
└ todo → Todo module views, constants
about.js → About module router, views
account.js → Account module router, models, collection
base.js → Base module models
header.js → Header module views
macros.js → Macros module
meta.js → Meta module router, views
nls.js → National Language Support module
session.js → Session module router, model
thing.js → Thing module
todos.js → Todo module router, model, collection
utils.js → Utils module
└ vendor → Vendor JavaScripts
app.js → App
config.js → Require.js configuration
main.js → App entry
router.js → Main router
└ styles → Stylesheets
└ templates → Templates
.buildignore → Used for building
.htaccess → Web server config
404.html → ??? TODO
favicon.ico → Favicon
index.html → The single page that is loaded
robots.txt → Instructions to robots
test → Test scripts
.bowerrc →
.gitignore → Untracked files that git should ignore
.jshintrc →
Gruntfile.js → Workflow tasks
LICENSE → License
README.md → Used for Readme Driven Development
package.json → npm package list

The Backbone.js solves the JavaScript spaghetti problem by providing a MV framework that includes useful constructs such as Event, Router, Model, Collection, and View. It's dependent on Underscore.js (or Lo-Dash). Underscore provides a toolbelt of functional programming support for manipulating common JS data structures.

Continuing with the module pattern, each module can define its own module-specific routes. This is accomplished using the Backbone.subroute plugin. Authenticated views require a session before the route is triggered. The Backbone.routefilter plugin provides before and after filters.

The Backbone.layoutmanager plugin formalizes from start to finish the fetching of layouts and templates, the rendering in any engine, and assembling into the DOM.

The Todo module persists todos to local storage using the Backbone.localStorage adapter. The account module also persists the locale to local storage.

jQuery is used for DOM manipulation, animation, and AJAX. The Animate.less stylesheet is also included to provide a Cross-browser CSS3 animation library.

Maintaining the order of JavaScript includes is a waste of life. Require.js is used for AMD script async loading and file dependency management. The RequireJS text plugin assists with external template management. r.js is used for script optimization.

The goals here are to keep templates logic-less and in external files so that they're designer+developer team ready. Handlebars.js provides logic-less templating. The Backbone.layoutmanager plugin handles any fetching of templates.

Forms are validated using jQuery Validation and kept DRY using Handlebars helpers. Jed adds i18n support in gettext style. i18n bundles are defined using the RequireJS i18n plugin. Moment.js library provides functions for formatting dates.

Responsive templates are styled using Twitter Bootstrap and its JavaScript plugins.Source stylesheet categorization, naming convention, and formatting follows SMACSS.

Logging

javascript-debug provides Console logging with a configurable log level.

Testing

Mocha.js is the front end unit testing framework. It allows you to use any assertion library you want. I used Chai.js. The Sinon.js library is used for test spies, stubs and mocks.

Workflows

Yeoman is a collection of tools and best practices for scaffolding, package management, and build, preview, and test automation.

Install

  1. Install yeoman

  2. Install bower packages. This adds them to the app/bower_components directory.

     $ bower install
    
  3. Install grunt plugins. This adds them to the node_modules directory.

     $ npm install
    

Development process

Yeoman comes with a built-in preview server. While the server is running, the LiveReload watch process automatically compiles source files and refreshes your browser whenever a change is made. Scripts are automatically run against JSHint to ensure they're following language best-practices. The sources can be configured in Gruntfile.js.

If you'd like to use additional Yeoman (bower) packages, yeoman install <package name> them and then copy the necessary files from the component/app/component directories to the app/scripts/vendor directory.

  • Run yeoman server, write code, and watch your changes auto reload!

     $ grunt server
    

Build process

The build process constructs an optimized version of the app that's ready to deploy. The build process is an opinionated workflow. I substituted two tasks. Coffeescript is not used, so I aliased the coffee task with nothing. Less CSS is used instead of SASS so the compass task was aliased with the recess task.

  • Lint JavaScript code for errors and potential problems, create dist directory containing optimized version of app ready for deploying.

     $ grunt
    

Test process

Unit tests are run in a headless WebKit via PhantomJS.

  • Run yeoman server and mocha test runner.

     $ grunt test
    

Deployment process

Once deployed, this app will be a static website hosted on Amazon S3. Deployment is done with grunt-s3, a grunt task that automates the upload/download/delete of files to/from Amazon S3.

  1. Create a setenv.sh script containing the following:

     export AWS_ACCESS_KEY_ID=<ACCESS_KEY_ID>
    export AWS_SECRET_ACCESS_KEY=<SECRET_ACCESS_KEY>
    
  2. Build your app if you haven't done so yet.

  3. Deploy your code.

     $ grunt deploy
    

TODO

Acknowledgements

About

A frontend heavy single-page HTML5 backbone boilerplate app with a Todo app, notifications, authentication, authorization, registration, profile edit, and password reset/change

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

backbone-modulebone

backbone-modulebone is a frontend heavy single-page HTML5 boilerplate app with a Todo app, alerts, authentication, authorization, registration, profile edit, and password reset/change.

"We search for some kind of harmony between two intangibles: a form we have not yet designed and a context we cannot properly describe" -Christopher Alexander, the father of design patterns.

The app is designed using the JavaScript module pattern. It’s composed of a set of highly decoupled, distinct pieces of functionality stored in modules. Loose coupling facilitates easier maintainability by removing dependencies where possible. When this is implemented efficiently, it's quite easy to see how changes to one part of a system may affect another.

Everything each module needs to work should be confined into either the module or plugins that are shared among modules. In this regard, the fact that most modules depend on the Session module model and Alert module collection leaves much to be desired, so feedback is welcome.

Project Structure

Code is divided into modules that live under their own modules directory. A module has dependencies from the common libraries in the application and also has specific code for the packages execution alone; other packages should not require another packages dependencies. This project skeleton was generated using the yeoman generator-bbb. You can see available generators with npm search yeoman-generator and then install them with npm install [name].

app → Application sources
└ bower_components → Bower packages
└ img → Images
└ scripts → JavaScripts
└ modules → Modules
└ account → Account module views
└ nls → National Language Support module views
└ session → Session module views
└ todo → Todo module views, constants
about.js → About module router, views
account.js → Account module router, models, collection
base.js → Base module models
header.js → Header module views
macros.js → Macros module
meta.js → Meta module router, views
nls.js → National Language Support module
session.js → Session module router, model
thing.js → Thing module
todos.js → Todo module router, model, collection
utils.js → Utils module
└ vendor → Vendor JavaScripts
app.js → App
config.js → Require.js configuration
main.js → App entry
router.js → Main router
└ styles → Stylesheets
└ templates → Templates
.buildignore → Used for building
.htaccess → Web server config
404.html → ??? TODO
favicon.ico → Favicon
index.html → The single page that is loaded
robots.txt → Instructions to robots
test → Test scripts
.bowerrc →
.gitignore → Untracked files that git should ignore
.jshintrc →
Gruntfile.js → Workflow tasks
LICENSE → License
README.md → Used for Readme Driven Development
package.json → npm package list

The Backbone.js solves the JavaScript spaghetti problem by providing a MV framework that includes useful constructs such as Event, Router, Model, Collection, and View. It's dependent on Underscore.js (or Lo-Dash). Underscore provides a toolbelt of functional programming support for manipulating common JS data structures.

Continuing with the module pattern, each module can define its own module-specific routes. This is accomplished using the Backbone.subroute plugin. Authenticated views require a session before the route is triggered. The Backbone.routefilter plugin provides before and after filters.

The Backbone.layoutmanager plugin formalizes from start to finish the fetching of layouts and templates, the rendering in any engine, and assembling into the DOM.

The Todo module persists todos to local storage using the Backbone.localStorage adapter. The account module also persists the locale to local storage.

jQuery is used for DOM manipulation, animation, and AJAX. The Animate.less stylesheet is also included to provide a Cross-browser CSS3 animation library.

Maintaining the order of JavaScript includes is a waste of life. Require.js is used for AMD script async loading and file dependency management. The RequireJS text plugin assists with external template management. r.js is used for script optimization.

The goals here are to keep templates logic-less and in external files so that they're designer+developer team ready. Handlebars.js provides logic-less templating. The Backbone.layoutmanager plugin handles any fetching of templates.

Forms are validated using jQuery Validation and kept DRY using Handlebars helpers. Jed adds i18n support in gettext style. i18n bundles are defined using the RequireJS i18n plugin. Moment.js library provides functions for formatting dates.

Responsive templates are styled using Twitter Bootstrap and its JavaScript plugins.Source stylesheet categorization, naming convention, and formatting follows SMACSS.

Logging

javascript-debug provides Console logging with a configurable log level.

Testing

Mocha.js is the front end unit testing framework. It allows you to use any assertion library you want. I used Chai.js. The Sinon.js library is used for test spies, stubs and mocks.

Workflows

Yeoman is a collection of tools and best practices for scaffolding, package management, and build, preview, and test automation.

Install

  1. Install yeoman

  2. Install bower packages. This adds them to the app/bower_components directory.

     $ bower install
    
  3. Install grunt plugins. This adds them to the node_modules directory.

     $ npm install
    

Development process

Yeoman comes with a built-in preview server. While the server is running, the LiveReload watch process automatically compiles source files and refreshes your browser whenever a change is made. Scripts are automatically run against JSHint to ensure they're following language best-practices. The sources can be configured in Gruntfile.js.

If you'd like to use additional Yeoman (bower) packages, yeoman install <package name> them and then copy the necessary files from the component/app/component directories to the app/scripts/vendor directory.

  • Run yeoman server, write code, and watch your changes auto reload!

     $ grunt server
    

Build process

The build process constructs an optimized version of the app that's ready to deploy. The build process is an opinionated workflow. I substituted two tasks. Coffeescript is not used, so I aliased the coffee task with nothing. Less CSS is used instead of SASS so the compass task was aliased with the recess task.

  • Lint JavaScript code for errors and potential problems, create dist directory containing optimized version of app ready for deploying.

     $ grunt
    

Test process

Unit tests are run in a headless WebKit via PhantomJS.

  • Run yeoman server and mocha test runner.

     $ grunt test
    

Deployment process

Once deployed, this app will be a static website hosted on Amazon S3. Deployment is done with grunt-s3, a grunt task that automates the upload/download/delete of files to/from Amazon S3.

  1. Create a setenv.sh script containing the following:

     export AWS_ACCESS_KEY_ID=<ACCESS_KEY_ID>
    export AWS_SECRET_ACCESS_KEY=<SECRET_ACCESS_KEY>
    
  2. Build your app if you haven't done so yet.

  3. Deploy your code.

     $ grunt deploy
    

TODO

Acknowledgements

About

A frontend heavy single-page HTML5 backbone boilerplate app with a Todo app, notifications, authentication, authorization, registration, profile edit, and password reset/change

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

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

Repository files navigation

backbone-modulebone

backbone-modulebone is a frontend heavy single-page HTML5 boilerplate app with a Todo app, alerts, authentication, authorization, registration, profile edit, and password reset/change.

"We search for some kind of harmony between two intangibles: a form we have not yet designed and a context we cannot properly describe" -Christopher Alexander, the father of design patterns.

The app is designed using the JavaScript module pattern. It’s composed of a set of highly decoupled, distinct pieces of functionality stored in modules. Loose coupling facilitates easier maintainability by removing dependencies where possible. When this is implemented efficiently, it's quite easy to see how changes to one part of a system may affect another.

Everything each module needs to work should be confined into either the module or plugins that are shared among modules. In this regard, the fact that most modules depend on the Session module model and Alert module collection leaves much to be desired, so feedback is welcome.

Project Structure

Code is divided into modules that live under their own modules directory. A module has dependencies from the common libraries in the application and also has specific code for the packages execution alone; other packages should not require another packages dependencies. This project skeleton was generated using the yeoman generator-bbb. You can see available generators with npm search yeoman-generator and then install them with npm install [name].

app → Application sources
└ bower_components → Bower packages
└ img → Images
└ scripts → JavaScripts
└ modules → Modules
└ account → Account module views
└ nls → National Language Support module views
└ session → Session module views
└ todo → Todo module views, constants
about.js → About module router, views
account.js → Account module router, models, collection
base.js → Base module models
header.js → Header module views
macros.js → Macros module
meta.js → Meta module router, views
nls.js → National Language Support module
session.js → Session module router, model
thing.js → Thing module
todos.js → Todo module router, model, collection
utils.js → Utils module
└ vendor → Vendor JavaScripts
app.js → App
config.js → Require.js configuration
main.js → App entry
router.js → Main router
└ styles → Stylesheets
└ templates → Templates
.buildignore → Used for building
.htaccess → Web server config
404.html → ??? TODO
favicon.ico → Favicon
index.html → The single page that is loaded
robots.txt → Instructions to robots
test → Test scripts
.bowerrc →
.gitignore → Untracked files that git should ignore
.jshintrc →
Gruntfile.js → Workflow tasks
LICENSE → License
README.md → Used for Readme Driven Development
package.json → npm package list

The Backbone.js solves the JavaScript spaghetti problem by providing a MV framework that includes useful constructs such as Event, Router, Model, Collection, and View. It's dependent on Underscore.js (or Lo-Dash). Underscore provides a toolbelt of functional programming support for manipulating common JS data structures.

Continuing with the module pattern, each module can define its own module-specific routes. This is accomplished using the Backbone.subroute plugin. Authenticated views require a session before the route is triggered. The Backbone.routefilter plugin provides before and after filters.

The Backbone.layoutmanager plugin formalizes from start to finish the fetching of layouts and templates, the rendering in any engine, and assembling into the DOM.

The Todo module persists todos to local storage using the Backbone.localStorage adapter. The account module also persists the locale to local storage.

jQuery is used for DOM manipulation, animation, and AJAX. The Animate.less stylesheet is also included to provide a Cross-browser CSS3 animation library.

Maintaining the order of JavaScript includes is a waste of life. Require.js is used for AMD script async loading and file dependency management. The RequireJS text plugin assists with external template management. r.js is used for script optimization.

The goals here are to keep templates logic-less and in external files so that they're designer+developer team ready. Handlebars.js provides logic-less templating. The Backbone.layoutmanager plugin handles any fetching of templates.

Forms are validated using jQuery Validation and kept DRY using Handlebars helpers. Jed adds i18n support in gettext style. i18n bundles are defined using the RequireJS i18n plugin. Moment.js library provides functions for formatting dates.

Responsive templates are styled using Twitter Bootstrap and its JavaScript plugins.Source stylesheet categorization, naming convention, and formatting follows SMACSS.

Logging

javascript-debug provides Console logging with a configurable log level.

Testing

Mocha.js is the front end unit testing framework. It allows you to use any assertion library you want. I used Chai.js. The Sinon.js library is used for test spies, stubs and mocks.

Workflows

Yeoman is a collection of tools and best practices for scaffolding, package management, and build, preview, and test automation.

Install

  1. Install yeoman

  2. Install bower packages. This adds them to the app/bower_components directory.

     $ bower install
    
  3. Install grunt plugins. This adds them to the node_modules directory.

     $ npm install
    

Development process

Yeoman comes with a built-in preview server. While the server is running, the LiveReload watch process automatically compiles source files and refreshes your browser whenever a change is made. Scripts are automatically run against JSHint to ensure they're following language best-practices. The sources can be configured in Gruntfile.js.

If you'd like to use additional Yeoman (bower) packages, yeoman install <package name> them and then copy the necessary files from the component/app/component directories to the app/scripts/vendor directory.

  • Run yeoman server, write code, and watch your changes auto reload!

     $ grunt server
    

Build process

The build process constructs an optimized version of the app that's ready to deploy. The build process is an opinionated workflow. I substituted two tasks. Coffeescript is not used, so I aliased the coffee task with nothing. Less CSS is used instead of SASS so the compass task was aliased with the recess task.

  • Lint JavaScript code for errors and potential problems, create dist directory containing optimized version of app ready for deploying.

     $ grunt
    

Test process

Unit tests are run in a headless WebKit via PhantomJS.

  • Run yeoman server and mocha test runner.

     $ grunt test
    

Deployment process

Once deployed, this app will be a static website hosted on Amazon S3. Deployment is done with grunt-s3, a grunt task that automates the upload/download/delete of files to/from Amazon S3.

  1. Create a setenv.sh script containing the following:

     export AWS_ACCESS_KEY_ID=<ACCESS_KEY_ID>
    export AWS_SECRET_ACCESS_KEY=<SECRET_ACCESS_KEY>
    
  2. Build your app if you haven't done so yet.

  3. Deploy your code.

     $ grunt deploy
    

TODO

Acknowledgements

About

A frontend heavy single-page HTML5 backbone boilerplate app with a Todo app, notifications, authentication, authorization, registration, profile edit, and password reset/change

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages