动态加载 ArcGIS 在线模块

Dynamically load ArcGIS online modeule

是否可以动态决定需要哪些模型()?

使用 JavaScript require() 函数加载一堆小部件需要一些时间,所以我希望能够只包含我在任何给定实例中使用的那些我在用。

目前,我这样做:

var reqs="esri/Map", "esri/WebMap", ... "esri/widgets/Legend";
require(reqs, function(Map, WebMap, ... ,Legend,) { 
...

填充 reqs 数组很容易,但我怎样才能改变函数中的名称?

想出了解决办法。不像人们想要的那样优雅(即必须直接指定 class 名称),但它有效。

var reqs="esri/Map", "esri/WebMap", ... "esri/widgets/Legend";  

require(app.reqs, function() 
    var Map, WebMap, MapView, SceneView, KMLLayer.  ...  Legend;
    for (i=0;i<app.reqs.length;++i) {
        key=app.reqs[i].match(/([^\/]+)$/i)[1];
        if (key == "Map")                   Map=arguments[i];
        else if (key == "WebMap")           WebMap=arguments[i];

        ...

        else if (key == "Legend")           Legend=arguments[i];
        }

不确定在哪种情况下您希望在运行时动态更改导入,因为使用它们的代码很可能是静态的。您是说更改导入列表吗?

您可以随时更改此设置

require(
  ["esri/Map", "esri/WebMap", "esri/widgets/Legend"],
  function(Map, WebMap, Legend) {

   // Source code using Map, WebMap and Legend

  });

到您需要的依赖项列表:

require(
  ["esri/Map", "esri/SceneView", "esri/layers/KMLLayer"],
  function(Map, WebMap, KMLLayer) {

   // Source code using Map, SceneView and KMLLayer

  });

看到 ArcGIS API for JavaScript samples 都有不同的 require() 陈述。


如果您的意思是延迟加载以减少初始启动时间,则有一个使用 Webpack 和 TypeScript 的很好的模块化示例:

https://github.com/Esri/jsapi-resources/tree/master/4.x/webpack/demo

它 imports/requires 所有 ArcGIS API for JavaScript 类 在主要 UI 加载完成后。这基本上是通过在方法中调用 import / require 来完成的:

https://github.com/Esri/jsapi-resources/blob/master/4.x/webpack/demo/src/widgets/App.tsx#L53