使用phonegap快两年了,最近才有冲动去看源码,真是太惭愧了,也只能怪本身仍是个js菜鸟。因此准备一边学习一边写点东西记录一下。前端
我如今用的是Cordova3.5版本(如今已经3.6了),js代码大概分为两块:cordova.js对应着cordova的基本框架,android原生代码是单独的一个工程,做为library被引用,也能够导出jar使用;cordova_plugin.js和plugins下的插件模块,对应着工程org.apache.cordova下的java代码,经过这部分能够和android原生代码交互,固然也能够本身定义插件。java
先看cordova.js,一开始定义了两个方法:android
var require, define; (function() { //各个模块的map对象 var modules = {}, //模块请求栈 requireStack = [], //模快在requireStack的索引的map对象 inProgressModules = {}, SEPARATOR = "."; function build(module) { var factory = module.factory, localRequire = function(id) { var resultantId = id; //模块id使用了相对路径 if (id.charAt(0) === ".") { resultantId = module.id.slice(0, module.id.lastIndexOf(SEPARATOR)) + SEPARATOR + id.slice(2); } return require(resultantId); }; module.exports = {}; delete module.factory; factory(localRequire, module.exports, module); return module.exports; } require = function(id) { if (!modules[id]) { throw "module " + id + " not found"; } else if (id in inProgressModules) { //在使用模块的时候,出现了循环require的状况,这时候应该检查你的模块划分了。 var cycle = requireStack.slice(inProgressModules[id]).join('->') + '->' + id; throw "Cycle in require graph: " + cycle; } if (modules[id].factory) { try { inProgressModules[id] = requireStack.length; requireStack.push(id); return build(modules[id]); } finally { delete inProgressModules[id]; requireStack.pop(); } } //当模块被请求事后,就不用再去执行factory方法了。 return modules[id].exports; }; define = function(id, factory) { if (modules[id]) { throw "module " + id + " already defined"; } modules[id] = { id: id, factory: factory }; }; define.remove = function(id) { delete modules[id]; }; define.moduleMap = modules; })();
没错就是require和define,前端小伙伴们确定很熟悉了,也确定比我了解。不过cordova这里的这两个方法实现不了模块化加载,你还得一次把js所有引用进来。apache
define是定义模块,框架
define("cordova", function(require, exports, module) { });
require是使用模块,模块化
var cordova = require('cordova');
看代码的时候先看define的实现,再看require的实现,最后再看build方法。学习
cordova一开始部分就这些了,仍是不难的。ui