Sorry to dump another large email on the list, but I'm hoping this one is
at least less controversial :). I wrote up a plan for moving module->symbol
mapping out of common.js & platform.js and into individual plugins.
If you have feedback/comments, let me know.
* Goals:
- Change from listing module->symbol mapping within common.js &
platform.js, to listing this within the plugins themselves.
- Support apps that don't want us to clobber global symbols.
- aka, allow module->symbol mapping to be turned off
- Allow retrieval of clobbered globals
- Currently modules save it themselves when they are loaded
- This won't work (reliably) for saving references to globals
overridden by other modules
- This gets in the way of the idea of lazy-loading modules via getters
- Support the use of other module loaders
- So... don't do crazy things at require() time.
Requirements:
- Plugins must be able to declare dependencies
- Plugins must be able to delay onDeviceReady()
- Plugins must be able to run code to initialize
Implementation modulemapper.js:
- clobbers(...)
- merges(...)
- defaults(...)
- mapModules(wnd)
- getOriginalSymbol('FileSystem')
Start-up flow:
1. Parse all modules
2. common-bootstrap:
1. Loads list of modules named "cordova.*/symbols"
2. Run modulemapper.mapModules(window);
3. Loads list of modules named "cordova.*/main"
symbols.js files:
- Will make calls to modulemapper instead of exporting {clobbers:}
- This make dependencies work by require()ing dependent symbols
- We want the to be an evaluated .js file instead of something listed in
plugin.xml
- So that it can export based on browser version
Implementation Steps
1. Expose list of registered modules in scripts/require.js so that we
can loop over them
2. Write modulemapper.js (and have unit tests, of course)
3. Add logic to bootstrap.js that calls into modulemapper
4. create $PLUGIN_NAME/symbols.js files for each plugin within cordova.
5. Add logic to bootstrap.js that calls into modulemapper
6. Create main.js files for those that currently have logic in their
platform.js files
*