Description
I think, given the very limited scope of what this library is supposed to do,
it can be significantly simplified for a 2.0 version when effectively rewriting it around the ideas of the dynamic library loading.
The library as it is now seems unnecessarily complicated.
- the exported Loader class is a de-facto singleton - without being
implemented as one. This makes it needlessly complicated to use. - for a lot of tasks, there are several different ways to achieve the same
result, where we can just provide one - there are lots of deprecated functions and other details that are
outdated or not really needed (e.g. functions to remove the API,
which – with newer versions – can't be done completely anyway)
Proposed API
The proposed API exposes just two main parts of functionality: a (static)
method to configure the options and the importLibrary
function (which is
exported independently for convenience).
import ApiLoader from "@googlemaps/js-api-loader";
// initial configuration
ApiLoader.setOptions({ apiKey: "...", version: "weekly" });
// loading a library
const { Map } = ApiLoader.importLibrary("maps");
// anywhere else in the application the shorthand-version can be used as well
import { importLibrary } from "@googlemaps/js-api-loader";
// `importLibrary` is an alias for `ApiLoader.importLibrary`.
const { Map } = await importLibrary("maps");
To get status-information and error messages, the ApiLoader can
implement the EventTarget
interface (add/removeEventListener):
// status could be initialized, loading, loaded, error, or auth-failure
ApiLoader.addEventListener("status-changed", (ev) => {
console.log("new status:", ev.status);
});
ApiLoader.addEventListener("error", (ev) => {});
Notes on internal behavior
the ApiLoader doesn't do anything (except for storing the options) until
theimportLibrary
function is called for the first time. This allows
users to configure the loader in a central place of their application
even if the maps API isn't needed on most pagesOnce the importLibrary function is called, the options are frozen and
attempts to modify them will throw an Error (or maybe just log an
error-message to the console?)the first call to
importLibrary
initiates the bootstrapping, once the
maps API is loaded,importLibrary
will directly forward to thegoogle.maps.importLibrary
function.if an attempt to load the API fails, the loader will resolve all pending
importLibrary
promises with an error and will retry loading with the nextimportLibrary
call.if the library was already loaded by other means than the ApiLoader, a
warning is logged to the console