Я работал с руководством по Webpack. В одном из разделов он дает пример кода, который содержит одну строку сути этого вопроса:
export default class Button { /* class code here */ }
В следующем разделе указанного руководства под названием «Разделение кода» класс, определенный выше, загружается по запросу, например:
require.ensure([], () => {
const Button = require("./Components/Button");
const button = new Button("google.com");
// ...
});
К сожалению, этот код выдает исключение:
Uncaught TypeError: Button is not a function
Теперь я знаю, что правильный способ включить модуль ES6 — это просто import Button from './Components/Button';
в верхней части файла, но использование подобной конструкции в любом другом месте файла превращает Babel в грустную панду:
SyntaxError: index.js: 'import' and 'export' may only appear at the top level
Немного повозившись с предыдущим (require.ensure()
) примером выше, я понял, что синтаксис ES6 export default
экспортирует объект со свойством default
, который содержит мой код (функция Button
).
Я исправил пример неработающего кода, добавив .default
после вызова require, например:
const Button = require("./Components/Button").default;
... но я думаю, что это выглядит немного неуклюже и подвержено ошибкам (мне нужно знать, какой модуль использует синтаксис ES6, а какой использует старый добрый module.exports
).
Это подводит меня к вопросу: как правильно импортировать код ES6 из кода, использующего синтаксис CommonJS?