Weboldal keresés

javascript - Webpack: Hogyan lehet közvetlenül exportálni a globális változóba (default használata nélkül), amely tartalmaz stíluslap importokat?


Kontextus

Van egy webpack.config.js-em így:

/* Something here */

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

A ./src/index.js fájlom így néz ki:

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

export default MyClass

Probléma

Bár ez jól működik, a MyClass osztályt a window objektumnak teszi ki a következő módon:

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

Így nem tudom meghívni az osztályomat az alábbiak használatával:

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

Úgy kell meghívnom, hogy:

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

A problémát így tudom megoldani a saját ./src/index.js-emben:

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

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

Azonban így nem tudom importálni a stíluslapomat:

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

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

Szerkesztés

A következő mód szintén megoldja a problémát, de export használata nélkül történik:

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

Kérdés

Van-e a Webpack-ben mód arra, hogy egy modult közvetlenül a globális térbe exportáljak anélkül, hogy a .default-ot kellene hívnom és egyúttal egy stíluslapot importálnék a belépési fájlban?

Válasz #1

Használd a output.libraryExport-t a webpack.config.js-edben. (ref)

Az output.libraryTarget umd-ra állítása mellett az output.libraryExport megmondja a Webpacknak, hogy melyik tulajdonságot exportálja globális változóként, amelyet az output.library nevez meg.

Az Ön esetében, az eredeti konfigurációja mellett, a output.libraryExport értékét default-ra állítani egyenértékű azzal, mintha a következő részletet illesztené a lefordított kódja után.

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

A konfiguráció a következőképpen fog kinézni.

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

Próbáld ki a konzolon.

> window.MyClass
class {...}

Válasz #2

Ha a scripted csak a web böngészőben futásra van tervezve, miért ne frissítenéd egyszerűen a window-t:

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

window.MyClass = MyClass;

Azt hiszem, ez sokkal világosabb, mint az indirekció használata.