【问题标题】:require not defined error on bundled JS reactjs捆绑JS中需要未定义的错误反应js
【发布时间】:2016-07-15 10:38:57
【问题描述】:

我是 Django 和 ReactJS 的新手,正在尝试使用本教程将简单的 JSX 代码编译为 JS:http://geezhawk.github.io/2016/02/02/using-react-with-django-rest-framework.html 没用,所以我使用npm run dev 编译,现在它可以工作但在浏览器控制台中出现错误:未捕获的ReferenceError:未定义反应 这是我的 webpack.config.js

    var path = require('path');
var webpack = require('webpack');
var BundleTracker = require('webpack-bundle-tracker');
var nodeExternals = require('webpack-node-externals');


module.exports = {
    //the base directory (absolute path) for resolving the entry option
    context: __dirname,
    //the entry point we created earlier. Note that './' means
    //your current directory. You don't have to specify the extension  now,
    //because you will specify extensions later in the `resolve` section
    entry: './assets/js/index',

    output: {
        //where you want your compiled bundle to be stored
        path: path.resolve('./assets/bundles/'),
        //naming convention webpack should use for your files
        filename: '[name]-[hash].js',
    },
    target: 'node', // in order to ignore built-in modules like path, fs, etc.
    externals: {
    react: 'react'
}, // in order to ignore all modules in node_modules folder

    plugins: [
        //tells webpack where to store data about your bundles.
        new BundleTracker({filename: './webpack-stats.json'}),
        //makes jQuery available in every module
        new webpack.ProvidePlugin({
            //React: "react",
            $: 'jquery',
            jQuery: 'jquery',
            'window.jQuery': 'jquery'
        })
    ],

    module: {
        loaders: [
            //a regexp that tells webpack use the following loaders on all
            //.js and .jsx files
            {test: /\.jsx?$/,
                //we definitely don't want babel to transpile all the files in
                //node_modules. That would take a long time.
                /*exclude: /node_modules/,*/
                //use the babel loader
                loader: 'babel-loader',
                query: {
                    //specify that we will be dealing with React code
                    presets: ['react']
                }
            }
        ]
    },

    resolve: {
        //tells webpack where to look for modules
        modulesDirectories: ['node_modules'],
        //extensions that should be used to resolve modules
        extensions: ['', '.js', '.jsx']
     }
    }

还有 assets/bundles/index.js

    var React = require('react')
    var ReactDOM = require('react-dom')
    //snaha//
    var BooksList = React.createClass({
    loadBooksFromServer: function(){
        console.log(123454657);
        $.ajax({
            url: this.props.url,
            datatype: 'json',
            cache: false,
            success: function(data) {
                this.setState({data: data});
            }.bind(this)
        })
    },

    getInitialState: function() {
        return {data: []};
    },

    componentDidMount: function() {
        this.loadBooksFromServer();
        setInterval(this.loadBooksFromServer,
                    this.props.pollInterval)
    },
    render: function() {
        if (this.state.data) {
            console.log('DATA!')
            var bookNodes = this.state.data.map(function(book){
                return <li> {book.title} </li>
            })
        }
        return (
            <div>
                <h1>Hello React!</h1>
                <ul>
                    {bookNodes}
                </ul>
            </div>
        )
      }
   })

     ReactDOM.render(<BooksList url='/api/' pollInterval={1000} />,
    document.getElementById('container'))

还有templates/body.html

    {% load render_bundle from webpack_loader %}
    <!doctype html>
    <html>
    <head>
     <script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.14.7/react-with-addons.js"></script>
   <script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.14.7/react-dom.js"></script>
     <meta charset="UTF-8">
     <title>Hello React
        {% block content %}
            {{ id }}
        {% endblock %}
     </title>
      </head>
      <body>
     <div id="container"></div>
      {% render_bundle 'main' %}
      </body>
      </html>

我缺少什么吗? here is my Django project structure

【问题讨论】:

    标签: javascript django reactjs npm react-jsx


    【解决方案1】:

    我终于解决了! 问题是:它试图在浏览器上的 React.js 提供变量 React 的地方获得变量反应! 所以我简单地将 webpack.config.js 的外部更改为

        externals: {
        React: 'react'
    },
    

    解决了问题!

    面临的下一个问题:

    “未定义进程”

    解决方案:添加

    var env = process.env.WEBPACK_ENV;
    

    到 webpack.config.js 的顶部 和

    new webpack.DefinePlugin({
      'process.env.NODE_ENV': '"production"'
    }),
         new webpack.DefinePlugin({
      'process.env': {
        'NODE_ENV': '"production"'
      }
    })
    

    进入model.export的插件部分

    所以最终的 webpack.config.js 将是:

        var path = require('path');
    var webpack = require('webpack');
    var BundleTracker = require('webpack-bundle-tracker');
    var nodeExternals = require('webpack-node-externals');
    var env = process.env.WEBPACK_ENV;
    
    
    module.exports = {
        //the base directory (absolute path) for resolving the entry option
        context: __dirname,
        //the entry point we created earlier. Note that './' means
        //your current directory. You don't have to specify the extension  now,
        //because you will specify extensions later in the `resolve` section
        entry: './assets/js/index',
    
        output: {
            //where you want your compiled bundle to be stored
            path: path.resolve('./assets/bundles/'),
            //naming convention webpack should use for your files
            filename: '[name]-[hash].js',
        },
        target: 'node', // in order to ignore built-in modules like path, fs, etc.
        externals: {
        React: 'react'
    }, // in order to ignore all modules in node_modules folder
    
        plugins: [
            //tells webpack where to store data about your bundles.
            new BundleTracker({filename: './webpack-stats.json'}),
            //makes jQuery available in every module
            new webpack.ProvidePlugin({
                //React: "react",
                $: 'jquery',
                jQuery: 'jquery',
                'window.jQuery': 'jquery'
            }),
             new webpack.DefinePlugin({
          'process.env.NODE_ENV': '"production"'
        }),
             new webpack.DefinePlugin({
          'process.env': {
            'NODE_ENV': '"production"'
          }
        })
        ],
    
        module: {
            loaders: [
                //a regexp that tells webpack use the following loaders on all
                //.js and .jsx files
                {test: /\.jsx?$/,
                    //we definitely don't want babel to transpile all the files in
                    //node_modules. That would take a long time.
                    /*exclude: /node_modules/,*/
                    //use the babel loader
                    loader: 'babel-loader',
                    query: {
                        //specify that we will be dealing with React code
                        presets: ['react']
                    }
                }
            ]
        },
    
        resolve: {
            //tells webpack where to look for modules
            modulesDirectories: ['node_modules'],
            //extensions that should be used to resolve modules
            extensions: ['', '.js', '.jsx']
        }
    }
    

    现在享受 React!快乐编码:-)

    【讨论】:

    • 天哪,这是一次痛苦的经历...颠倒 externals 属性的顺序也解决了我的 module not defined 问题,当通过 &lt;script&gt; 单独加载库时
    【解决方案2】:

    你能看看你是否安装了所有的要求。

    查看 package.json。如果您确实运行,您应该已经在需求中注明了反应。

    npm install
    

    如果没有,请运行

    npm install react --save
    

    ps:在我的选项中,如果您正在运行 Webpack,请尝试将 babel 添加到 Webpack 预设并在 ES2015 规范中编写 javascript。

    【讨论】:

    • 是的,npm 在那里,react 也在那里。你能给我一份关于weback、babel、es2015等的清晰文档吗?目前我对所有这些都不干净。
    猜你喜欢
    • 2017-01-15
    • 1970-01-01
    • 2018-07-14
    • 1970-01-01
    • 1970-01-01
    • 2020-08-24
    • 1970-01-01
    • 1970-01-01
    • 2011-08-03
    相关资源
    最近更新 更多