Webpack输出是空对象

SeB*_*eBe 7 javascript npm reactjs webpack

我想构建一个反应组件库作为节点模块,然后将其导入不同的项目.但是如果我尝试导入一个组件,它只返回一个空对象.

button.jsx:

import React, {Component} from 'react'

export class Button extends Component {

   render() {
       return <button className='btn'>Hello Button comp</button>
   }
}

export default Button
Run Code Online (Sandbox Code Playgroud)

index.js

var Button = require('./button/button').default;

module.exports  = {
   Button: Button
}
Run Code Online (Sandbox Code Playgroud)

webpack.config.js

const Path = require('path');

module.exports = {
   resolve: {
      extensions: ['.js', '.jsx']
   },
   entry: {
      app: './src/components/index.js'
   },
   output: {
      path: __dirname,
      filename: 'bundle.js'
   },
   module: {
    rules: [
        {
            test: /\.jsx$/,
            loader: 'babel-loader',
            query: {
                presets: [
                    'es2015',
                    'react'
                ]
            },
            exclude: /node_modules/,
            include: [
                Path.resolve(__dirname, 'src')
            ]
        },
        {
            test: /\.js$/,
            loader: 'babel-loader',
            query: {
                presets: [
                    'es2015',
                    'react'
                ]
            },
            exclude: /node_modules/,
            include: [
                Path.resolve(__dirname, 'src')
            ]
        }
    ]
  }
}
Run Code Online (Sandbox Code Playgroud)

package.json中的主要属性是bundle.js

我想通了当我在项目中导入Button时它只是一个空对象.在我看来,好像webpack没有正确捆绑索引文件.任何想法在这里可能是错的?

Mic*_*ngo 23

默认情况下,webpack包不会公开您的导出,因为它假定您正在构建应用程序而不是库(这是webpack的更常见用法).您可以通过配置output.library和创建库output.libraryTarget.

output: {
   path: __dirname,
   filename: 'bundle.js',
   library: 'yourLibName',
   libraryTarget: 'commonjs2'
},
Run Code Online (Sandbox Code Playgroud)

output.libraryTarget是模块的格式,它还允许您将库公开为全局变量.commonjs2是Node使用的模块格式.看什么是commonjs2?之间的差额commonjscommonjs2.

由于您使用的是React,因此您会期望库的使用者将React作为依赖项存在,因此您不希望将其包含在您的包中.为此,您可以将其定义为外部.这将在创作库中显示,它将向您介绍一个小例子.

  • 这是否也适用于将在浏览器中使用的库(使用 script 标签,而不是在 React 中)?我面临同样的问题,我尝试了所有libraryTarget 的值,它总是输出一个空对象。 (2认同)