码迷,mamicode.com
首页 > 移动开发 > 详细

菜鸟学习cordova-android的js源码(1)

时间:2014-10-04 02:25:55      阅读:283      评论:0      收藏:0      [点我收藏+]

标签:android   style   blog   color   io   使用   ar   java   sp   

  使用phonegap快两年了,最近才有冲动去看源码,真是太惭愧了,也只能怪自己还是个js菜鸟。所以准备一边学习一边写点东西记录一下。

  我现在用的是Cordova3.5版本(现在已经3.6了),js代码大概分为两块:cordova.js对应着cordova的基本框架,android原生代码是单独的一个工程,作为library被引用,也可以导出jar使用;cordova_plugin.js和plugins下的插件模块,对应着工程org.apache.cordova下的java代码,通过这部分可以和android原生代码交互,当然也可以自己定义插件。

  先看cordova.js,一开始定义了两个方法:

  

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全部引用进来。

  define是定义模块,

  

define("cordova", function(require, exports, module) {
});

  require是使用模块,

  

var cordova = require(‘cordova‘);

  看代码的时候先看define的实现,再看require的实现,最后再看build方法。

  cordova一开始部分就这些了,还是不难的。

菜鸟学习cordova-android的js源码(1)

标签:android   style   blog   color   io   使用   ar   java   sp   

原文地址:http://www.cnblogs.com/yx-mike/p/4005480.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!