Импорт React в Node.js выдает SyntaxError: Неожиданный экспорт токена

Я пытаюсь реализовать SSR с помощью Node.js и React, следуя этому примеру https://github.com/babel/example-node-server, как указано в официальной документации Babel здесь http://babeljs.io/docs/usage/cli/#babel-node

Для разработки я использую babel-node; для производства я хочу транспилировать свой сервер с помощью babel и запустить его с помощью node:

пакет.json

"scripts": {
  "start": "node ./dist/server/index.js",
  "dev:server": "nodemon ./src/server/index.js -x babel-node",
  "build:server": "babel ./src/server -d ./dist/server --copy-files -s inline"
},
"babel": {
  "presets": [
    "env",
    "react",
    "stage-2"
  ],
  "plugins": [
    "transform-decorators-legacy"
  ]
}

Сервер написан с синтаксисом ES6:

источник/сервер/index.js

import 'babel-polyfill'
import './config'
import Express from 'express'
import bootstrap from './bootstrap'

const app = Express()
bootstrap(app)

export default app

Затем в каком-то маршруте я импортирую свои компоненты React, чтобы отображать их в HTML по запросу:

источник/сервер/маршруты/admin.js

import { Router } from 'express'
import React from 'react'
import createHistory from 'history/createMemoryHistory'
import { renderToString } from 'react-dom/server'
import { Provider } from 'react-redux'
import { StaticRouter, matchPath } from 'react-router'
import configureStore from '../../../src/admin/store'
import routes from '../../../src/admin/routes'
import Root from '../../../src/admin/containers/Root'
// etc.

Ошибка возникает, когда сервер пытается импортировать компоненты React.

./src/admin/store/index.js:11
export default configureStore
^^^^^^

SyntaxError: Unexpected token export

Я пытался использовать babel-register на сервере, и это работает, но не рекомендуется использовать его в рабочем режиме, поэтому я бы не стал этого делать.

Кроме того, при проверке кода встроенного сервера я обнаружил:

расстояние/сервер/маршруты/admin.js

var _store = require('../../../src/admin/store');

Это означает, что он по-прежнему ссылается на папку src. В идеале я хотел бы каким-то образом включить эти модули в код встроенного сервера, чтобы я мог безопасно удалить папку src из производственной среды, оставив только dist.

Редактировать

Отличается от интерфейса командной строки Babel 6: неожиданный экспорт токена?


person Anton Egorov    schedule 05.07.2017    source источник


Ответы (1)


Это потому, что вы транспилируете только ./src/server, а не ./src/admin. Затем в ./src/server у вас есть ключевое слово export, не переведенное Babel, а ключевое слово export не поддерживается Node — чтобы понять, почему, см. эти ответы:

Вам нужно транспилировать весь код, использующий синтаксис, который изначально не поддерживается Node, а не только его часть.

Добавление такого сценария в ваш package.json может помочь, в зависимости от того, как организованы ваши ./src и ./dist:

"build:all": "babel ./src -d ./dist --copy-files -s inline"

Конечно, не зная, что у вас есть в ./src, кроме server и admin, трудно дать вам конкретное решение, но это хорошее направление для начала.

person rsp    schedule 05.07.2017
comment
Спасибо, именно то, что мне не хватало в моей конфигурации. В ./src есть server, две точки входа (одна для client и одна для admin) и styles, поэтому я также добавил --ignore ./src/styles в команду сборки. Работает как шарм ???? - person Anton Egorov; 05.07.2017