Модули ES6 через тег скрипта имеют ошибку Запрошенный модуль не предоставляет экспорт с именем 'default'

Я попытался импортировать модуль через тег скрипта,

<script type="module">
        import phonebar from "https://unpkg.com/jssip-emicnet/dist/phonebar.js"

Я получил ошибку

Запрошенный модуль 'https://unpkg.com/jssip-emicnet/dist/phonebar.js "не предоставляет экспорт с именем" default "

Я изменил его на так называемый «Импортировать модуль только из-за его побочных эффектов», и он работал, как ожидалось.

 <script type="module">
        import "https://unpkg.com/jssip-emicnet/dist/phonebar.js"

MDN заявил, что import '/modules/my-module.js'; должен

Импортируйте весь модуль только для побочных эффектов, ничего не импортируя. Это запускает глобальный код модуля, но на самом деле не импортирует никаких значений.

Эти слова не имели для меня смысла. Кроме того, если я использую npm + webpack для создания простого проекта. npm i jssip-emicnet тогда я могу правильно импортировать телефонную панель в свой код js.

import phonebar from 'jssip-emicnet/dist/phonebar';

Так почему я не могу импортировать его через тег <script> в браузере?

На самом деле я являюсь автором jssip-emicnet. phone.js такой

class Phone {
  ...
}
export default Phone

И моя настройка вывода веб-пакета такова

entry: {
    phonebar: './src/ui/phone.js'
},
output: {
    path: path.resolve(__dirname, './dist'),
    filename: '[name].js',
    libraryTarget: 'umd',
    libraryExport: 'default',
    umdNamedDefine: true,
    library: '[name]'
},

Поэтому я не уверен, что это потому, что я что-то пропустил в настройках своего веб-пакета.

----- Обновить -----

С комментариями, которые я получил, я нашел этот Вывод модуля ES с помощью webpack

Вопрос касался webpack 2, и я использую webpack 4, но поскольку эта проблема все еще открыта, https://github.com/webpack/webpack/issues/2933, возможно, веб-пакет еще не поддерживает это.

UMD несовместим с модулями JavaScript также помогает объяснить модули umd и es6.


person Qiulang    schedule 18.08.2019    source источник
comment
libraryTarget: 'umd' означает, что вы больше не создаете модуль ES6. В нем нет объявлений export, которые можно импортировать с использованием синтаксиса модуля.   -  person Bergi    schedule 18.08.2019
comment
Если вы используете webpack, он создает оболочку совместимости для импорта, так что вы также можете импортировать скрипты с другими форматами модулей, а не только с модулями ES6.   -  person Bergi    schedule 18.08.2019
comment
Итак, как мне создать модуль ES6?   -  person Qiulang    schedule 18.08.2019
comment
Не знаю, libraryTarget: 'es6' было бы моим предположением, но я не проверял документы? Если веб-пакет вам не подходит, используйте накопительный пакет, который определенно поддерживает модули ES6.   -  person Bergi    schedule 18.08.2019


Ответы (1)


Сначала я подумал, что ваш импорт был неправильным

Имя вашего экспорта по умолчанию - Phone.

class Phone {
  ...
}
export default Phone

В вашем коде вы запрашиваете переменную phonebar из вашего модуля, которая не является значением экспорта по умолчанию. Это вызовет ошибку. Попробуйте изменить значение импорта phonebar на имя класса по умолчанию.

См. Пример ниже.

import Phone from "https://unpkg.com/jssip-emicnet/dist/phonebar.js"

Но потом я просмотрел ваш phonebar.js файл

Похоже, что код, который вы импортируете из URL-адреса, был транспилирован, что означает, что он больше не работает с import и export, как вы пытаетесь это сделать. Щелкните здесь, чтобы просмотреть исходное представление кода и выполнить поиск для export default и видите, такого нет. И это вызывает ошибки.

Я бы порекомендовал вам, если возможно, импортировать src или разрабатываемую версию вашего phonebar.js скрипта.

Или не используйте модуль и загрузите скрипт стандартным способом.

<script src="https://unpkg.com/jssip-emicnet/dist/phonebar.js"></script>
person Emiel Zuurbier    schedule 18.08.2019
comment
Спасибо, но вы не ответили на мой вопрос. Кроме того, если это означает, что он больше не работает с импортом и экспортом, как вы пытаетесь это сделать. См. Мое слово об импорте телефонной панели из jssip-emicnet / dist / phonebar; - person Qiulang; 18.08.2019
comment
проверьте мой обновленный вопрос о том, почему он был назван телефонной панелью - person Qiulang; 18.08.2019
comment
Я установил ваш пакет и сравнил его с файлом unpkg.com. Похоже, в коде есть отличия. Может быть, поэтому он работает, когда вы его устанавливаете, а не когда вы его загружаете. - person Emiel Zuurbier; 18.08.2019
comment
@EmielZuurbier на самом деле, код Qiulang действительно работает с модулями es, он просто определяет свойство esModule для экспорта. См. Эту страницу: webpack.js.org/guides/author-libraries - person Ben Gubler; 20.08.2019
comment
Потрясающие. export default foo - мне помогла эта строчка. Я получал ту же ошибку из-за module.exports = foo - person Fahim Rahman; 28.06.2021