[ 
https://issues.apache.org/jira/browse/CB-388?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13239565#comment-13239565
 ] 

Patrick Mueller commented on CB-388:
------------------------------------

copied from [CB-298|https://issues.apache.org/jira/browse/CB-298], because I 
think we should move the "what to do in the future" discussion here.

bq. As far some guidance on how to move over, I would recommend employing 
cordova's define and require in cordova-js. For a hasResource equivalent, I 
would check if cordova.require('mymoduleid') throws an exception. If so, then 
go ahead and use cordova.define. If not, it's already defined, as the user does 
in your above example, simply return out. In the same vein, cordova.define can 
be used as a replacement for addResource.

bq. The only other change would be to the call to exec. Users can go with 
either calling cordova.exec directly, or if they want to use the same require 
syntax they can roll with cordova.require('cordova/exec').

So, one thing we have to ask is if we really want to expose {{define()}} and 
{{require()}} as core API.  I certainly want to continue using them as core 
building blocks, but not sure it makes sense to equate modules with "plugins".  

Specifically, while I suspect we want all plugins implemented as modules, they 
are really two separate beasts.  

For instance, there IS no easy API to check to see if a module is "available".  
If you reference a module, you assume it's available.  If you really don't 
know, then you have to wrap in a {{try/catch}}, which is very unfriendly.  

Another for instance, it seems likely that we will want to provide other 
"plugin" capabilities, like the ability to load a "resource" relative to the 
plugin.  Again, there IS no API to do this in the CJS universe.  AMD has such 
notions, but they're baked into their module system, which ain't right.

What I'm suggesting is that we probably want to have a first class notion of a 
"plugin", that we can provide additional API on, over-and-above what the module 
system provides.  Extending the module system, like what AMD does, is not a 
great story as it limits our freedom-of-action w/r/t replacing the module 
system - basically, we can't.  Today, the story we are limping towards is "use 
our module system, or in the future we plan on allowing you to use a different 
module system, as long as it passes our compliance tests".  Which will be good 
enough for the RequireJS's, almond's, pinf's, and Dojo's of the world.

Just to strawman a bit, here's a potential shape:

{noformat}
Cordova.getPlugin(aPluginName)

  Returns the specified plugin object, or null if not available.  

  aPluginName - a fully-qualified Cordova plugin name (whatever that means)

Cordova.getPluginResource(aPlugin, aResourceName, options)

  Returns the specified resource, or null if not available.

  aPlugin       - a plugin object, or name of a plugin
  aResourceName - a name relative to the installed plugin (whatever that means)
  options       - provides hints about the shape of the returned object.
                  eg, "give me a Blob" or "give me an Image" or "give me an 
                  HTML element installed in a DocumentFragment", etc.

Cordova.getPluginMetaData(aPlugin)

  Returns the meta-data about a plugin (eg, package.json contents)

  aPlugin - a plugin object, or name of a plugin
{noformat}

It might well be that it makes sense for one of these "plugin objects" to 
actually be the "module exports" or a module, in some kind of algorithmically 
defined way.  Eg:

    require(aPluginName) == Cordova.getPlugin(aPluginName)

But I don't see a hard requirement to do this.  It's not out of the question 
that you could see "module names" as the equivalent of Java Class names 
(implementation), but "plugin names" as more of a Java "interface", where you 
tie the two together in your meta-data.  For instance, I might want to have a 
plugin which has completely different implementations for iOS and Android, and 
specify that in my plugin metadata.

                
> REMOVE "plugins" and "PhoneGap" global objects from JavaScript implementation
> -----------------------------------------------------------------------------
>
>                 Key: CB-388
>                 URL: https://issues.apache.org/jira/browse/CB-388
>             Project: Apache Callback
>          Issue Type: Bug
>          Components: CordovaJS
>    Affects Versions: 1.5.0, 1.6.0, 1.7.0, 1.8.0, 1.9.0
>            Reporter: Filip Maj
>            Assignee: Filip Maj
>            Priority: Minor
>             Fix For: 2.0.0
>
>
> The {{plugins}} and {{PhoneGap}} JavaScript globals should be removed in 2.0. 
> Deprecation notices were set up in 1.6 for these methods/objects.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to