首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何扩展OpenLayers的生产版本

如何扩展OpenLayers的生产版本
EN

Stack Overflow用户
提问于 2017-11-23 23:09:04
回答 1查看 466关注 0票数 2

我使用的是OpenLayers 4的生产(ol.js)和调试(ol-debug.js)版本。这些文件的来源是来自releases页面的-dist.zip (这两个npm包都不与我们的browserify工作流兼容)。

我正在添加一个自定义的瓦片源,基于ol.source.Zoomify

代码的结构如下所示(几乎是ol源代码中Zoomify的克隆):

代码语言:javascript
复制
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版本中工作得很好,但是在使用生产版本时会引发以下异常。

代码语言:javascript
复制
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,使其与生产版本兼容?

EN

回答 1

Stack Overflow用户

发布于 2017-11-24 00:00:07

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

OpenLayers接口由以下部分组成

常量的constructors

  • names和签名、实例方法和properties

  • names的签名以及functions

  • names of

的签名

http://openlayers.org/en/v4.6.5/apidoc/

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

然而,有一些方法可以实现你想要的东西。

(1)在代码旁边构建OpenLayers

您可以使用Closure Compiler与OpenLayers一起构建您的代码。此tutorial中对此进行了说明。这样,您就可以访问任何非私有属性,并根据自己的喜好扩展它。此外,您还可以获得最小化和“检查”(检查错误)代码的好处,这是非常酷的。

编辑适用于OpenLayers 4.6.5版。

(2) Fork OpenLayers

如果您想要使用/扩展的属性是私有的或无法访问,您仍然可以派生OpenLayers,应用您自己的修复程序来使您想要的东西可用(例如,将它们标记为@api ),并生成您自己的定制生产版本。

无论您选择做什么,请毫不犹豫地查看OpenLayers本身的源代码。如果一个属性没有被标记为@api,那么对于OpenLayers的官方版本打包的默认JS来说,就认为它“不可用”。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47458549

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档