javascript - Webpack:如何直接导出到包含样式表导入的全局(没有.default)?

标签 javascript webpack

上下文

我有一个像这样的 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.log(window.MyClass)
=> Module {default: ƒ, __esModule: true, Symbol(Symbol.toStringTag): "Module"}

这样,我就无法使用以下方法调用我的类:

new MyClass();
=> TypeError: MyClass 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

但是,通过这种方式,我无法导入我的样式表:

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 何时在入口文件中导入样式表?

最佳答案

webpack.config.js 中使用 output.libraryExport。 ( ref )

连同 output.libraryTarget 设置为 umdoutput.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 {...}

关于javascript - Webpack:如何直接导出到包含样式表导入的全局(没有.default)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55956188/

相关文章:

javascript - 拆分 vendor bundle

javascript - Foundation 6.4 app.js 通过导入精心挑选组件

javascript - 用 Greasemonkey 替换对象参数的值

javascript - Mac 上的 Jekyll 没有管理员访问权限(没有自制软件、Ruby、Rvm、cURL)

javascript - 选择全部后如何取消选择功能

typescript - ES6 typescript 将所有导出的常量导入为数组

javascript - Mocha 如何知道在测试套件中首先加载哪个文件

javascript - 在运行时用重复值替换对象的键

javascript - .babelrc 中指定的 Babel 6 预设不起作用

webpack - 循环遍历 Vue.js 静态目录中的 Assets