`
rensanning
  • 浏览: 3553149 次
  • 性别: Icon_minigender_1
  • 来自: 大连
博客专栏
Efef1dba-f7dd-3931-8a61-8e1c76c3e39f
使用Titanium Mo...
浏览量:38222
Bbab2146-6e1d-3c50-acd6-c8bae29e307d
Cordova 3.x入门...
浏览量:607647
C08766e7-8a33-3f9b-9155-654af05c3484
常用Java开源Libra...
浏览量:682831
77063fb3-0ee7-3bfa-9c72-2a0234ebf83e
搭建 CentOS 6 服...
浏览量:89561
E40e5e76-1f3b-398e-b6a6-dc9cfbb38156
Spring Boot 入...
浏览量:402165
Abe39461-b089-344f-99fa-cdfbddea0e18
基于Spring Secu...
浏览量:69769
66a41a70-fdf0-3dc9-aa31-19b7e8b24672
MQTT入门
浏览量:91853
社区版块
存档分类
最新评论

Cordova 3.x 源码分析(2) -- cordova.js概要

阅读更多
前提环境:
引用
Platform: android
Version: 3.4.0


(1)cordova.js/cordova_plugins.js文件

cordova.js在创建Android工程的时候,是从cordova的lib目录下Copy到platforms\android\assets\www\cordova.js的。同时备份到platforms\android\platform_www\cordova.js
引用
C:\Documents and Settings\RenSanNing\.cordova\lib\android\cordova\3.4.0\framework\assets\www\cordova.js


而platforms\android\assets\www\cordova_plugins.js是根据plugins文件夹的内容生成的。

(2)自己亲手生成cordova.js
Cordova是OSS的,所以可以通过源代码来生成cordova.js

a)下载源码
目前稳定版是3.4.0,master是3.5.0-dev。
https://github.com/apache/cordova-js/tree/3.4.x下载cordova-js-3.4.x.zip解压到E:\cordova-js-3.4.x

b)构建工具使用的是Grunt,所以要先安装grunt-cli
引用
npm install -g grunt-cli


c)手动生成
引用
cd E:\cordova-js-3.4.x
npm install  --安装package.json中devDependencies定义的依赖包
grunt        --运行 grunt


d)执行后多了2个文件夹
node_modules 依赖包
pkg
  cordova.android.js
  cordova.ios.js
  ...
其中cordova.android.js就是我们Android工程要用到的cordova.js了。

(3)cordova.js的整体结构
从E:\cordova-js-3.4.x\tasks\lib\bundle.js可以看出cordova.js的整体结构是:
// Platform:  <platform>
// <commitId>
/* <license> */
;(function() {
var CORDOVA_JS_BUILD_LABEL = '<commitId>';
// src\scripts\require.js文件内容
// 各Module文件内容
window.cordova = require('cordova');
// src\scripts\bootstrap.js文件内容
})();


其中Module来自以下文件:
  • src\common\**.js
  • src\android\**.js
  • src\cordova.js

各文件输出形式:
引用
// file: <fileName>
<fileContents>


最终的cordova.js:
// Platform: android
// 3.4.0
/*
 License 省略
*/
;(function() {
var CORDOVA_JS_BUILD_LABEL = '3.4.0';
// file: src/scripts/require.js
//...
// file: src/cordova.js
define("cordova", function(require, exports, module) { /*...*/ }
// file: src/android/android/nativeapiprovider.js
define("cordova/android/nativeapiprovider", function(require, exports, module) { /*...*/ }
// file: src/android/android/promptbasednativeapi.js
define("cordova/android/promptbasednativeapi", function(require, exports, module) { /*...*/ }
// file: src/common/argscheck.js
define("cordova/argscheck", function(require, exports, module) { /*...*/ }
// file: src/common/base64.js
define("cordova/base64", function(require, exports, module) { /*...*/ }
// file: src/common/builder.js
define("cordova/builder", function(require, exports, module) { /*...*/ }
// file: src/common/channel.js
define("cordova/channel", function(require, exports, module) { /*...*/ }
// file: src/android/exec.js
define("cordova/exec", function(require, exports, module) { /*...*/ }
// file: src/common/exec/proxy.js
define("cordova/exec/proxy", function(require, exports, module) { /*...*/ }
// file: src/common/init.js
define("cordova/init", function(require, exports, module) { /*...*/ }
// file: src/common/modulemapper.js
define("cordova/modulemapper", function(require, exports, module) { /*...*/ }
// file: src/android/platform.js
define("cordova/platform", function(require, exports, module) { /*...*/ }
// file: src/android/plugin/android/app.js
define("cordova/plugin/android/app", function(require, exports, module) { /*...*/ }
// file: src/common/pluginloader.js
define("cordova/pluginloader", function(require, exports, module) { /*...*/ }
// file: src/common/urlutil.js
define("cordova/urlutil", function(require, exports, module) { /*...*/ }
// file: src/common/utils.js
define("cordova/utils", function(require, exports, module) { /*...*/ }
window.cordova = require('cordova');
// file: src/scripts/bootstrap.js
require('cordova/init');
})();


***define()的顺序是在Grunt的时候简单的按模块ID名升序排的,先后无所谓。
***define只是注册模块,不会调用其factory。
***在index.html通过<script type="text/javascript" src="cordova.js"></script>引入cordova.js后:
// 加载cordova模块,赋给window.cordova
// require()第一次被调用,就开始调用其factory。
// factory中又包含了其他的require(),就形成了嵌套,直到最后所有module的factory被执行完。
window.cordova = require('cordova');  
// 加载Plugin代码等初期化处理
require('cordova/init');


(4)cordova.js中个模块的说明

平台相关的:
  • src/android/android/nativeapiprovider.js JS->Native的具体交互形式
  • src/android/android/promptbasednativeapi.js 通过prompt()和Native交互(Android2.3 simulator的Bug
  • src/android/exec.js ****执行JS->Native交互
  • src/android/platform.js ***bootstrap处理
  • src/android/plugin/android/app.js 清缓存、loadUrl、退出程序等

通用的:
  • src/common/argscheck.js 用于plugin中校验参数,比如argscheck.checkArgs('fFO', 'Camera.getPicture', arguments); 参数应该是2个函数1个对象
  • src/common/base64.js JS->Native交互时对ArrayBuffer进行uint8ToBase64(WebSockets二进制流)
  • src/common/builder.js 对象属性操作,比如把一个对象的属性Merge到另外一个对象
  • src/common/channel.js ****控制事件调用
  • src/common/exec/proxy.js 用于Plugin中往已经有的模块上添加方法
  • src/common/init.js ****初期处理
  • src/common/modulemapper.js ***把定义的模块clobber到一个对象,在初期化的时候会赋给window
  • src/common/pluginloader.js ***加载所有cordova_plugins.js中定义的模块,执行完成后会触发onPluginsReady
  • src/common/urlutil.js 获取绝对URL,InAppBrowser中会用到
  • src/common/utils.js 工具类

核心:
  • src/cordova.js ****事件的处理和回调,外部访问cordova.js的入口
  • src/scripts/require.js  *****模块化系统
  • src/scripts/bootstrap.js 启动处理(只调用了初期处理require('cordova/init');),注意和platform的bootstrap处理不一样

(5)cordova_plugins.js的整体结构
Cordova从3.0版本开始不再在cordova.js中包含各plugin的代码,而是采用plugman通过CLI生成cordova_plugins.js然后动态加载需要的plugin。3.0之前的代码结构可以参考:https://github.com/apache/cordova-js/tree/2.8.x lib-<platform>/plugin/<platform>

cordova.define('cordova/plugin_list', function(require, exports, module) {
module.exports = [
    {
        "file": "plugins/org.apache.cordova.vibration/www/vibration.js",
        "id": "org.apache.cordova.vibration.notification",
        "merges": [
            "navigator.notification"
        ]
    },
    //.......
];
module.exports.metadata = 
// TOP OF METADATA
{
    "org.apache.cordova.vibration": "0.3.7",
    // ....
}
// BOTTOM OF METADATA
});


其实也是define了一个ID为“cordova/plugin_list”的模块,在初期化的时候动态加载到head里的。Cordova提供的Native API的js也是一样的,可以启动浏览器调试看HTML的Head部分:


后续从四个方面继续分析cordova.js中一些核心代码:
(1)cordova.js模块系统require/define
  • src/scripts/require.js 自定义的模块系统

(2)cordova.js事件通道pub/sub
  • src/common/channel.js 发布/订阅模式的事件通道

(3)cordova.js导入、初始化、启动、加载插件
  • src/cordova.js 事件的处理和回调,外部访问cordova.js的入口
  • src/common/init.js 初始化处理
  • src/android/platform.js 平台启动处理
  • src/common/pluginloader.js 加载所有cordova_plugins.js中定义的模块,执行完成后会触发onPluginsReady

(4)cordova.js本地交互JS<->Native
  • src/android/android/nativeapiprovider.js JS->Native的具体交互形式
  • src/android/android/promptbasednativeapi.js 通过prompt()和Native交互(Android2.3 simulator的Bug)
  • src/android/exec.js 执行JS->Native交互

剩下的代码就不分析了:
引用
src/android/plugin/android/app.js
src/common/argscheck.js
src/common/base64.js
src/common/builder.js
src/common/exec/proxy.js
src/common/modulemapper.js
src/common/urlutil.js
src/common/utils.js


下载带注释的cordova.js:这里

参考:
http://www.cnblogs.com/linjisong/tag/PhoneGap/
  • 大小: 8.7 KB
分享到:
评论

相关推荐

    Cordova 3.x 实例开发 -- 基于Ionic的Todo应用

    **Cordova 3.x 实例开发 -- 基于Ionic的Todo应用** Cordova是一款开源的移动应用开发框架,它允许开发者使用Web技术(HTML、CSS、JavaScript)来构建原生的移动应用。Cordova 3.x是其早期的一个版本,尽管现在已...

    Cordova 3.x 源码分析(7) -- CordovaLib概要

    这篇名为“Cordova 3.x 源码分析(7) -- CordovaLib概要”的博客文章深入探讨了Cordova的核心组件——CordovaLib。CordovaLib是Cordova项目的基础库,包含了实现Cordova功能的各种模块和插件,如设备API、生命周期...

    Cordova 3.x 基础(10) -- UI框架Ionic Framework

    Cordova 3.x 是一个流行的开源框架,用于构建原生移动应用,利用HTML、CSS和JavaScript等Web技术。它允许开发者使用一套统一的API来访问设备功能,如摄像头、GPS和 accelerometer,从而创建跨平台的应用程序。在...

    cordova-2.9.1.jar

    实实在在经过ant编译的cordova-2.9.1.jar 而不是有些人坑蒙拐骗的rar文件

    cordova-hot-code-push-cli(热更新插件)

    热更新时,我们执行命令 npm install -g cordova-hot-code-push-cli安装插件,但运行cordova-hcp server会报错,如:Could not create tunnel: { Error: ngrok is not yet ready to start tunnels...,这时我们找到...

    Cordova 3.x 基础(16) -- slides & books

    2. **Cordova 3.x的改进** 在Cordova 3.x版本中,进行了多项改进,包括提升性能、简化插件管理和增强跨平台兼容性。这些改进使得开发者能够更高效地构建和维护多平台应用。 3. **工作原理** Cordova将Web应用打包...

    Cordova 3.x 入门 - 目录

    2. **安装与配置**:首先,你需要安装Node.js,因为Cordova是通过npm(Node包管理器)进行安装的。接着,使用`npm install -g cordova`全局安装Cordova。之后,创建一个新的Cordova项目,通过`cordova create &lt;项目...

    Cordova 3.x 实用插件(1) -- Google地图Maps

    Cordova 3.x 是一个流行的开源框架,它允许开发者使用Web技术(如HTML5、CSS3和JavaScript)来构建原生移动应用。这个框架通过桥接技术将Web应用与设备的API连接,使得Web开发者可以访问手机的各种功能,如摄像头、...

    Cordova 3.x 基础(12) -- Plugin开发

    Cordova 3.x 是一个非常重要的版本,它是Apache Cordova框架的一个早期迭代,该框架允许开发者使用HTML5、CSS3和JavaScript来构建跨平台的移动应用程序。Cordova的核心概念是提供一个“web容器”,将Web应用包装在...

    Cordova 3.x 基础(7) -- Native API的使用

    **Cordova 3.x 基础:Native API的使用** Cordova,作为一个开源的移动应用开发框架,允许开发者使用Web技术(HTML5、CSS3、JavaScript)来构建跨平台的移动应用程序。在Cordova 3.x版本中,开发者可以通过其提供的...

    Cordova 3.x 实用插件(2) -- 二维码Barcode

    Cordova 3.x 实用插件(2) -- 二维码Barcode Cordova 是一个流行的开源框架,用于构建原生移动应用程序,它允许开发者使用Web技术(HTML、CSS和JavaScript)来开发跨平台的应用。在Cordova 3.x版本中,开发者可以...

    Cordova 3.x入门

    源码分析部分则是对于想要深入理解Cordova内部原理的开发者准备的,作者细致地解析了Cordova CLI、cordova.js的模块系统、事件通道、本地交互、以及CordovaLib概要等核心内容。 最后,实例开发部分,作者通过基于...

Global site tag (gtag.js) - Google Analytics