Плагины JavaScript для Кордовы

Я все больше и больше начинаю понимать внутреннюю работу 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? Я пытаюсь понять тег <js-module> из plugin.xml и тег <clobbers>, но, думаю, это сдерживает меня.

Я понимаю, что когда Кордова собирает проект, она вставляет cordova.define вокруг плагина.

Может хоть кто прояснит? Спасибо!


person keldar    schedule 04.02.2014    source источник
comment
функции require и exec являются методами объекта cordova. Когда вы устанавливаете плагин, он оборачивается функцией, которая дает доступ к объекту Cordova. На самом деле это вызовы cordova.require и cordova.exec.   -  person Dawson Loudon    schedule 04.02.2014
comment
Луи, согласно моему объяснению, это не имеет отношения к RequireJS. я удалил тег   -  person Dawson Loudon    schedule 04.02.2014
comment
С фреймворком плагинов, если у вас нет особой потребности, вам нужно беспокоиться только о команде exec, которая является функцией моста между js и собственным кодом.   -  person Dawson Loudon    schedule 04.02.2014
comment
@keldar, никто не ответил на часть этого вопроса о modules.export, ты когда-нибудь это понял?   -  person E.A.T    schedule 17.07.2015


Ответы (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.

person Dawson Loudon    schedule 04.02.2014
comment
Спасибо Доусон. Если это методы объекта cordova, как мне получить все остальные методы (чтобы я мог проверить объект и посмотреть, что доступно)? И является ли синтаксис [object]/[method] require? - person keldar; 04.02.2014
comment
Вы знакомы с использованием веб-инспектора в своих проектах? Если это так, в консоли вы можете ввести «cordova;» и он вернет весь объект для проверки - person Dawson Loudon; 04.02.2014
comment
Спасибо Доусон. Да, я знаком с этим, и довольно много JavaScript и Cordova. Но обычный доступ к свойствам в JS осуществляется через cordova.exec(...) или cordova["exec"]. Я никогда не видел, чтобы это делалось с помощью require("cordova/exec"), и раньше не видел такого синтаксиса? Это то, что я изо всех сил пытаюсь понять. - person keldar; 04.02.2014
comment
Насколько я понимаю, это часть новой структуры плагина 3.x. Все плагины теперь доступны и загружаются через cordova_plugins.js вместо старого метода включения вашего js-файла плагинов непосредственно в index.html. Поскольку ваш плагин js загружается и обрабатывается с помощью этого нового метода, вы не получаете доступ к cordova.exec напрямую, как раньше, а вместо этого используете платформу плагинов Cordova для назначения exec как var через метод require cordova. - person Dawson Loudon; 04.02.2014
comment
Спасибо за подробный ответ, но я немного запутался здесь. Почему ваш модуль VideoPlayer доступен как объект окна и не требует явного var VideoPlayer = cordova.require("com.dawsonloudon.videoplayer.VideoPlayer"). И еще, cordova.require("com.dawsonloudon.videoplayer.VideoPlayer") не нашел? - person bizi; 01.01.2015