π¦ Modular Structure
OnigiriJS is built as a modular framework, allowing you to load only the features you need for optimal performance and smaller bundle sizes.
Why Modular?
Faster Loading
Load only what you need - reduce bundle size by up to 70%
Precise Control
Pick exactly which features your app needs
Easy Maintenance
Each module is independent and focused
Scalable
Start small, add features as you grow
Available Modules
Core Module (Required)
// onigiri-core.js - ~8KB
// - DOM manipulation
// - Element selection
// - Basic utilities
// - Plugin system
<script src="onigiri-core.js"></script>
Events Module
// onigiri-events.js - ~3KB
// - Event emitter
// - Namespaced events
// - Once events
// - Event delegation
<script src="onigiri-core.js"></script>
<script src="onigiri-events.js"></script>
Components Module
// onigiri-components.js - ~5KB
// - Reactive components
// - Lifecycle hooks
// - Computed properties
// - Data watchers
<script src="onigiri-core.js"></script>
<script src="onigiri-events.js"></script>
<script src="onigiri-components.js"></script>
Security Module
// onigiri-security.js - ~4KB
// - CSRF protection
// - CSP support
// - XSS prevention
// - URL validation
<script src="onigiri-core.js"></script>
<script src="onigiri-security.js"></script>
AJAX Module
// onigiri-ajax.js - ~2KB
// - AJAX requests
// - Auto-CSRF
// - Promise-based
// - Convenience methods
<script src="onigiri-core.js"></script>
<script src="onigiri-security.js"></script>
<script src="onigiri-ajax.js"></script>
Storage Module
// onigiri-storage.js - ~3KB
// - Local storage
// - Session storage
// - Expiration support
// - Prefix management
<script src="onigiri-core.js"></script>
<script src="onigiri-storage.js"></script>
PJAX Module
// onigiri-pjax.js - ~4KB
// - PJAX navigation
// - Browser history
// - Response caching
// - Event hooks
<script src="onigiri-core.js"></script>
<script src="onigiri-security.js"></script>
<script src="onigiri-pjax.js"></script>
Validation Module
// onigiri-validation.js - ~3KB
// - Form validation
// - Built-in rules
// - Custom rules
// - Real-time validation
<script src="onigiri-core.js"></script>
<script src="onigiri-validation.js"></script>
Animation Module
// onigiri-animate.js - ~2KB
// - Fade in/out
// - Slide up/down
// - Smooth animations
// - Callback support
<script src="onigiri-core.js"></script>
<script src="onigiri-animate.js"></script>
HumHub Module
// onigiri-humhub.js - ~2KB
// - HumHub integration
// - Auto PJAX remounting
// - Module helper
<script src="onigiri-core.js"></script>
<script src="onigiri-events.js"></script>
<script src="onigiri-components.js"></script>
<script src="onigiri-humhub.js"></script>
Loading Strategies
Minimal Setup (DOM Only)
<!-- Just 8KB for basic DOM manipulation -->
<script src="onigiri-core.js"></script>
<script>
// DOM manipulation only
O('.button').on('click', function() {
O(this).addClass('active');
});
</script>
Basic Reactive App
<!-- ~16KB for reactive components -->
<script src="onigiri-core.js"></script>
<script src="onigiri-events.js"></script>
<script src="onigiri-components.js"></script>
<script>
const app = new Onigiri.prototype.Component({
data: { count: 0 },
methods: {
increment() { this.count++; }
}
});
</script>
Full-Featured App
<!-- ~30KB for complete feature set -->
<script src="onigiri-core.js"></script>
<script src="onigiri-events.js"></script>
<script src="onigiri-components.js"></script>
<script src="onigiri-security.js"></script>
<script src="onigiri-ajax.js"></script>
<script src="onigiri-storage.js"></script>
<script src="onigiri-pjax.js"></script>
<script src="onigiri-validation.js"></script>
<script src="onigiri-animate.js"></script>
HumHub Module
<!-- Optimized for HumHub -->
<script src="onigiri-core.js"></script>
<script src="onigiri-events.js"></script>
<script src="onigiri-components.js"></script>
<script src="onigiri-security.js"></script>
<script src="onigiri-ajax.js"></script>
<script src="onigiri-storage.js"></script>
<script src="onigiri-humhub.js"></script>
Module Dependencies
// Dependency tree
onigiri-core.js (required, no dependencies)
βββ onigiri-events.js (depends on: core)
β βββ onigiri-components.js (depends on: core, events)
β βββ onigiri-humhub.js (depends on: core, events, components)
βββ onigiri-security.js (depends on: core)
β βββ onigiri-ajax.js (depends on: core, security)
β βββ onigiri-pjax.js (depends on: core, security)
βββ onigiri-storage.js (depends on: core)
βββ onigiri-validation.js (depends on: core)
βββ onigiri-animate.js (depends on: core)
Checking Loaded Modules
// Check which modules are loaded
console.log(Onigiri.modules);
// { core: true, events: true, components: true, ... }
// Check specific module
if (Onigiri.modules.security) {
// Security module is loaded
Onigiri.security.init();
}
if (Onigiri.modules.pjax) {
// PJAX module is loaded
Onigiri.pjax.init();
}
Conditional Loading
Load Modules Based on Features
<!-- Core always loaded -->
<script src="onigiri-core.js"></script>
<?php if ($needsComponents): ?>
<script src="onigiri-events.js"></script>
<script src="onigiri-components.js"></script>
<?php endif; ?>
<?php if ($needsAjax): ?>
<script src="onigiri-security.js"></script>
<script src="onigiri-ajax.js"></script>
<?php endif; ?>
<?php if ($needsValidation): ?>
<script src="onigiri-validation.js"></script>
<?php endif; ?>
Dynamic Module Loading
// Load module dynamically
async function loadModule(moduleName) {
return new Promise((resolve, reject) => {
const script = document.createElement('script');
script.src = \`onigiri.\${moduleName}.js\`;
script.onload = resolve;
script.onerror = reject;
document.head.appendChild(script);
});
}
// Usage
async function enableValidation() {
if (!Onigiri.modules.validation) {
await loadModule('validation');
console.log('π Validation module loaded!');
}
// Now use validation
const result = O('#form').validate(rules);
}
Build Your Own Bundle
Custom Build Script
// build-custom.js
const fs = require('fs');
const modules = [
'onigiri-core.js',
'onigiri-events.js',
'onigiri-components.js',
'onigiri-security.js',
'onigiri-ajax.js'
];
let combined = '';
modules.forEach(module => {
combined += fs.readFileSync(module, 'utf8');
combined += '\n\n';
});
fs.writeFileSync('onigiri.custom.js', combined);
console.log('π Custom bundle created!');
Concatenate Modules
#!/bin/bash
# build.sh
# Create custom bundle
cat onigiri-core.js \
onigiri-events.js \
onigiri-components.js \
onigiri-security.js \
onigiri-ajax.js \
onigiri-storage.js \
> onigiri.bundle.js
echo "π Bundle created: onigiri.bundle.js"
Module Size Comparison
// Approximate sizes (minified)
onigiri-core.js ~8KB ββββββββ
onigiri-events.js ~3KB βββ
onigiri-components.js ~5KB βββββ
onigiri-security.js ~4KB ββββ
onigiri-ajax.js ~2KB ββ
onigiri-storage.js ~3KB βββ
onigiri-pjax.js ~4KB ββββ
onigiri-validation.js ~3KB βββ
onigiri-animate.js ~2KB ββ
onigiri-humhub.js ~2KB ββ
Total (all modules): ~36KB ββββββββββββββββββββββββββββββββββββ
Compare to:
jQuery: ~30KB
Vue.js: ~33KB
React + ReactDOM: ~42KB
Use Case Examples
Simple Landing Page
<!-- Only need DOM + Animations (10KB) -->
<script src="onigiri-core.js"></script>
<script src="onigiri-animate.js"></script>
<script>
O('.hero').fadeIn(500);
O('.cta-button').on('click', () => {
O('.signup-form').slideDown(300);
});
</script>
Contact Form
<!-- DOM + Security + AJAX + Validation (17KB) -->
<script src="onigiri-core.js"></script>
<script src="onigiri-security.js"></script>
<script src="onigiri-ajax.js"></script>
<script src="onigiri-validation.js"></script>
<script>
Onigiri.security.init();
O('#contact-form').on('submit', async (e) => {
e.preventDefault();
const result = O(e.target).validate(rules);
if (result.isValid) {
await Onigiri.post('/api/contact', formData);
}
});
</script>
Full SPA
<!-- Everything except HumHub (32KB) -->
<script src="onigiri-core.js"></script>
<script src="onigiri-events.js"></script>
<script src="onigiri-components.js"></script>
<script src="onigiri-security.js"></script>
<script src="onigiri-ajax.js"></script>
<script src="onigiri-storage.js"></script>
<script src="onigiri-pjax.js"></script>
<script src="onigiri-validation.js"></script>
<script src="onigiri-animate.js"></script>
HumHub Widget
<!-- HumHub-optimized (24KB) -->
<script src="onigiri-core.js"></script>
<script src="onigiri-events.js"></script>
<script src="onigiri-components.js"></script>
<script src="onigiri-security.js"></script>
<script src="onigiri-ajax.js"></script>
<script src="onigiri-storage.js"></script>
<script src="onigiri-humhub.js"></script>
π Pro Tip: Start with just core + the modules you need. You can always add more modules later as your app grows!
Module Best Practices
- Always load core.js first
- Respect module dependencies
- Only load modules you actually use
- Check Onigiri.modules before using features
- Consider creating custom bundles for production
- Test with only required modules loaded
- Document which modules your code needs
- Use conditional loading for optional features
Future Modules
Modules planned for future releases:
- onigiri.router.js - Client-side routing
- onigiri.i18n.js - Internationalization
- onigiri.websocket.js - WebSocket support
- onigiri.charts.js - Data visualization
- onigiri.drag.js - Drag and drop
Creating Custom Modules
// onigiri.custom.js - Custom module template
(function(Onigiri) {
'use strict';
if (!Onigiri) {
throw new Error('OnigiriJS core not found');
}
// Your custom functionality
Onigiri.customFeature = {
init: function() {
console.log('π Custom feature initialized');
},
doSomething: function() {
// Your code here
}
};
// Register module
Onigiri.modules.custom = true;
})(typeof Onigiri !== 'undefined' ? Onigiri : null);
β Development Roadmap
Track the progress of OnigiriJS modules. Tasks are marked complete by the development team.
OnigiriJS Module Roadmap
Implementation progress of planned modules
6 / 21 completed (29%)
onigiri-state
Shared global & scoped state management
onigiri-directives
Declarative DOM bindings (o-show, o-model, etc.)
onigiri-resource
REST-style data models over AJAX
onigiri-observe
Intersection & Mutation observer helpers
onigiri-humhub-ui
Standard HumHub UI abstractions (modal, notify, confirm)
onigiri-lifecycle
Component lifecycle hooks
onigiri-guard
Debounce, throttle, single-run guards
onigiri-scroll
Scroll save/restore & helpers (PJAX-friendly)
onigiri-permission
Client-side permission awareness
onigiri-portal
DOM teleport / overlay mounting
onigiri-router
Micro router (non-SPA, PJAX-first)
onigiri-sanitize
HTML & input sanitization
onigiri-shortcut
Keyboard shortcut manager
onigiri-queue
Sequential async task runner
onigiri-gesture
Touch & swipe helpers
onigiri-devtools
Debugging & inspection helpers
onigiri-plugin
Plugin registration system
onigiri-time
Relative time & timezone utilities
onigiri-emojis
Emoji Picker and Manager
onigiri-tasks
Task Management
onigiri-polls
Polls creation and management
Note: Task completion is managed by the OnigiriJS development team.