今天是2014年的最后一天,年终总结什么的就不写了。记录一下今天的工作内容。如果不知道phoneGap,那么就不需要往下看了,phoneGap现在已经叫cordova了,叫什么不重要,重要的是它对web移动应用的开发很重要,如果你正在查找关于cordova.js 插件安装方面的工作,那么本文或许对你有用。

cordoval.js目前最新的版本是3.7.0,较之前的2.xxx系列,最大的变化是把功能进行了插件化,或者说是模块化也行。这样做的好处呢是开发者可以按需加载自己的功能插件,减小文件体积,同时也在代码方面做了一些优化,提升了效率。插件化的管理方式,方便进行扩展。

看到有这么多的好处,我们就动心了,直接升级到了3.7.0。可是在升级的过程中,却遇到了不少的问题。这次改造的前端工作,就由我一人全全负责了。从官网下载下来的cordova.js核心文件分成了ios,android等多个版本,而且每个版本都不含有任何插件,比如摄像头,读文件,播放音频等等。所以,改造的第一项工作就是把我们项目中需要的功能插件全部加载上去。

首先提一下我们项目需要用到的插件有播放音频,消息提示,输出日志等。我先是去官网看了一下插件的说明和用法,可是看了半天,也没有找到怎么用的方法,那些插件的说明写的实在是太简单了。没办法,只有去百度了,可是百度来百度去,全是一些过时的用法,难怪别人说查技术资料用百度不靠普。好不容易,找了几篇看上去还算粘边的文章,满心欢喜的照着做了一通,现在想想全是走了弯路。所以这里就不引用它们的教程了。

其实现在回过头来看,只要弄懂一个插件的用法,其它的就触类旁通了。就拿音频插件来说吧。cordova.js 采用了 amd 这种规范,比如定义一个模块用define,调用一个模块用reqiure, 那么要挂载一个插件,肯定要先有一个音频模块。这个在官方的github上有了,直接下载下来,找到对应平台的js文件就行,只是呢添加这个模块有两种方式,一种呢是通过在index.html中用script标签引入的方式,另一种是通过直接在cordova.js中粘贴插件的js源码。我选择的是后一种,但是直接粘贴之后发现,在android真机上调用插件播放声音的时候,eclipse的日志上有错误提示说Media未定义。于是我就纳闷了,仔细看了一下Media.js的源码,大至是这样的:

 (function(){

  这里是cordova.js的作用域

  .................

var utils = require('cordova/utils'),
exec = require('cordova/exec'); var mediaObjects = {}; /**
* This class provides access to the device media, interfaces to both sound and video
*
* @constructor
* @param src The file name or url to play
* @param successCallback The callback to be called when the file is done playing or recording.
* successCallback()
* @param errorCallback The callback to be called if there is an error.
* errorCallback(int errorCode) - OPTIONAL
* @param statusCallback The callback to be called when media status has changed.
* statusCallback(int statusCode) - OPTIONAL
*/
var Media = function(src, successCallback, errorCallback, statusCallback) { // successCallback optional
................ module.exports = Media;

这里其实只要把Media前面的var去掉,就可以把Media提升为全局变量,但是当时我居然没有看出来。不过这样也不是一个好的解决方案,因为cordova的核心功能都是用

define定义的,我这样直接添加功能代码,显然与作者的插件化思想是相背离的。于是呢,我就参考以前版本的写法,用define进行了定义。变成如下这个样子:

 define("cordova/plugin/Media", function(require, exports, module) {
var Media = function
....
module.exports = Media;
});
 

可是问题又来了,这样做还是只是定义一件插件而已,怎么去调用它呢?其实真的很简单,直接在cordova.js末尾,也就是 cordova = require('cordova')后面加一个Media=require('cordova/plugin/Meida');就可以了。当时我怎么就没有想到呢。可能是太过相信cordova的插件机制了,它还没有这么智能。不过呢,这还没有完,想想ios我们也是要兼容的,所以ios平台对应的代码也要加上。cordova为什么不把各个平台通用的部分提出来呢?这样的话,对于兼容多个平台的情况,cordova的体积又可以大大减小了。

吐糟归吐糟,后继的工作还是要做好,陆续把其它的插件也补上。不过呢,我要在此多说一句,别只顾着复制粘贴,有些内容需要根据实际情况进行修改一下。比如console.log这个插件,用define进行包装的时候,为了统一,最好都写成

define("cordova/plugin/xxx")的形式,这样维护的时候一看就明白了. 还有一个好处就是可以方便插件机制进行自动化加载,不过这个好处我还没有研究透,等看懂源码再细说。另外还有一个坑,有一处代码调用了require("cordova/plugin_list")这样的代码,但是却没有看到定义的地方,比如说define("cordova/plugin_list"),虽然在eclipse上编译安装的时候,生成apk没有问题,真机上也正常用行了,但是java那边的兄弟说在服务端打包的时候会报错,说找不到plugin_list.js这个文件。所以需要补上这个定义:
define("cordova/plugin_list",function(require, exports, module){

    var plugin_list = [];

    module.exports = plugin_list;
})

大致就是这么一个东东,具体的代码我不记得了,反正github上是有的下的。

最后呢,关于这个require/define的用法,我专门抽出来,然后进行了一些简化,方便大家直观的理解它的运行原理,如果觉得好,还可以在自己的项目中直接使用。

项目地址: https://github.com/bjtqti/mini-require

好了,总算写完了。掌声送给自己!

webapp应用---cordova.js 3.7.0插件安装总结的更多相关文章

  1. 同时处理html+js+jquery+css的插件安装(Spket&Aptana插件安装)

    Spket 在线安装方法:Help->Software Updates(或者Install New Software)->Add site Location:http://www.spke ...

  2. MyEclipse 8.5 开发环境配置,汉化,Aptana2.0插件,SVN 插件,Flex Builder 3/4 插件安装(转载)

    转载地址http://elf8848.iteye.com/blog/630864 下载MyEclipse 8.5 可以通过代理http://www.proxyie.cn/访问MyEclipse的官方网 ...

  3. HiShop2.x版本中的上传插件分析,得出所用的模板语言为Underscore.js 1.6.0且自己已修改

    效果: 上传组件非常的酷,但是分析其使用JS写法使用了模板语言的,代码如下: <script type="text/j-template" id="tpl_popb ...

  4. cordova 开发属于自己的插件---android

    还是需要开发出自己的插件的... 我的cordova  version is 4.0.0 1.需要新建一个文件夹为 myplugin 1.1在myplugin文件夹下 新建 plugin.xml文件 ...

  5. cordova+Android Studio 1.0+ionic+win7(转)

    转自http://blog.csdn.net/fuyunww/article/details/42216125 目录(?)[-] 在项目目录下执行 a创建工程 b添加平台支持 c添加插件在Androi ...

  6. cordova 环境配制和创建插件

    环境配制 英文网站:http://cordova.apache.org/ 中文网站:http://cordova.axuer.com/ 安装Cordova Cordova的命令行运行在Node.js ...

  7. elasticsearch5.0及head插件安装

        这个瞎jb整了半天.准备把es2.4升级到5.0,结果老报错 环境:centos6.5+es2.4是ok的换成es5就出毛病.也不能说啥 ,我用的是最新的 源码解压启动时候报错,具体错误for ...

  8. 在ionic/cordova中使用百度地图插件

    在ionic项目中,如果想实现定位功能,可以使用ng-cordova提供的cordova-plugin-geolocation. 但由于高墙的缘故,国内andorid环境下,此插件不起作用(ios环境 ...

  9. Jquery.validate.js表单验证插件的使用

    作为一个网站web开发人员,以前居然不知道还有表单验证这样好呀的插件,还在一行行写表单验证,真是后悔没能早点知道他们的存在. 最近公司不忙,自己学习一些东西的时候,发现了validation的一个实例 ...

随机推荐

  1. java分享第十七天-01(封装操作xml类)

    做自动化测试的人,都应该对XPATH很熟悉了,但是在用JAVA解析XML时,我们通常是一层层的遍历进去,这样的代码的局限性很大,也不方便,于是我们结合一下XPATH,来解决这个问题.所需要的JAR包: ...

  2. 一次sql排序的问题。

    select date, count(fail) as fail,count(win) as win from (select date,(case (result) when 'fail' then ...

  3. 不可变数组NSArray

    //数组里面不允许存放基本数据类型,只能存放“对象” NSArray *array = [NSArray arrayWithObjects:@"周星星",@"尹天仇&qu ...

  4. php获取网卡MAC地址源码

    <?php /** 获取网卡的MAC地址原码:目前支持WIN/LINUX系统 获取机器网卡的物理(MAC)地址 **/ class GetMacAddr{ var $return_array = ...

  5. 正则表达式preg_replace中危险的/e修饰符带来的安全漏洞问题

    mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit]) /e 修饰符使 preg_rep ...

  6. iOS开发之AFNetworking 3.0.4使用

    昨天使用Cocoapods导入AFN做POST的时候,导入的最新版的3.0.4,突然发现找不到AFHTTPRequestOperationManager了...上github上一看,发现没有这个了.刚 ...

  7. Mysql常用表操作 | 单表查询

    160905 常用表操作 1. mysql -u root -p 回车 输入密码   2. 显示数据库列表 show databases     3. 进入某数据库 use database data ...

  8. linux时间同步ntp服务的安装与配置

    1.首先安装NTP [root@localhost /]# yum install ntp -y 2.修改NTP配置文件,添加NTP服务器的网络位置    /etc/ntp.conf # For mo ...

  9. CoolPlist 帧动画自动生成工具

    工具英文名称:CoolPlist作者: 陈前帆 thinkingMan | sonny 邮箱: 625936034@qq.com | chenqianfan1@163.com电话: 136704713 ...

  10. iOS开发系列--C语言之存储方式和作用域

    概述 基本上每种语言都要讨论这个话题,C语言也不例外,因为只有你完全了解每个变量或函数存储方式.作用范围和销毁时间才可能正确的使用这门语言.今天将着重介绍C语言中变量作用范围.存储方式.生命周期.作用 ...