💉 di.libx.js
Lightweight & non intrusive Dependency Injection module that supports async/deferred resolution and uglified support for Typescript and JavaScript in 3.3kB gzipped (14.7kB on disk). Feature complete, fast, reliable and well tested.
Features:
- Deferred resolution - asynchronously require dependencies that are not yet available and resolve once it is.
- Automatic resolve of function params - resolve & map dependencies manually or as function's parameters
- NodeJS & browser - browserified version ready to use from CDN.
- Explicit or implicit dependencies - works with uglified files by specified dependencies' names or implicitly from function/class name.
- Typescript support - specify injected instance's types.
- Non Intrusive - register any modules; your internal modules or 3rd-party modules without modifing its code. No attribute wrapping needed.
Use:
Install via yarn (recommended):
yarn add di.libx.js
Install via npm:
npm install --save di.libx.js
Browser:
https://cdn.jsdelivr.net/npm/di.libx.js@latest/dist/browser.min.js
(Modules are loaded into `window.libx.di` object).
Use this library in browser from CDN, code example, live example.
Or include from node_modules.
Basic usage:
import DependencyInjector from 'di.libx.js';
const di = new DependencyInjector();
const myFunc = () => {
console.log('This is myFunc');
};
di.register('func', myFunc);
di.inject((func, anonFunc) => {
func();
anonFunc();
});
di.register('anonFunc', () => console.log('Anonymous func'));
More examples:
var myModule = { somveVar: 1 };
libx.di.register('myModule', myModule);
await libx.di.inject((myModule) => {
console.log('dependency resolved!', myModule);
});
mod = await libx.di.require('myModule');
mod = libx.di.injectAndRegister('myNewModule', (myModule) => {
return () => console.log('this came from myNewModule!', myModule);
});
libx.di.inject(
(myUglifiedModule) => {
console.log('unglified dependency resolved!', myUglifiedModule);
},
['myModule']
);
Sub Container:
const subContainer = new DependencyInjector(di);
subContainer.register('moduleB', di.initiate(ModuleB));
subContainer.inject((moduleB) => {
const result = moduleB.Run(10);
console.log('Result: ', result);
}).then(() => {
console.log('DONE!');
});
Check more examples in unit-test at tests.
Develop:
Build:
$ yarn build
Watch & Build:
$ yarn watch
Run tests:
$ yarn test