javascript - Webpack: Stil dosyası importlarını içeren bir şeyi doğrudan global olarak nasıl dışa aktarabilirim (.default olmadan)?


Bağlam

Benim şöyle bir webpack.config.js dosyam var:

/* Something here */

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

Benim ./src/index.js dosyam şöyle görünüyor:

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

export default MyClass

Problem

Bu sorunsuz çalışsa da, MyClass sınıfını window nesnesine şöyle açığa çıkarır:

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

Bu şekilde, sınıfımı şunu kullanarak çağırmam mümkün değil:

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

Bunu şöyle çağırmam gerekiyor:

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

Şu şekilde ./src/index.js dosyamda bir şey yaparak problemi çözebilirim:

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

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

Ancak, bu şekilde stil sayfamı import edemem:

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

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

Düzenle

Aşağıdaki yol da problemi çözer, ancak export kullanılmadan yapılır:

/* 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

Soru

Webpack'te, bir modülü doğrudan globale export etmek için ve aynı zamanda giriş dosyasında bir stil sayfasını import etmek zorunda kalmadan bir yol var mı?

Cevap #1

webpack.config.js dosyanızda output.libraryExport kullanın. (ref)

output.libraryTarget umd olarak ayarlanmasının yanı sıra, output.libraryExport Webpack'e output.library ile adlandırılan global değişken olarak hangi özelliğin dışa aktarılacağını söyler.

Sizin durumunuzda, orijinal yapılandırmanıza ek olarak, output.libraryExport değerini default olarak ayarlamak, derlenmiş kodunuzun sonuna aşağıdaki parçacığı eklemekle eşdeğerdir.

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

Yapılandırma aşağıdaki gibi olacak.

/* 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`
  }
}

Konsolda bir dene.

> window.MyClass
class {...}

Cevap #2

Eğer scriptiniz yalnızca web tarayıcısında çalışmak için tasarlandıysa, neden sadece window öğesini açıkça güncellemiyorsunuz:

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

window.MyClass = MyClass;

Bence bu, dolaylı kullanım yapmaktan çok daha net.