UNPKG

@qooxdoo/framework

Version:

The JS Framework for Coders

127 lines (93 loc) 6.06 kB
Using non-qooxdoo, third-party libraries ======================================== Aside from normal qooxdoo libraries like contributions there may be times when you want to include a third-party %{JS} library in your application that just comes as a (potentially minified) *.js* file. (This could e.g. be a graphics or charting library.) There are basically two ways to integrate such a library into your application: - Using the third-party library like a resource of your app. - Wrapping the third-party code in an own %{qooxdoo} library. Here is how each of them works. Using the third-party library like a resource of your application ----------------------------------------------------------------- Let's assume you found this wonderful %{JS} library for charting, called *PonyCharts*. It is available as minified *ponycharts.js* download from the project's web site. It exposes an API for creating and manipulating charts, and you want ot use such charts as part of your %{qooxdoo} application. This means calling into the library's API from your %{qooxdoo} code, which in turn means the library has to be loaded ahead of your code in the browser. 1. As a first step, copy the *.js* file into your app's resource tree, e.g. as source/resource/ponycharts/ponycharts.js 2. Then, make sure your new resource is used by your application code. The main consequence of this is that the *.js* file will be copied over to the build tree of your application, and is being made known to %{qooxdoo}'s ResourceManager. You achieve that by adding an <*@asset>\* hint to the main class of your application or library. /** * This is the main class of your custom application "foo". * * @asset(foo/*) * @asset(ponycharts/ponycharts.js) */ qx.Class.define("foo.Application", ... It makes sense to add the *.js* file under its own directory, thereby creating a namespace for it. This allows you to use wildcards should the third-party lib consist of multiple files (e.g. comes with an *.css* file, images, etc.). You could then write /** * ... * @asset(ponycharts/*) */ 3. Make sure the PonyCharts *.js* file is loaded before your application code. A simple way to achieve this is to use the add-script \<pages/tool/generator/generator\_config\_ref\#add-script\> config key. In your config.json, under *jobs*, add a *common* job like this. "common" : { "add-script" : [ { "uri" : "resource/ponycharts/ponycharts.js" } ] } This will assure the lib is loaded in source and build versions of your app before your code starts. You can now code happily against PonyChart's API. Wrapping the third-party code in an own %{qooxdoo} library ---------------------------------------------------------- There is a more elaborate way to use an external %{JS} package, by wrapping it in its own qooxdoo library. Although more work, this has some advantages: - Easier reuse, e.g. when you want to use the external package in multiple qooxdoo projects. - Single point of concern, e.g. when the external package needs configuration or certain steps to initialize it. - Exposing the package's API through a qooxdoo class. - Automatic dependency management wherever the wrapper class is used. ### Step-by-Step Instructions 1. Create a fresh %{qooxdoo} project using create-application.py. 2. As in the approach above, copy the external package's files to a suitable place under the resource folder, e.g. source/resource/ponycharts/ponycharts.js. 3. Likewise, add an @asset hint in the library's main class to include the external package as a resource (full example further below). 4. Add code to this class that loads the external package, does necessary initialization and potentially adds a %{qooxdoo}-ish API to it. There is a framework class to help you with the loading part, [qx.util.DynamicScriptLoader](apps://apiviewer/#qx.util.DynamicScriptLoader), which does most of the work to make the package available in the current browser context. Using this, here is how your wrapper class may look like: /** * This is the main class of the PonyCharts wrapper. * * @asset(ponycharts/*) */ qx.Class.define("ponycharts.PonyCharts", { extend: qx.core.Object, construct: function() { // initialize the script loading var dynLoader = new qx.util.DynamicScriptLoader([ "ponycharts/ponycharts.js" ]); dynLoader.addListenerOnce('ready',function(e){ console.log("all scripts have been loaded!"); ThePonyChartsTopLevelSymbol.initialize(); }); dynLoader.addListener('failed',function(e){ var data = e.getData(); console.log("failed to load " + data.script); }); dynLoader.start(); }, members: { paint: function() { ThePonyChartsTopLevelSymbol.paint_demo(); } } } See qx.util.DynamicScriptLoader\_ for full details. 5. Add the new %{qooxdoo} library to your main application's configuration. In its *config.json*, add under the *jobs* key "libraries" : { "library" : [ "path" : "<path_to_ponycharts_lib>/Manifest.json" ] } 6. In the using %{qooxdoo} application, call the correpsonding methods of the wrapper class. qx.Class.define("foo.Application", { extend: qx.core.Application, construct: function() { var myPonyCharts = new ponyCharts.PonyCharts(); myPonyCharts.paint(); } } This should give you a basic outline how you can wrap an external package as a %{qooxdoo} library. You can now use the library for multiple projects, or even publish it as a contribution.