External Javascript Libraries¶
Problem¶
You have a plugin that needs to load some external javascript libraries.
Solution¶
Add an index.js configuration file to your plugin, and reference that in package.json.
This will be merged into the main OpenSphere index page by opensphere-build-index.
Discussion¶
index.json might look something like this, where a couple of video.js dependencies are loaded.
'use strict';
const fs = require('fs');
const path = require('path');
const resolver = require('opensphere-build-resolver/utils');
// if opensphere isn't linked in node_modules, assume it's a sibling directory
const appPath = resolver.resolveModulePath('opensphere') || path.join(__dirname, '..', 'opensphere');
const versionFile = path.join(appPath, '.build', 'version');
const version = fs.readFileSync(versionFile, 'utf8').trim().replace(/.*\//, '');
module.exports = {
basePath: __dirname,
appPath: appPath,
appVersion: version,
distPath: path.join(appPath, 'dist', 'opensphere'),
templates: [{
// add video libraries to main index page
id: 'index',
// don't generate index files here, only resolve the resources
skip: true,
resources: [{
source: resolver.resolveModulePath('video.js/dist', __dirname),
target: 'vendor/video.js',
scripts: ['video.min.js'],
css: ['video-js.min.css']
},
{
source: resolver.resolveModulePath('@videojs/http-streaming/dist', __dirname),
target: 'vendor/video.js',
scripts: ['videojs-http-streaming.min.js']
}]
}]
};
The resources array part of the templates can contain several entries (two shown here).
The resolver resolveModulePath() call will find the specified directory, and the specified
scripts and css entries will be linked into OpenSphere.
You can also use files (instead of, or as well as, scripts and css) to support
as-needed (‘lazy’) loading of scripts, or make additional files available. An example might
look like:
{
source: resolver.resolveModulePath('...', __dirname),
target: '....',
files: ['data.json', '*.+(gif|png)', 'extrafiles']
}
- Those three entries in the
filesarray select: - the specified file (i.e.
data.json) - all files with either of the specified extensions (.gif and .png)
- the
extrafilesdirectory including contents
- the specified file (i.e.
The package.json part simply needs to provide the file name as part of the build
properties:
{
"name": "....",
....
"build": {
...
"index": "index.js",
...
},
...
}