【问题标题】:Cordova JavaScript PluginsCordova JavaScript 插件
【发布时间】:2014-02-04 17:18:52
【问题描述】:

我开始越来越了解 Cordova 内部的工作方式;然而,我一直在努力解决的一件事是 JavaScript 插件的格式。

我习惯于如下编写我的 JavaScript(据我所知,这是标准约定):

(function () {
    var version = "EXAMPLE",
        v1,
        v2,
        v3
        res;

    function somePrivateFunction(successCallback, errorCallback) {
        someOtherPrivateFunction(sc, ec);
    }

    function someOtherPrivateFunction(successCallback, errorCallback) {
        cordova.exec(sc, ec, 'SomeService', 'SomeMethod', [args]);
    }

    res = {
        VERSION: version,
        doSomething: function (sc, ec) {
            somePrivateFunction(sc, ec);    
        }
    }

    window.myPlugin = res;
}());

但是,Cordova 使用了一种我完全不熟悉的格式。我认为(我只在各处听说过这个词)它使用了一种叫做 require 的东西(从大多数插件顶部的声明来看)。

我在Cordova官方插件中经常看到的格式如下:

    var argscheck = require('cordova/argscheck'),
    utils = require('cordova/utils'),
    exec = require('cordova/exec');

var myPlugin = function () {

}

myPlugin.doSomething = function(successCallback, errorCallback) {
    exec(successCallback, errorCallback, 'SomeService', 'SomeMethod', [args]);
}

myPlugin.doSomethingElse = function(successCallback, errorCallback) {
    exec(successCallback, errorCallback, 'SomeService', 'SomeOtherMethod', [args]);
}

modules.export = myPlugin;

也许是因为我对这个 require 库一无所知 - 但我不明白?就 JavaScript 而言,这对我来说似乎完全陌生。

什么是模块,cordova/[...] 语法是什么,它表示什么。这些其他cordova模块在哪里定义(这是正确的术语)以及modules来自哪里?

最后,modules.export 做了什么?我试图理解plugin.xml<js-module> 标记和<clobbers> 标记,但我认为这阻碍了我。

我了解 Cordova 在构建项目时会在插件周围插入cordova.define

也许至少有人可以澄清一下?谢谢!

【问题讨论】:

  • require 和 exec 函数是 cordova 对象的方法。当您安装插件时,它会被包装在可以访问cordova对象的函数中。这些调用实际上是 cordova.require 和 cordova.exec
  • Louis,根据我的解释,这与 RequireJS 无关。我已删除标签
  • 有了插件框架,除非你有特殊需要,只需要关心exec命令,它是js和native代码之间的桥梁功能。
  • @keldar,没有人回答这个问题中关于modules.export 的部分,你有想过吗?

标签: javascript plugins cordova cordova-3


【解决方案1】:

require 和 exec 函数是 cordova 对象的方法。当您安装插件时,它会被包装在可以访问cordova对象的函数中。这些调用实际上是 cordova.require 和 cordova.exec

以下是安装前后的插件 js 文件示例:

之前:

var exec = require("cordova/exec");

var VideoPlayer = {
    play: function(url) {
        exec(null, null, "VideoPlayer", "playVideo", [url]);
    }
};

module.exports = VideoPlayer;

之后:

cordova.define("com.dawsonloudon.videoplayer.VideoPlayer", function(require, exports, module) {

    var exec = require("cordova/exec");

    var VideoPlayer = {
        play: function(url) {
            exec(null, null, "VideoPlayer", "playVideo", [url]);
        }
    };

    module.exports = VideoPlayer;

});

此外,为了回答有关配置设置的问题,clobbers 命令会保护插件对象的名称空间。来自我的插件:

<js-module src="www/VideoPlayer.js" name="VideoPlayer">
    <clobbers target="VideoPlayer" />
</js-module>

这是说明我的 JS 文件的名称,以及用于在 JS 中调用我的插件的对象命名空间。

【讨论】:

  • 谢谢道森。如果它们是 cordova 对象的方法,我如何获得所有其他方法(这样我就可以检查对象,看看有什么可用的)? [object]/[method]require 语法吗?
  • 您熟悉在您的项目中使用网络检查器吗?如果是这样,您可以在控制台中输入“cordova;”它会返回整个对象进行检查
  • 谢谢道森。是的,我对此很熟悉,还有很多 JavaScript 和 Cordova。但是 JS 中的正常属性访问是通过 cordova.exec(...)cordova["exec"] 完成的。我从未见过它是通过require("cordova/exec") 完成的,也从未见过这种语法?这就是我很难理解的。
  • 据我了解,它是新的 3.x 插件结构的一部分。现在所有插件都通过cordova_plugins.js 访问和加载,而不是直接在index.html 中包含插件js 文件的旧方法。由于您的插件 js 是通过这种新方法加载和处理的,因此您不会像以前那样直接访问 cordova.exec,而是使用 cordova 插件框架通过 cordova require 方法将 exec 分配为 var。
  • 感谢您的详细回答,但我在这里有点困惑。为什么您的 VideoPlayer 模块可用作窗口对象并且不需要明确的var VideoPlayer = cordova.require("com.dawsonloudon.videoplayer.VideoPlayer")。还有,cordova.require("com.dawsonloudon.videoplayer.VideoPlayer") 没有找到?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-18
  • 2017-10-06
  • 1970-01-01
  • 2017-11-16
  • 2016-12-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多