Преобразователь JSX для React не работает. Не могу найти ошибку

ОБНОВЛЕНИЕ: я не могу в это поверить. После нескольких часов попыток использовать всевозможную магию gulp я не понимаю, это был отсутствующий закрывающий тег </script> в index.html для bundle.js

Я действительно озадачен этим. Я начал создавать приложение React.js, и я не хочу использовать преобразователь jsx на стороне HTML, а предварительно скомпилировать его! В настоящее время я делаю следующее:

    <script src="https://cdnjs.cloudflare.com/ajax/libs/babel-core/5.8.23/browser.js">
    </script>
    ....
    <script type="text/babel" src="build/bundle.js"/>

Это работает. Но когда я использую прекомпилятор через gulp/browserify/reactify/transform, он показывает пустую страницу при запуске сервера (WebStorm или BrowserSync). Я в замешательстве, потому что "bundle.js" - это обычный JavaScript - по крайней мере, я так думаю...? Весь синтаксис jsx был преобразован в JavaScript. Вот код gulpfile:

'use strict';

var watchify = require('watchify');
var browserify = require('browserify');
var gulp = require('gulp');
var source = require('vinyl-source-stream');
var buffer = require('vinyl-buffer');
var gutil = require('gulp-util');
var reactify = require('reactify');
var browserSync = require('browser-sync').create();
var babel = require('babel');
var libs = ['material-ui', 'react', 'react-tap-event-plugin'];

gulp.task('default', ['vendor', 'bundle', 'browser-sync']);

gulp.task('vendor', function () {
var b = browserify();

libs.forEach(function(lib) {
    b.require(lib);
});
return b.bundle()
    .pipe(source('vendor.js'))
    .pipe(gulp.dest('./build/'));
});

gulp.task('bundle', bundle);
var b = watchify(browserify('./components/app.jsx', watchify.args));
b.on('update', bundle);
b.transform(reactify);
b.on('log', gutil.log);

libs.forEach(function(lib) {
    b.external(lib);
});

function bundle() {
    return b.bundle()
        .on('error', gutil.log.bind(gutil, 'Browserify Error'))
        .pipe(source('bundle.js'))
        .pipe(buffer())
        .pipe(gulp.dest('./build/'));
};

gulp.task('browser-sync', function() {
    browserSync.init(["build/bundle.js", "css/*.css"],{
        server: {
            baseDir: "./"
        }
    });
});

И bundle.js:

http://pastebin.com/56ep1dT7

Полный index.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>learn react</title>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/babel-     core/5.8.23/browser.js"></script>
    <script src="build/vendor.js"></script>
    <link href='https://fonts.googleapis.com/css?family=Roboto:400,300,500'    rel='stylesheet' type='text/css'>
    <link rel="stylesheet" type="text/css" href="css/app.css"/>
</head>
<body>
    <div id="mountPoint"/>
    <script type="text/babel" src="build/bundle.js"/>
</body>

As you can see I load a vendor.js in the head tag of the index.html, which I guess is browsercompatible JavaScript as well.

В любом случае, я надеюсь, что предоставил всю необходимую информацию.


person Layos    schedule 06.09.2015    source источник


Ответы (1)


Используете ли вы настоящий синтаксис es6? потому что это была бы единственная причина для использования babel, но если вы уже предварительно компилируете все (при условии, что вы используете es6), заранее транспилируйте es6 с babel es5, поэтому вам нужно только загрузить bundle.js в браузере без использования какой-либо другой магии, вы в любом случае предварительно компилируются.

так что тогда вы можете просто избавиться от браузера Babel ‹ --- это ничего не даст, потому что я не вижу синтаксиса es6 в вашем коде.

-  so try using a normal scripttag if you arent using es6
-  if you are using es6 add the babel process to the gulp task
-  remove babel-browser completely ,u don't want to do that within the client on page load anyway,  it will decrease performance (just precompile)

на самом деле вы уже требуете babel для своей gulptask, но не используете его :)

person Danillo Felixdaal    schedule 06.09.2015
comment
Babel кажется новым и единственным поддерживаемым способом переноса jsx в браузере, согласно официальной странице reacts. Кстати, я нашел ошибку, это был отсутствующий закрывающий тег скрипта. такая ошибка новичка. - person Layos; 06.09.2015
comment
Да, я больше не использую тег babel. сейчас я успешно прекомпилирую. у меня была пустая страница без закрывающего тега скрипта. Что касается реакции: зачем менять порядок? и какой порядок? реагировать перед обвязкой? - person Layos; 06.09.2015
comment
@ danillo2k, reactify устаревает в пользу Babel. - person Brigand; 06.09.2015
comment
Я до сих пор не понимаю проблемы с порядком реактивации и комплектации. я связываю так: pastebin.com/5kXa8kie, и все работает нормально! - person Layos; 06.09.2015
comment
да, я неправильно прочитал, и я не правильно посмотрел на ваш pastebin, он уже был предварительно скомпилирован :) (здесь еще рано: P) вам просто нужно было удалить тег сценария babel, как и вы, после того, как вы исправили свою проблему, так что на самом деле вы ответили на свой собственный вопрос мой плохой :), но @FakeRainBrigand прав насчет реакции :) - в любом случае рад, что ты решил это - person Danillo Felixdaal; 06.09.2015