Cordova 插件 javascript 在添加到项目时损坏

Cordova plugin javascript gets corrupted when added to project

我写了一个小的 Cordova 插件,当添加到另一个 Cordova 项目时会损坏。这个插件基本上是原生 iOS 核心数据包裹在 Javascript 中。公开函数的 Javascript 文件已损坏。

原文件如下:

    cordova.define("com.aga.cordova.plugin.ioscoredata.plugincoredata", function(require, exports, module) { var exec = require('cordova/exec'),
        cordova = require('cordova');

    var plugincoredata = {
        saveJSON: function(successCallback, errorCallback, tableName, json) {
            exec(successCallback, errorCallback, "PluginCoreData", "saveJSON", [tableName, json]);
        },

        loadJSON: function(successCallback, errorCallback, tableName, extraColumns) {
            exec(successCallback, errorCallback, "PluginCoreData", "loadJSON", [tableName, extraColumns]);
        },

        clear: function(successCallback, errorCallback, tableName) {
            exec(successCallback, errorCallback, "PluginCoreData", "clear", [tableName]);
        }
    };

    module.exports = plugincoredata;

    });

文件被正确复制到项目plugins文件夹中,但由于某些原因在复制到platform/ios/ProjectName/www/plugin/PluginName/js/plugincoredata.js时被错误修改(同样发生在运行 cordova prepare之后) . 那里的文件看起来像这样:

cordova.define("com.aga.cordova.plugin.ioscoredata.plugincoredata", function(require, exports, module) {
         cordova.define("com.aga.cordova.plugin.ioscoredata.plugincoredata", function(require, exports, module) { var exec = require('cordova/exec'),
            cordova = require('cordova');

            var plugincoredata = {
                saveJSON: function(successCallback, errorCallback, tableName, json) {
                    exec(successCallback, errorCallback, "PluginCoreData", "saveJSON", [tableName, json]);
                },

                loadJSON: function(successCallback, errorCallback, tableName, extraColumns) {
                    exec(successCallback, errorCallback, "PluginCoreData", "loadJSON", [tableName, extraColumns]);
                },

                clear: function(successCallback, errorCallback, tableName) {
                    exec(successCallback, errorCallback, "PluginCoreData", "clear", [tableName]);
                }
            };

            module.exports = plugincoredata;

    });
            });

如您所见,定义重复。

知道发生了什么事吗?我的理解是 Cordova 应该只复制 javascript 文件而不改变它。

从模块化的角度来看,在原始 JS 文件中不调用 define 实际上是有道理的,因为该文件不需要知道它所在的模块(插件)的名称。只有当该 JS 嵌入到具有 name/identifier 的插件中时,Cordova 需要定义它,以将其耦合到实际的插件。

如果您查看 Cordova 提供的插件,您会看到相同的模式,JS 文件本身不会 define,只有当它们被添加到平台时才会添加 define 调用.参见示例

<root>/plugins/org.apache.cordova.device/www/devices.js

并将其与

进行比较
<root>/platforms/ios/www/plugins/org.apache.cordova.device/www/devices.js

后者有define调用。