gpt4 book ai didi

javascript - OpenLayers 6 - ES6 项目结构

转载 作者:行者123 更新时间:2023-12-01 15:43:49 24 4
gpt4 key购买 nike

我正在开发一个在 ES6 中使用 OpenLayers 6 和 Webpack 的项目。
这是我的第一个真正的 ES6 项目,我想让它有条理(并且有点模块化),但我在使用导入和导出方面遇到了困难。

目前我的结构是:

- all.js
- map/
- index.js
- gpx.js
all.js文件是“入口点”。

all.js
import 'ol/ol.css';
import map from './map/index';
import { vector as GPXvector } from './map/gpx';

map.addLayer(GPXvector);

map /index.js
import { Map, View } from 'ol';
import { OSM } from 'ol/source';
import { Tile as TileLayer } from 'ol/layer';

const map = new Map({
layers: [
new TileLayer({
source: new OSM()
})
],
target: 'map',
view: new View({
center: [1037749, 5135381],
zoom: 10
})
});

export { map as default };

map /gpx.js
import { Vector as VectorLayer } from 'ol/layer';
import { Circle as CircleStyle, Fill, Stroke, Style } from 'ol/style';
import { unByKey } from 'ol/Observable';
import VectorSource from 'ol/source/Vector';
import GPX from 'ol/format/GPX';
import map from './index.js'; // Is that good ??

const style = {
// [...] Some style here
};

const source = new VectorSource({
url: 'test.gpx',
format: new GPX()
});

var onChange = source.on('change', function() {
if (source.getState() == 'ready') {
map.getView().fit(source.getExtent()); // Access to "map" from "index.js" HERE
unByKey(onChange);
}
});

const vector = new VectorLayer({
source: source,
style: function (feature) {
return style[feature.getGeometry().getType()];
}
});

export { vector, source };

我想访问 map来自 map/index.js 的实例(在 map/gpx.js 中初始化)文件(参见源代码中的注释)。
但我感觉我在进口 map来自 map/index.js里面 all.js ,正在导入 map/gpx.js他自己也进口 map来自 map/index.js .
在我看来,这听起来像是某种“循环”导入,其中处理导入顺序会很困惑,例如当我在项目中获得更多文件时。

另外,如果您对我正确开始使用 ES6 有任何建议,那就太酷了!

编辑 1

我换了别的东西,看看它是否允许更多的粒度。

all.js
import 'ol/ol.css';
import map from './ntrak/index';
import MyGPX from './ntrak/gpx';

const gpx = new MyGPX(map, 'test.gpx');

map /gpx.js
import { Vector as VectorLayer } from 'ol/layer';
import { Circle as CircleStyle, Fill, Stroke, Style } from 'ol/style';
import { unByKey } from 'ol/Observable';
import VectorSource from 'ol/source/Vector';
import GPX from 'ol/format/GPX';

const style = {
// [...] Some style here
};

const _onSourceChange = function(map, source) {
if (source.getState() == 'ready') {
map.getView().fit(source.getExtent());
unByKey(_onSourceChange);
}
}

export default class {
constructor(map, url, fit = true) {
this.map = map;
this.url = url;
this.fit = fit;
this.loadGPX();
}

loadGPX() {
this.source = new VectorSource({
url: this.url,
format: new GPX()
});

if (this.fit) {
this.source.on('change', () => _onSourceChange(this.map, this.source));
}

this.vector = new VectorLayer({
source: this.source,
style: function(feature) {
return style[feature.getGeometry().getType()];
}
});

this.map.addLayer(this.vector);
}
};

我认为这很酷,因为它允许在同一个 map 实例上获取多个 GPX 矢量。
但是,如果我想做更多与我的 GPX 源或向量交互的东西,我将需要每次都传递实例,而不是直接导入 GPX 文件。

你怎么看?

最佳答案

您可以使用CircularDependencyPlugin对于 webpack跟踪这种循环依赖。
您的示例中没有循环依赖,import map from './index.js'; // Is that good ??没关系。

你的 es6 代码对我来说很好,我看到了一个 var用法( var onChange = ... ),您应该替换它。

关于javascript - OpenLayers 6 - ES6 项目结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62447003/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com