天天看點

ArcGIS JsAPI 子產品化技術演變過程

4.12

主題:API Modernization

官方進行了幾次API更新,使得API能在現代浏覽器中發揮更好的作用。

  • 源代碼的93%使用 TypeScript 編寫
  • esri/request 現在使用原生的 FetchAPI 實作;如果不支援 FetchAPI,則使用 fetch polyfill 代替
  • 大多數異步方法現在支援一個 AbortSignal 類的可選參數:

    signal

    ,具體詳見:Asynchronous Method Cancellation
  • 使用一個

    has

    屬性來标記是否使用原生的 Promise。目前,異步函數傳回一個 Dojo 的 Promise,如果使用這個标記,那麼将傳回原生 Promise 對象。
    var dojoConfig = {
        has: {
            "esri-native-promise": true
        }
    }
               

4.13

  • 96%的源代碼使用 TypeScript 編寫
  • 官方打算在下一版本中預設使用原生的 Promise,而且在 4.15 版本中完全移除 Dojo Promise. 目前版本想預設使用官方的 Promise,參考 4.12 中的 has 屬性用法。

官方做了一些準備工作,以消除 Dojo 子產品化機制。目前版本中,子產品化是使用

dojo/_base/declare

實作的,官方正在遷移到 ES子產品(或者說TS子產品)。

遷移的第一步,是停止使用多重繼承,并使用混合模式。見幫助文檔:實作Accessor

4.14

官方打算在 4.15 版本預設使用原生 Promise(好像鴿了上一版本的計劃),在 4.16 則完全移除 Dojo Promise 的依賴。

4.15

兩項改動。

esriConfig 可作為全局變量

現在,可以使用全局的 esriConfig 對象來設定 esri/config 屬性。

<script>
  var esriConfig = {
    portalUrl: "https://myHostName.esri.com/arcgis"
  };
</script>
           

傳回原生 Promise

此版本預設使用原生的 Promise 對象,下一版本移除對 Dojo Promise 的支援。這意味着:

  • 不再使用

    otherwise()

    方法,用

    catch()

    代替
  • cancel()

    方法,使用 AbortController.abort() 代替
  • always()

    方法,使用下列

    then()

    鍊代替:
.catch(function(error){
  /* do something with the error */
}).then(function() {
  /* this function is always executed */
});
           
  • 沒有

    isFulfilled()/isResolved()/isReject()

    方法了

注意,原生 Promise 對

then/catch

使用的是異步,而 Dojo Promise 使用的是同步。

dojo 聲明

下一版本中,dojo的

declare

将完全移除。

這意味着,多繼承的支援,4.15是最後一版。目前版本會報一個警告資訊。

4.16

在 2020 年 Esri 開發者峰會上,官方宣布了要對 JS API 進行改造,以便與現代前端架構、開發工具內建。目前增強的功能有:

  • 原生 Promise 是預設使用的,

    has

    屬性中的

    esri-native-promise

    屬性已經不再支援(見4.12)
  • 本地化已改善,主要是使用

    intl.setLocale()

    方法,有關這個主題的更多資訊,見:Localization
  • 現在已經使用原生的子產品化來代替

    dojo/_base/declare

  • 多繼承不再支援
  • 目前舊的類文法仍然支援,但是很快就被丢棄了。建議:
    • 移除

      amd-dependency

      注釋
    • tsconfig.json

      添加

      importHelpers: ture

    • 移除對 Dojo

      declare

      的使用

下面是一些文法對比。

之前的ts文法

/// <amd-dependency path="esri/core/tsSupport/declareExtendsHelper" name="__extends" />
/// <amd-dependency path="esri/core/tsSupport/decorateHelper" name="__decorate" />

import Accessor = require("esri/core/Accessor");

import { subclass, declared } from "esri/core/accessorSupport/decorators";

@subclass("esri.guide.Color")
class Color extends declared(Accessor) {
}
           

新的ts文法

import Accessor = require("esri/core/Accessor");

import { subclass } from "esri/core/accessorSupport/decorators";

@subclass("esri.guide.Color")
class Color extends Accessor {
}
           

4.17

在 4.16 中已經不推薦使用 IE11 和 舊 edge 浏覽器了,4.17是支援他們的最後一版。

ES子產品 - 開發中

現在這個程序還在進行中,還不能投入生産。官方打算在 4.18 釋出一個beta的生産版本,在2021年初會剪面。