All checks were successful
/ build (map[dockerfile:./services/hasura/Dockerfile name:hasura]) (push) Successful in 47s
/ build (map[dockerfile:./services/web/Dockerfile name:web]) (push) Successful in 1m47s
/ build (map[dockerfile:./services/watchers/Dockerfile name:watchers]) (push) Successful in 2m37s
/ build (map[dockerfile:./services/files/Dockerfile name:files]) (push) Successful in 2m52s
/ build (map[dockerfile:./services/api/Dockerfile name:api]) (push) Successful in 3m2s
/ build (map[dockerfile:./services/app/Dockerfile name:app]) (push) Successful in 31s
/ build (map[dockerfile:./services/tasks/Dockerfile name:tasks]) (push) Successful in 2m44s
/ deploy (push) Successful in 48s
4.4 KiB
4.4 KiB
Modjo Framework Documentation
Overview
Modjo is a Rapid Application Development (RAD) framework for Node.js that emphasizes:
- Full Inversion of Control (IoC) through dependency injection
- CQRS (Command Query Responsibility Segregation) architecture
- Pure NodeJS implementation without transpilation
- Microservices-oriented design
- Plugin-based extensibility
Key Features & Core Concepts
1. Dependency Injection System
- Uses composition root design pattern
- Avoids prop drilling through context management
- Implements async thread-based context using
nctx
- Supports hierarchical dependency trees
2. Plugin Architecture
- Modular design with official, contrib, and local plugins
- Plugin discovery system with multiple lookup paths:
- Local project plugins (
src/plugins
) - Official plugins (
@modjo/*
) - Community plugins (
modjo-plugins-*
)
- Local project plugins (
- Plugin inheritance and composition
3. Microservices Support
- Built-in microservices architecture support:
- App service
- Watcher service
- Worker service
- CQRS implementation for scalability
- Event-driven architecture capabilities
4. Context Management
- Async context tracking
- Thread-local storage implementation
- Hierarchical context inheritance
- Context isolation between services
API Reference
Core Module
modjo(dependency)
Main framework entry point.
Parameters:
dependency
: Object | Function | Array- Configuration object for the application
- Can include plugins, dependencies, and lifecycle hooks
Example:
const modjo = require("@modjo/core")
modjo({
plugins: {
config: {
context: (ctx) => {
ctx.set("customConfig", myConfig)
}
}
},
dependencies: {
database: "postgres",
cache: "ioredis"
}
})
Dependency Configuration
Structure
{
pluginName: string, // Name of the plugin to use
key: string, // Unique identifier for the dependency
create: Function, // Factory function
build: Function, // Build-time setup
ready: Function, // Runtime initialization
dependencies: Object, // Nested dependencies
context: Function, // Context setup function
params: Array|Object // Parameters for create/build
}
Plugin System
getPlugin(name)
Loads a plugin by name.
Parameters:
name
: string - Plugin identifier
Returns:
- Plugin module or throws if not found
Usage & Best Practices
1. Dependency Configuration
// Recommended structure
{
plugins: {
// Core plugins
config: {
context: (ctx) => {
// Configure context
}
}
},
dependencies: {
// Service dependencies
database: "postgres",
cache: {
pluginName: "ioredis",
context: (ctx) => {
// Redis-specific configuration
}
}
}
}
2. Context Usage
const ctx = require("~/ctx")
// Setting context values
ctx.set("key", value)
// Getting context values
const value = ctx.get("key")
// Context inheritance
const childCtx = nctx.create(Symbol("child"))
childCtx.fallback(parentCtx)
3. Plugin Development
// plugin/my-plugin/index.js
module.exports = {
create: async () => {
// Plugin initialization
return instance
},
build: async () => {
// Build-time setup
},
ready: async (instance) => {
// Runtime initialization
}
}
Advanced Topics
1. CQRS Implementation
- Separate command and query responsibilities
- Event sourcing support
- Message queue integration
- Eventual consistency handling
2. Performance Optimization
- No transpilation overhead
- Efficient dependency resolution
- Lazy loading of plugins
- Context-based caching
3. Scaling Strategies
- Microservices decomposition
- Worker process management
- Queue-based task distribution
- State management across services
Common Errors & Troubleshooting
1. Plugin Loading Issues
Error: required plugin not found: "plugin-name"
- Check plugin installation
- Verify plugin naming convention
- Check plugin path in project structure
2. Dependency Resolution
Error: Circular dependency detected
- Review dependency tree
- Break circular references
- Use context for shared state
3. Context Errors
Error: Context value not found: "key"
- Ensure context is properly initialized
- Check context hierarchy
- Verify context provider setup