OpenLayers: почему console.info в браузере может найти переменную

Я пытаюсь установить console.info(ol_map) из браузера, но выдает ошибку неопределенный. Команда работает через код. Почему это происходит?

Я использую фреймворк Symfony с Webpack Encore для управления моими активами.

Это скриншот из браузера

файл: map.js

require('ol/ol.css');
require('../css/map.css');

import View from 'ol/view';
import VectorLayer from 'ol/layer/vector';
import TileLayer from 'ol/layer/tile';
import Map from 'ol/map';

var proj = require('ol/proj').default;
var ol_Map = require('ol/map').default;
//var ol_layer_Tile = require('ol/layer/tile').default;
var ol_source_OSM = require('ol/source/osm').default;
var ol_View = require('ol/view').default;
var coordinate = require('ol/coordinate').default;
//var VectorLayer = require('ol/layer/vector').default;
var VectorSource = require('ol/source/vector').default;
var GML = require('ol/format/gml').default;
var WFS = require('ol/format/wfs').default;

const ol_map = new Map({
    target: 'map',
    layers: [
        new TileLayer({
            source: new ol_source_OSM()
        }),
        //new VectorLayer({
        //    source: new VectorSource({
        //        format: new WFS(),
        //        url: 'http://environment.data.gov.uk/ds/wfs?SERVICE=WFS&INTERFACE=ENVIRONMENTWFS--864c72de-d465-11e4-855f-f0def148f590'
        //    })
        //})
    ],
    view: new ol_View({
        //cordinates in ESPG3857
        center: [-254382.41,7068896.29],
        zoom: 6
    })
});

console.info(ol_map);

файл: map.html.twig

{% extends '::base.html.twig' %}
{# STYLESHEETS-------------------------------------------------- #}
{% block stylesheets %}
    {{ parent() }}
    <link href = "{{ asset('build/map.css') }}" rel = "stylesheet" />
    {#<link href = "https://openlayers.org/en/v4.6.5/css/ol.css" rel = "stylesheet" type = "text/css"/>#}
{% endblock %}
{# PAGE CONTENT-------------------------------------------------- #}
{% block title %}OpenLayers example{% endblock %}
{% block body %}
<body>
    <h2>My Map</h2>
    <div id = "map" class = "map"></div>
    <div class = "arrow_box" id = "popup-container" style = "display: none;"></div>

    <script src = "{{ asset('build/map.js') }}"></script>
</body>
{% endblock %}
{# JAVASCRIPTS-------------------------------------------------- #}
{% block javascript %}
    {{ parent() }}
    {#<script src = "https://openlayers.org/en/v4.6.5/build/ol.js" type = "text/javascript"></script>#}
{% endblock %}

@Aurelien Да, это не имеет значения, у меня та же ошибка.

Rakoun 25.04.2018 15:07

Можете ли вы увидеть код (ol_map) через инструмент разработчика? может быть, webpack также уберет переменную const?

Chase Choi 26.04.2018 08:13

да, я вижу код (вы имеете в виду вкладку источников, если я правильно понял?)

Rakoun 27.04.2018 02:03

если webpack не искажает код, это может быть проблемой в области видимости. некоторые коды обертывают код OL, я думаю.

Chase Choi 27.04.2018 02:57

Он не экспортируется, поэтому эта переменная является локальной для модуля. Если вы хотите получить к нему доступ в консоли браузера, вы можете поставить window.ol_map = ol_map

dube 27.04.2018 10:21

@dube да, уловка работает, не могли бы вы объяснить, почему это происходит? (также опубликуйте свой ответ, чтобы отметить его как ответ)

Rakoun 01.05.2018 15:05
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
6
517
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот более подробное объяснение моего комментария выше:

В Webpack каждый модуль (файл) импортирует и экспортирует код. Когда код транслируется / упаковывается для браузера, каждый из этих модулей включается в закрытие, чтобы внутренний код не просачивался в другие модули. Это очень важно, иначе вам всегда придется следить за тем, чтобы случайно не перезаписать переменные или функции из других модулей.

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

Консоль браузера работает в основной области, где ваша внутренняя переменная ol_map неизвестна. Конечно, эта переменная где-то есть, но это где-то внутри какая-то функция (или даже глубже, в подподподразделе ...- функция). Возможно, ваша переменная также была переименована в webpack (чтобы уменьшить размер кода), поэтому даже когда вы добавляете точку останова отладки в свой код, вы можете не сразу распознать свою переменную (но она есть!).

Однако есть некоторые глобальные вещи, к которым вы можете получить доступ изнутри модуля: window - это объект окна браузера. Он представляет глобальную область видимости. Например, когда вы записываете var x = 'hello'; в свою консоль, эта переменная x станет свойством window.

Таким образом, записывая window.ol_map = ol_map в свой код, вы создаете глобальную переменную, к которой затем можете легко получить доступ в браузере и консоли браузера.

спасибо, ваше объяснение идеально, знаю, я понимаю, что происходит.

Rakoun 02.05.2018 23:45

Другие вопросы по теме