RequireJS:onload 发出多个 http 请求

RequireJS: onload making multiple http requests

我的 requireJS 脚本发出了大约 500 个 http 请求,这使我的程序在开始时挂起。我正在使用 gulp 和 gulp-requirejs(优化器),但我不确定如何减少大多数来自 Esri 的 http 请求的数量(我正在使用 ArcGIS JS 4.0 API).有人知道我该如何限制吗?

我看过这个问题,但我不确定如何在 requirejs 中实际实现:https://gis.stackexchange.com/questions/33182/does-the-arcgis-javascript-api-let-me-build-package-my-application-using-dojo

配置代码:

requirejs.config({
    paths: {
        "jquery": 'https://code.jquery.com/jquery-3.1.0.min',
        'moment/moment': 'https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.14.1/moment',
        "esri": 'http://js.arcgis.com/4.0/esri',
        "dojo": 'http://js.arcgis.com/4.0/dojo',
        "dojox": 'http://js.arcgis.com/4.0/dojox',
        "dijit": 'http://js.arcgis.com/4.0/dijit'
    },
    shim: {
        ...
        "map": {
            deps: [ 'jquery', 'esri', 'dojo']
        },

    }
});

在我的模块之一中使用 ArcGIS JS 4.0 API:

define('map',["jquery","esri/Color",
    "esri/geometry/Point",
    "esri/geometry/Polygon",
    "esri/symbols/SimpleFillSymbol",..],function(...){

});

更新: 因此,在构建 arcgis js api(使用 grunt)之后,我将 main.js(找到的 dist 文件夹)包含到我的项目中。但是 API 的本地副本给我错误:

XMLHttpRequest 无法加载 http://services.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer?f=json. Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:4000' 因此不允许访问。响应具有 HTTP 状态代码 501。

我不是在发出请求,而是 arcgis js 库在发出此调用。我是否忘记了在构建我的 arcgis js 时应该包含 grunt 配置的库 API?

arcgis js 的 grunt 文件配置 API:

...
include: [
            'requirejs/require',
            'esri/layers/FeatureLayer',
            'esri/layers/TileLayer',
            'esri/layers/support/LabelClass',
            'esri/layers/graphics/controllers/SnapshotController',
            'esri/portal/support/layersCreator',
            'esri/views/3d/layers/TiledLayerView3D',
            'esri/views/layers/GraphicsLayerView',
            'esri/views/3d/webgl-engine/lib/FloatingBoxLocalOriginFactory',
            'esri/views/3d/webgl-engine/lib/Layer',
            'esri/views/3d/webgl-engine/lib/MaterialCollection',
            'esri/views/3d/webgl-engine/lib/Octree',
            'esri/views/3d/webgl-engine/lib/TextTextureAtlas',
            'esri/views/MapView',
            'esri/views/2d/layers/GraphicsLayerView2D'
          ],
          exclude: [
            'dojo/domReady',
            'dojo/has',
            'dgrid',
            'dojo/i18n', // some methods not available with RequireJS
          ],
...

Esri API 中的默认文件 (init.js) 包含 require 实现,并且它具有大部分基本模块缓存。这样做是为了减少初始加载时间。但是,由于您没有使用 esri require(要加载的 init.js 文件),所有缓存的模块都不可用。因此,每个模块都是通过 http 请求下载的。

您尝试使用 Bower 构建 ESRI 脚本的自定义版本。有关如何操作的详细信息,请访问他们的网站。

我知道它并没有完全回答你的问题。但是,希望它能有所帮助。