После некоторого исследования преимуществ изоморфных/универсальных приложений javascript и рендеринга на стороне сервера, я решил использовать его в проекте.Не удается найти переменную на стороне реакции на стороне клиента
Я использую Express.js и React.js для обеспечения рендеринга на стороне сервера и на стороне клиента.
Одна проблема, с которой я столкнулся недавно, - это мой браузер. Javascript не может найти переменную React, которая является компонентом React. Он дает сообщение об ошибке известного ReferenceError: Can't find variable: QuestionBox
.
Этот компонент реагирует определяется в questionbox.js
и этот файл используется для серверной стороне после transpiled по babel
в Node.js и для стороны клиента после оказания browserify
ред и rectify
ред в gulp
задачи.
Что может быть здесь, здесь мне не хватает? Это может быть обработанный gulp преобразованный файл, который загружается браузером тегом скрипта. The full code is in this gist.
questionbox.js
:
var React = require('react');
var marked = require('marked');
/*
-QuestionBox
-QuestionList
-Question
*/
var Question = React.createClass({//Omitted here for simplicity: https://gist.github.com/isikfsc/b19ccb5e396fd57693d2f5b876ea20a0});
var QuestionList = React.createClass({//Omitted here for simplicity: https://gist.github.com/isikfsc/b19ccb5e396fd57693d2f5b876ea20a0});
var QuestionBox = React.createClass({
loadQuestionsFromServer: function() {
return true;
},
getInitialState: function() {
return {data: []};
},
componentWillMount: function() {
this.loadQuestionsFromServer();
setInterval(this.loadQuestionsFromServer, this.props.pollInterval);
},
render: function() {
return (
<div className="questionBox">
<h1>Questions</h1>
<QuestionList data={this.state.data} />
</div>
);
}
});
module.exports.QuestionBox = QuestionBox;
gulpfile.js
:
var gulp = require('gulp');
var browserify = require('browserify');
var watchify = require('watchify');
var source = require('vinyl-source-stream');
var reactify = require('reactify');
var production = process.env.NODE_ENV === 'production';
function scripts(watch) {
var bundler, rebundle;
bundler = browserify('src/components/questionbox.js', {
basedir: __dirname,
debug: !production,
cache: {}, // required for watchify
packageCache: {}, // required for watchify
fullPaths: watch // required to be true only for watchify
});
if(watch) {
bundler = watchify(bundler)
}
bundler.transform(reactify);
rebundle = function() {
var stream = bundler.bundle();
//stream.on('error', handleError('Browserify'));
stream = stream.pipe(source('bundle.js'));
return stream.pipe(gulp.dest('./dist/components'));
};
bundler.on('update', rebundle);
return rebundle();
}
gulp.task('watchScripts', function() {
gulp.watch('./src/components/*.js', ['scripts']);
});
gulp.task('scripts', function() {
return scripts(false);
});
gulp.task('watchScripts', function() {
return scripts(true);
});
Возможно, это так, как вы экспортируете? aka 'module.exports = QuestionBox;' вместо 'module.exports.QuestionBox = QuestionBox;' может стоить попробовать –
Я пытаюсь это прямо сейчас. –
Я пробовал это, и теперь у меня появилось долгое сообщение об ошибке: 'Invariant Violation: Тип элемента недействителен: ожидается строка (для встроенных компонентов) или класс/функция (для составных компонентов), но получила: undefined. at инвариант (/Users/isik/Dev/atelye/mt/node_modules/fbjs/lib/invariant.js:38:15) at instantiateReactComponent (/ Пользователи/isik/Dev/atelye/mt/node_modules/response/lib/instantiateReactComponent.js: 66: 134) по адресу /Users/isik/Dev/atelye/mit/node_modules/react/lib/ReactServerRendering.js:37:31 at ReactServerRenderingTransaction.Mixin.perform ... '... –