【问题标题】:Webpack React externals not workingWebpack React 外部不工作
【发布时间】:2017-06-22 06:03:36
【问题描述】:

我似乎无法正确获取 webpack 的 React 外部配置

当 react 作为从 node_modules 捆绑的供应商导入时,该应用程序可以工作。 但是,当我删除供应商捆绑包并尝试从 CDN 使用 react 时,我收到以下错误。

警告:React.createElement:类型无效——需要一个字符串 (对于内置组件)或类/函数(对于复合 组件)但得到:未定义。您可能忘记导出您的 来自它定义的文件中的组件。 printWarning @ react.js:3640 警告@ react.js:3664 createElement @ react.js:2357 module.exports @ 应用程序.js:122 webpack_require @app.js:20(匿名)@app.js:429 webpack_require@app.js:20 module.exports@app.js:66(匿名)@app.js:69

完整代码https://github.com/ericnoguchi/react-testing

这是我的 webpack 配置

let LiveReloadPlugin = require('webpack-livereload-plugin');
let ExtractTextPlugin = require("extract-text-webpack-plugin");
let webpack = require('webpack');

module.exports = {
    entry: {
        'app': './@Client.js',
        // 'vendor': [
        //     "react",
        //     "react-dom",
        //     "react-router"
        // ],
    },
    output: {
        path: __dirname + '/_dist',
        publicPath: '/',
        filename: "[name].js"
    },
    externals: {
        "react": 'React',
        "react-dom": 'ReactDOM',
        "react-router": 'ReactRouter'
    },
    devServer: {
        contentBase: '_dist'
    },
    module: {
        loaders: [
            {
                test: /\.scss$/,
                loader: ExtractTextPlugin.extract({
                    fallback: 'style-loader',
                    use: ['css-loader', 'sass-loader']
                })
            },
            {
                test: /\.jsx?$/,
                exclude: /(node_modules|bower_components)/,
                loader: 'babel-loader',
                query: {
                    presets: [
                        "react",
                        "es2015",
                        "stage-2"
                    ]
                }
            }
        ]
    },
    plugins: [
        new webpack.DefinePlugin({
            "process.env": {
                BROWSER: JSON.stringify(true)
            }
        }),
        // new webpack.optimize.CommonsChunkPlugin({
        //     name: 'vendor',
        //     filename: 'vendor.js',
        //     minChunks: Infinity
        // }),
        new ExtractTextPlugin("css/[name].css"),
        new LiveReloadPlugin()
    ]
};

还有布局组件

import React, { Component } from 'react';
import { Link } from 'react-router'

// http://stackoverflow.com/questions/30347722/importing-css-files-in-isomorphic-react-components
if (process.env.BROWSER) {
  require('./layout.scss');
  console.log('lalala')
}

export class Layout extends Component {
  handleClick() {
    alert(0);
  }
  render() {
    let {custom, children} = this.props;
    return (
      <html>
        <head>
          <title>{custom.title}</title>
          <link rel="stylesheet" type="text/css" href="css/app.css" />
        </head>
        <body>
          <h1>{custom.title}</h1>
          <button onClick={this.handleClick}>Click me</button>
          {children}
          <ul>
            <li>
              <Link to="/">Index</Link>
            </li>
            <li>
              <Link to="/about">About</Link>
            </li>
            <li>
              <Link to="/foo">404</Link>
            </li>
          </ul>


          <script dangerouslySetInnerHTML={{
            __html: 'window.PROPS=' + JSON.stringify(custom)
          }}></script>
          {/*<script src="vendor.js"></script>*/}
          <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.4.2/react.js" />
          <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.4.2/react-dom.js" />
          <script src="https://cdnjs.cloudflare.com/ajax/libs/react-router/3.0.2/react-router.js" />
          <script src="app.js" />
        </body>
      </html>
    );
  }
}

客户端APP

import ReactDOM from 'react-dom';
import routes from './routes/routes.jsx'

ReactDOM.render(routes, document);

【问题讨论】:

  • 与您的问题无关,但与您的提问方式无关;这是相关的reading for you
  • 您的ReactDOM.render 电话在哪里? (保留所有与问题相关的代码)。您能否启用源映射,以便更好地查看实际错误在哪里(并向我们展示?app.js:line 没有帮助,因为它是构建工件)
  • @Dan Pantry 我启用了 webpacks 开发工具源地图,但它似乎没有任何帮助查看图片
  • 你检查过这个webpack.js.org/guides/author-libraries 吗?

标签: javascript reactjs webpack


【解决方案1】:

根据您粘贴的错误判断,React 运行良好。你的问题在别的地方。

但是,您的代码中存在多个缺陷。首先,从 React 生成完整页面并不常见,我在 render 方法中看到了 htmlheadbody 标记。

其次,如果您要加载 React CDN 脚本 来自 React,那应该如何工作? :) 遇到这个错误真是个奇迹。

拥有一个带有基本 HTML 框架的 index.html。如果你在做服务器端渲染,有一个简单的模板来做同样的事情,并将你的 React 的服务器端渲染嵌入到 &lt;div id="app"&gt;&lt;/div&gt; 占位符中。

【讨论】:

  • 是的,我正在使用服务器端渲染,因此反应脚本应该在服务器返回渲染的整个页面时加载。我不明白为什么它不能与 CDN 一起使用,但如果我使用来自 Webpack 供应商块的反应,它将是一个通过 app.js 的脚本。所以它基本上是相同的设置。
  • 您很可能在routes 中使用的组件之一中缺少export default
猜你喜欢
  • 2016-02-28
  • 2018-02-11
  • 1970-01-01
  • 1970-01-01
  • 2020-04-25
  • 1970-01-01
  • 1970-01-01
  • 2020-06-15
  • 2015-12-07
相关资源
最近更新 更多