【问题标题】:webpack, react and babel: Uncaught TypeError: Super expression must either be null or a function, not undefinedwebpack、react 和 babel:未捕获的 TypeError:超级表达式必须为 null 或函数,而不是未定义
【发布时间】:2016-05-05 05:41:04
【问题描述】:

我在 webpack 上关注这个 tutorial 并做出反应。由于对 npm 或 node 或 react 或

的某些更新,似乎每隔一步我都会遇到错误

但这一次......我从 webpack 或 react 收到错误:

Uncaught TypeError: Super expression must either be null or a function, not undefined

代码如下:

app/index.jsx

import './main.css';

import React from 'react';
import ReactDOM from 'react-dom';
import App from './components/App.jsx';

ReactDOM.render(<App />, document.getElementById('app'));

app/components/App.jsx

import React from 'react';
import Note from './Note.jsx';

export default class App extends React.Component {
  render() {
    return <Note />;
  }
}

app/components/Note.jsx

import React from 'react';

export default () => <div>Learn Webpack!</div>

我正在使用

  • 反应 0.14.6
  • react-dom ^0.14.6
  • 节点 5.3.0
  • npm 3.5.3
  • babel-core ^6.4.5
  • babel-loader ^6.2.1

提前谢谢你。

【问题讨论】:

  • 您在这方面有什么发现吗?我也面临同样的情况
  • 面临同样的问题...

标签: javascript node.js reactjs webpack babeljs


【解决方案1】:

我一直在与这个问题作斗争。问题在于循环依赖——如果你有一个类扩展了另一个类,但它们都导入了一个相互导入的类,那么超级表达式将简单地解析为未定义。这是一个如何触发它的示例:

A.ts

import './C';

class A extends B {
}

B.ts

import './C';

class B {
}

C.ts

import './A';

// Library code here

在这种情况下,A 类被认为是扩展 undefined,因为依赖树变成了循环的(因为 C 需要 A,而 B 又需要 C,等等),看起来引擎只是简单地“放弃”并解决未定义的超类构造函数。就我而言,我从C 中移动了一些我需要的功能,这样B 就不再导入它了。它打破了循环依赖——它就像一个魅力!

【讨论】:

  • 哦,哇,刚刚发现这是 4 年前发布的:D
【解决方案2】:

如果通过 Terser 插件应用 Webpack 的优化时出现问题,请尝试改用 UglifyJS

const UglifyJsPlugin = require('uglifyjs-webpack-plugin');

module.exports = function override(config, env) {
  config.optimization = {
    minimizer: [new UglifyJsPlugin()]
  };

  return config;
};

它对我有用。

【讨论】:

    【解决方案3】:

    我认为您需要在应用程序类中定义构造函数:

    import React from 'react';
    import Note from './Note.jsx';
    
    export default class App extends React.Component {
    
      constructor(props){
        super(props);
      }
    
      render() {
        return <Note />;
      }
    }
    

    此外,您的 Note 组件可能应该与 App 类似地设置:

    import React from 'react';
    
    export default class Note extends React.Component{
    
      constructor(props){
        super(props);
      }
    
      render() {
        return <div>Learn Webpack!</div>
      }
    }
    

    【讨论】:

    • 感谢您的回复。不是这样的。我倾向于 webpack 或 babel 的配置有问题,因为做一些记录没有 console.logs 被解雇了。如果我注释掉 app/index.jsx 文件中的所有内容,它仍然会给我同样的错误
    • 并且 Note 应该可以完美地作为无 Steateless 功能组件 export default () =&gt; &lt;div&gt;Learn Webpack!&lt;/div&gt;,顺便说一句。
    猜你喜欢
    • 2021-06-11
    • 2016-10-07
    • 1970-01-01
    • 2017-07-11
    • 1970-01-01
    • 1970-01-01
    • 2017-04-01
    • 2017-11-05
    • 2018-02-19
    相关资源
    最近更新 更多