Webpack打包UMD的问题

webpack把es6写的library打包成一个UMD文件,使用global var的方式来调用这个打出来的bundle(ukulele.js)会出现一个很奇怪的问题:
比如我<script src="ukulele.js"></script>后
我必须使用Ukulele.Ukulele才能真正调用到function,外面会被包裹一层叫Ukulele属性。。。我们明明export的是一个function啊。。。请知道的朋友们解答,如何才能直接可以new Ukulele()呢 而不是 new Ukulele.Ukulele()

entry 如下 (es6)

function Ukulele(){
    //balabala
}
export {Ukulele}

webpack-config.js如下

var webpack = require('webpack');
var path = require('path');
var libraryName = 'Ukulele';

var config = {
    entry: __dirname + '/src/ukulele/core/Ukulele.js',
    devtool: 'source-map',
    output: {
        path: __dirname + '/dist',
        filename: 'ukulele.js',
        library: libraryName,
        libraryTarget: 'umd',
        umdNamedDefine: true
    },
    module: {
        loaders: [
            {
                test: /\.js$/,
                loader: 'babel',
                exclude: /(node_modules|bower_components|test)/,
                query: {
                    presets: ['es2015']
                }
             },
        ]
    },
    resolve: {
        root: path.resolve('./src'),
        extensions: ['', '.js']
    }
}
module.exports = config;
阅读 21.7k
4 个回答

自己搞定了,不要设置libraryName就行了

output: {
        path: __dirname + '/dist',
        filename: 'ukulele.js',
        library: libraryName,   //不要设置libraryName就行了
        libraryTarget: 'umd',
        umdNamedDefine: true
    },

其实你这属于在全局空间下使用库。 如果你的库能导出一个函数,则可以使用libraryName的方式,挂在你想要的name上。 然而在webpack中无法实现将一个函数直接导出(将函数作为默认导出),所以只能不给这个库起名字,然后将你的函数作为一个导出变量来导出。

由于在浏览器中使用时,导出的变量会被挂载到全局空间,所以Ukulele也就能在全局空间上寻找到了。

function Ukulele(){
    //balabala
}
export default Ukulele
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题