Webpack: как экспортировать напрямую в глобальный (без .default), содержащий импорт таблиц стилей?

Контекст

У меня есть webpack.config.js вот так:

/* Something here */

module.exports = {
  entry: {
    main: './src/index.js'
  },
  output: {
    library: 'MyClass',
    libraryTarget: 'umd',
    path: path.resolve(__dirname, 'lib'),
    filename: `package.js`
  },
  ...
}

Мой ./src/index.js выглядит так:

import MyClass from 'src/myClass'
import 'src/myStyle.css'

export default MyClass

Проблема

Хотя это работает нормально, он предоставляет класс MyClass объекту window как:

console.info(window.MyClass)
=> Module {default: ƒ, __esModule: true, Symbol(Symbol.toStringTag): "Module"}

Таким образом, я не могу вызвать свой класс, используя:

new MyClass();
=> TypeError: Slidery is not a constructor

Я должен вызвать его так:

new MyClass.default();
=> MyClass { ... }

Я могу решить проблему, выполнив что-то вроде этого в моем ./src/index.js:

const MyClass = require('src/myClass')
module.exports = MyClass

/* in browser */
new MyClass()
=> Good, works fine

Однако таким образом я не могу import свою таблицу стилей:

const MyClass = require('src/myClass')
import 'src/myStyle.css'

module.exports = MyClass
=> TypeError: Cannot assign to read only property 'exports' of object '#<Object>'

Редактировать

Следующий способ также решает проблему, но делается без export:

/* webpack.config.js */
module.exports = {
  entry: {
    main: './src/index.js'
  },
  output: {
    /* Need to remove library related props */
    // library: 'MyClass',
    // libraryTarget: 'window',
    path: path.resolve(__dirname, 'lib'),
    filename: `package.js`
  },
  ...
}

/* ./src/index.js */
import MyClass from 'src/myClass'
import 'src/myStyle.css'

window.MyClass = MyClass

Вопрос

Есть ли способ в Webpack для меня export модуль напрямую в глобальный без необходимости вызывать с .defaultа также в то же время import таблицу стилей в файле записи?

Поведение ключевого слова "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) для оценки ваших знаний,...
4
0
718
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Если ваш скрипт предназначен только для работы в веб-браузере, почему бы просто не обновить window явно:

import MyClass from 'src/myClass'
import 'src/myStyle.css'

window.MyClass = MyClass;

Я думаю, что это намного яснее, чем использование косвенности.

Это действительно решение, о котором я никогда не думал. Но меня больше интересует использование синтаксиса export. Что, если он также предназначен для серверной среды?

yqlim 03.05.2019 03:51
Ответ принят как подходящий

Используйте output.libraryExport в своем webpack.config.js. (ссылка)

Вместе с output.libraryTarget, установленным на umd, output.libraryExport сообщает Webpack, какое свойство нужно экспортировать как глобальную переменную, названную output.library.

В вашем случае, в дополнение к вашей исходной конфигурации, установите output.libraryExport на default эквивалентно добавлению следующего фрагмента после скомпилированного кода.

window.MyClass /*output.library*/ = module.exports.default /*output.libraryExport*/

Конфигурация будет следующей.

/* Something here */

module.exports = {
  entry: {
    main: './src/index.js'
  },
  output: {
    library: 'MyClass',
    libraryTarget: 'umd',
    libraryExport: 'default',  // export the default as window.MyClass
    path: path.resolve(__dirname, 'lib'),
    filename: `package.js`
  }
}

Попробуйте в консоли.

> window.MyClass
class {...}

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