今天是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. c#/js代码命名规范及代码规范

    常用命名 列表,lUser 数组,arrUser 字符串,strTitle 用,分割的字符串,strStatuss(多个用逗号分割的状态) C# Entity层 统一以E开始,比如EUser,EOrd ...

  2. Web Components初探

    本文来自 mweb.baidu.com 做最好的无线WEB研发团队 是随着 Web 应用不断丰富,过度分离的设计也会带来可重用性上的问题.于是各家显神通,各种 UI 组件工具库层出不穷,煞有八仙过海之 ...

  3. [译]Modern Core Graphics with Swift系列

    第一篇 想象一下你已经完成了你的app并且运行的很好,但是界面看上去太土,你可以在PS里面画好多不同尺寸的自定义控件,Apple并没有4x的retina屏幕. 或者你已经未雨绸缪,在代码中使用Core ...

  4. 【hihoCoder】1082: 然而沼跃鱼早就看穿了一切

      题目:http://hihocoder.com/problemset/problem/1082 输入一个字符串,将其中特定的单词替换成另一个单词   代码注意点: 1. getline(istre ...

  5. C++ 编写DLL文件给易语言调用

    摸索了两天了,终于解决了所有问题,在此跟大家分享. 需要三个文件,dll_demo.h.dll_demo.cpp.dll_dome.def 直接上代码: 头文件如下: #ifndef _DLL_DEM ...

  6. 学习Nodejs之mysql

    学习Nodejs连接mysql数据库: 1.先安装mysql数据库 npm install mysql 2.测试连接数据库: var sql = require("mysql"); ...

  7. java .bat批处理(java cmd命令)

    参考:http://www.iitshare.com/under-the-cmd-compile-the-java.html 参考:http://zhidao.baidu.com/link?url=Y ...

  8. 另类的表单数据"序列化"

    背景:最近在做项目时,由于编辑页面需要提交的数据量有些多,而且在提交前还需要做一些逻辑处理,所以如果按照正常的方式,一个个的获取值然后拼接json对象传到后台的话相对工作量较大,而且容易出错,后期的维 ...

  9. tcpdump的简单使用

    tcpdump可以将网络中传送的数据包的“头”完全截获下来提供分析 1.tcpdump host 192.168.8.49         获取主机192.168.8.49接收到和发出的所有分组 2. ...

  10. Visual Studio 2013 Ultimate的可视化代码功能

    可视化和了解代码综合了如何使用visual studio可视化代码来帮助理解代码: 理解代码和代码之间的关系:(1)Code Map(2)Dependency Graphs 理解代码交互:Sequen ...