Class for frontend Modules initialization from the DOM without inline scripts. Calls Modules init() method
Install npm package
npm i module-dispatcher --save
Import it in your JavaScript file
import ModuleDispatcher from 'module-dispatcher';
If your JavaScript Modules are parts of one global Library
object, like
- YourLibrary.moduleOne
- YourLibrary.moduleTwo
- YourLibrary.moduleThree
You can instantiate Dispatcher by the following way
new moduleDispatcher({
Library : YourLibrary
});
If you don't specify Library, your Modules will be called as window.moduleOne
by default.
Add attribute data-module="yourModuleName"
to the HTML Element of the Module you want to init.
<div data-module="comments">
<!-- Any stuff -->
</div>
You can init multiple Modules on one node as well
<div data-module="comments likes"></div>
If your Module has settings, place them via JSON inside the Node with data-module.
❗️Important
You should escape module settings data because textarea will try to process HTML special chars.
For
<
you will get<
in the textarea. That is not good.You need to escape this string so
&
will be&
. This way<
will be&lt;
in raw HTML. Textarea will show and return<
.
Don't forget to add an attribute hidden
to the <textarea>
tag:
<div data-module="comments">
<textarea name="module-settings" hidden>
{
// your module's settings ESCAPED by smth like PHP's htmlspecialchars()
}
</textarea>
<!-- Other stuff -->
</div>
For several Modules on one node, your settings should be an Array
<div data-module="module1 module2">
<textarea name="module-settings" hidden>
[
{
// Module 1 settings
},
{
// Module 2 settings
},
...
]
</textarea>
</div>
Ask a question or report a bug on the create issue page.
Know how to improve ModuleDispatcher? Fork it and send pull request.
You can also drop a few lines to CodeX Team's email.