OpenLayers 6 - структура проекта ES6 - PullRequest
4 голосов
/ 18 июня 2020

Я работаю над проектом, использующим OpenLayers 6 в ES6 с Webpack.
Это мой первый настоящий проект ES6, и я хочу сделать его организованным (и немного модульным), но я борюсь с использованием импорта и экспорт.

Сейчас моя структура:

- all.js
- map/
   - index.js
   - gpx.js

Файл all.js является «точкой входа».

все. js

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

map.addLayer(GPXvector);

карта / индекс. 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 };

карта / гпкс. 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.
Мне кажется, что это какой-то импорт «l oop», где будет беспорядок для обработки порядка импорта, например, когда я получу больше файлов в моем проекте. 1036 1042 *

все. 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);
    }
};

Думаю, это круто, потому что он позволяет получить несколько векторов GPX на одном экземпляре карты.
Но если я хочу делать больше вещей, которые взаимодействуют с моим источником или вектором GPX, мне нужно будет каждый раз передавать экземпляр, а не просто импортировать файл GPX напрямую .

Как вы думаете?

1 Ответ

1 голос
/ 18 июня 2020

Вы можете использовать CircularDependencyPlugin для webpack для отслеживания таких циклических зависимостей.
В вашем примере нет циклической зависимости, import map from './index.js'; // Is that good ?? в порядке.

Ваш код es6 меня устраивает, я вижу одно использование var (var onChange = ...), вы должны его заменить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...