【发布时间】:2016-03-24 14:57:46
【问题描述】:
Github repo 包含所有内容:https://github.com/b-paul/react-lifecycle
12/18 更新:很大一部分问题是用于运行项目的 npm 命令。我注意到npm build 没有成功,但npm start 报告构建正常。下面是关于为什么没有按预期工作的完整答案。这个问题的其余部分留给后代。
我的第一个 webpack 项目的基本设置有问题。我正在使用 React 和 Babel,以及以下 webpack.config.js:
var path = require('path');
module.exports = {
entry: [ path.resolve('./js/app.js'),
'webpack-dev-server/client?http://localhost:8080' ],
output: {
path: path.resolve('./js/build'),
filename: 'app.min.js'
},
module: {
loaders: [
{ test: /\.jsx?$/,
loader: 'babel',
query: {
presets: ['react', 'stage-1', 'es2015']
},
include: path.resolve('js/') } ]
},
devtool: 'source-map'
};
js/app.js
import Lifecycle from './components/lifecycle';
import React from 'react';
import {render} from 'react-dom';
var shell = document.createElement('div');
shell.className = 'app-shell';
document.body.appendChild(shell);
render(<Lifecycle />, shell);
js/components/lifecycle.js
import React from 'react';
class Lifecycle extends React.Component {
render() {
return (
<div>Hello, world</div>
);
}
}
export default Lifecycle;
上面的构建没有错误,但它不会呈现“Hello, world”。我收到错误消息:“不变违规:元素类型无效:需要字符串(对于内置组件)或类/函数(对于复合组件),但得到:未定义。”在浏览器控制台中。
我可以追踪到一些生成的 babel 代码,它试图检查我的模块 Lifecycle 是否是 ES6 模块(babel 识别它是这样的)并期望它在内部模块对象上有一个属性 default (它没有)。这是生成的代码:
/* 0 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
var _lifecycle = __webpack_require__(1);
var _lifecycle2 = _interopRequireDefault(_lifecycle);
var _react = __webpack_require__(2);
var _react2 = _interopRequireDefault(_react);
var _reactDom = __webpack_require__(159);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
(0, _reactDom.render)(_react2.default.createElement(_lifecycle2.default, null), document.body);
/***/ }
最后说明:我多次引用https://github.com/code0wl/react-example-es2015 进行设置,我可以克隆该示例存储库并将其构建到一个正常工作的应用程序中,没有任何问题。我意识到我一定错过了该回购中发生的一些重要部分,但我看不到它。
【问题讨论】:
标签: reactjs ecmascript-6 webpack babeljs