Confirmed users
401
edits
(Created page with "If you want to add a new functionality, a.k.a., a new script or a new module into system app after bug 1094759, please read this. == If you want to use BaseModule == Great! I...") |
|||
| (11 intermediate revisions by the same user not shown) | |||
| Line 4: | Line 4: | ||
== If you want to use BaseModule == | == If you want to use BaseModule == | ||
Great! It's providing a promise based start procedure and what you need to do. | Great! It's providing a promise based start procedure and what you need to do. | ||
var NewModule = function() {}; | var NewModule = function() {}; | ||
BaseModule.create(NewModule, { | BaseModule.create(NewModule, { | ||
name: 'NewModule', | |||
_start: function() { | |||
// return a promise if your start progress involves some asynchronous operation | |||
// return null or do not return, then we will unblock your module from the starting process right away once | |||
// yourModule.start() is called | |||
// BaseModule has a native start() function to process not only your own starting (this._start()) but also the child | |||
// module's start() function. The whole starting process will be resolved only when all the children's start process | |||
// is resolved. | |||
} | |||
}); | }); | ||
== If you don't want to use BaseModule == | == If you don't want to use BaseModule == | ||
It's okay. But you have to provide this interface for us: | It's okay. But you have to provide this interface for us: | ||
var NewModule = { | |||
var NewModule = { | start: function() { | ||
// return a promise if your start progress involves some asynchronous operation | |||
// return null or do not return, then we will unblock your module from the starting process right away once | |||
// yourModule.start() is called | |||
} | |||
}; | |||
}; | |||
== No matter what you choose to go == | == No matter what you choose to go == | ||
Don't put your new script in the header of system app. | Don't put your new script in the header of system app. | ||
If it's necessary to go alive when booting, please find a proper parent module and lazy load it. | If it's necessary to go alive when booting, please find a proper parent module and lazy load it. | ||
If | |||
=== If the parent module is based on BaseModule === | |||
# Put the module in the parent module's SUB_MODULES if you think it's blocking the starting progress of the parent module. | |||
# If the new module is not as important to block the parent, use this.loadWhenIdle([NEW_MODULE]) in parent's start function | |||
# If the new module is only serving some on demand request, consider to lazy load the new module in the parent module's event handler and start it. | |||
=== If the parent module is not based on BaseModule === | |||
# Lazy load the module in the parent module's start function and return a promise including the promise of the lazy loader | |||
# If the new module is only serving some on demand request, consider to lazy load the new module in the parent module's event handler and start it. | |||
== Samples == | |||
In the following sample, | |||
1. Core is an existing module who blocks the first view | |||
2. ParentModule is an existing module who does not block the first view | |||
=== Sample for the module which does block the first view and the parent module is a base module === | |||
// ftu_loader.js | |||
var FtuLoader = function() {}; | |||
BaseModule.create(FtuLoader, { | |||
name: 'FtuLoader', | |||
_start: function() { | |||
return LazyLoader.load('shared/js/test.js').then(() => { | |||
// Do something... | |||
}); | |||
} | |||
}); | |||
// core.js | |||
Core.SUB_MODULES = ['FtuLoader']; | |||
=== Sample for the child module which does not block the first view and the parent module is a base module === | |||
// side_tester.js | |||
var SideTester = function() {}; | |||
BaseModule.create(SideTester, { | |||
name: 'SideTester', | |||
_start: function() { | |||
return LazyLoader.load('shared/js/async.js').then(() => { | |||
// Do something... | |||
}); | |||
} | |||
}); | |||
// core.js | |||
BaseModule.create(Core, { | |||
_start = function() { | |||
return this.loadWhenIdle(['SideTester']); | |||
}; | |||
}); | |||
=== Sample for the new module which does not block the first view and the parent is not a baseModule === | |||
// side_tester.js | |||
var ChildModule = function() {}; | |||
ChildModule.prototype.start = function() {}; | |||
// parent_module.js | |||
ParentModule.prototype.start = function() { | |||
return Service.request('schedule', () => { // This is exactly what BaseModule.prototype.loadWhenIdle does | |||
return LazyLoader.load('child_module.js'); | |||
}).then(() => { | |||
this.child = new ChildModule(); | |||
return this.child.start(); | |||
}); | |||
}; | |||