我有这样的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: 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
一起调用条目文件中的样式表?
答案 0 :(得分:0)
如果仅将脚本设计为可在Web浏览器中运行,为什么不直接更新window
:
import MyClass from 'src/myClass'
import 'src/myStyle.css'
window.MyClass = MyClass;
我认为这比使用间接访问要清楚得多。
答案 1 :(得分:0)
在您的output.libraryExport
中使用webpack.config.js
。 (ref)
将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 {...}