如何扩展OpenLayers的生产版本

时间:2017-11-23 15:09:04

标签: openlayers openlayers-3

我正在使用OpenLayers 4的生产(ol.js)和debug(ol-debug.js)版本。这些文件的来源是发布页面中的-dist.zip(npm包都不兼容)我们的浏览器工作流程。)

我正在添加基于ol.source.Zoomify的自定义磁贴源。

代码的结构如下(几乎是来自ol源代码的Zoomify的克隆):

var ol = require('openlayers')

var self = (module.exports = {
  Gigapan: function(optOptions) {
    // ...

    var tileGrid = new ol.tilegrid.TileGrid({
      extent: extent,
      origin: ol.extent.getTopLeft(extent),
      resolutions: zoomInfo.resolutions,
    })

    // ...

    ol.source.TileImage.call(this, {
      tileClass: myTile,
      tileGrid: tileGrid,
      tileUrlFunction: gigapanUrlFunction,
    })
  },
})

ol.inherits(self.Gigapan, ol.source.TileImage)

var myTile = function(tileCoord, state, src, crossOrigin, tileLoadFunction) {
  ol.ImageTile.call(this, tileCoord, state, src, crossOrigin, tileLoadFunction)
  this.zoomifyImage_ = null
}

ol.inherits(myTile, ol.ImageTile)

myTile.prototype.getImage = function() {
  // ...
}

这与-debug版本完美配合,但在使用生产版本时会引发以下异常。

ol.js:16 Uncaught TypeError: Cannot read property 'prototype' of undefined
    at Object.v [as inherits] (ol.js:16)
    at Object.43../../../assets/non-npm/openlayers/ol.js (viewerTileFormats.js:168)

指向ol.inherits(myTile, ol.ImageTile)处的第二个ol.inherits。

此代码有什么问题?如何以与生产版本兼容的方式扩展OL4?

1 个答案:

答案 0 :(得分:2)

在生产版本中只有标有@api的属性才可用。更确切地说:

  

OpenLayers API由

组成      
      
  • 构造函数的名称和签名
  •   
  • 实例方法和属性的名称和签名
  •   
  • 职能的名称和签名
  •   
  • 常量名称
  •   

http://openlayers.org/en/latest/apidoc/

因此,如果您尝试扩展或使用未标记为api的属性,则无法在生产版本中使用该属性。

然而,有很多方法可以达到你想要的效果。

(1)与代码一起构建OpenLayers

您可以使用Closure Compiler与OpenLayers一起构建代码。这在tutorial中有解释。这样,您可以访问任何非私人财产,并随意扩展。此外,您还可以最大限度地减少代码并检查"" (对于错误),这很酷。

(2)Fork OpenLayers

如果您要使用/扩展的属性是私有的或无法访问,您仍然可以分叉OpenLayers,应用您自己的修补程序来制作您想要的内容(将其标记为@api,示例)并生成您自己的定制生产版本。

无论您选择做什么,都不要犹豫,查看OpenLayers本身的源代码。如果某个媒体资源未标记为@api,请将其视为"不可用"对于使用官方版本的OpenLayers打包的默认JS。