Ivan-P
@Ivan-P

Babel — Uncaught ReferenceError: ... is not defined?

Пытаюсь запустить es6 через Бабель
<script src="https://js.cx/babel-core/browser.min.js"></script>

    <script type="text/babel">
        'use strict';
        
        var starter = function (){

            //определенные действия

        };
    </script>
<button id="btn" onclick="starter()">start</button>


Но в консоли получаю ошибку Uncaught ReferenceError: starter() is not defined.
Если убираю с тега script атрибут type="text/babel" - все работает. Почему так, что я делаю не правильно?
  • Вопрос задан
  • 1609 просмотров
Решения вопроса 1
nalomenko
@nalomenko
Руководитель отдела разработок в студии «Lava»
Всё дело в области видимости переменных. Обычный <script></script> работает в контексте глобального объекта window, ровно как и содержимое аттрибута onClick внутри HTML-тегов.

В свою очередь, скрипты <script type="text/babel" ></script>, которые в дальнейшем обрабатываются браузерным препроцессором babel/browser.js, помещаются в иную область видимости, что и приводит к ошибке starter() is not defined

Исправить ситуацию в данном случае просто — нужно привязать обработчик onclick к кнопке не с помощью аттрибутов тега, а из тела babel-скрипта:

<!DOCTYPE html>
<html>
<head>
    <script type="text/babel" >
        'use strict';
        
        var starter = function (){ alert("It works!") }

        document.getElementById("btn").onclick = starter;
    </script>
</head>
<body>
	<button id="btn">start</button>	
	<script src="https://js.cx/babel-core/browser.min.js"></script>	
</body>
</html>


Ну а в целом, браузерные препроцессоры имеют ряд недостатков и неудобств в использовании, особенно, когда дело доходит до продакшна. Именно поэтому браузерная версия препроцессора Babel более недоступна на официальном сайте, где указано, что babel-browser has been removed.

Такая же участь постигла браузерный JSXTransformer для обработки синтаксиса JSX в React.js

И для первого, и для второго случаев теперь рекомендуется использовать Babel, как модуль одной из систем сборки проектов, будь то Gulp, Grunt, Webpack или что-либо еще. Отчасти обусловлено это тем, что современный ES2015 имеет множество фич и плагинов, которые Вы врядли будете в полном объёме использовать в своём проекте, а в рамках систем сборки необходимый набор инструментов гибко настраивается в babelrc (например, если из всех прелестей нового EcmaScript нам нужны только стрелочные функции, нужно подключить только плагин transform-es2015-arrow-functions).

При этом конфигурация файла .babelrc будет выглядеть так:
{
  "plugins": ["transform-es2015-arrow-functions"]
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@MrCheater
Full-Stack JS. В прошлом программист-олимпиадник
Если вы в продакшене используете компиляцию babel-ом на клиентской стороне, это значит, что вы ненавидите и не уважаете своих пользователей, бессмысленно забиваете их трафик, и отжираете память устройств.
Хорошо, что это уже deprecated
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы