У меня есть 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 таблицу стилей в файле записи?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Если ваш скрипт предназначен только для работы в веб-браузере, почему бы просто не обновить window явно:
import MyClass from 'src/myClass'
import 'src/myStyle.css'
window.MyClass = MyClass;
Я думаю, что это намного яснее, чем использование косвенности.
Используйте 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 {...}
Это действительно решение, о котором я никогда не думал. Но меня больше интересует использование синтаксиса
export. Что, если он также предназначен для серверной среды?