Сборка Create-React-App - "Uncaught SyntaxError: Неожиданный токен <"
Я понимаю, что этот вопрос задавался несколько раз, но у меня ничего не получалось...
Я пытаюсь создать статическую сборку create-react-app
проект, но я получаю следующие ошибки:
Uncaught SyntaxError: Unexpected token < 1.ca81c833.chunk.js:1
Uncaught SyntaxError: Unexpected token < main.7ced8661.chunk.js:1
Из-за того, что эти файлы минимизированы, я не уверен, с чего начать их отладку.
Для других ответов SO, вот некоторые вещи, которые я пробовал:
//Original index.html file, which gets included in the built file:
<script type="text/babel" src="https://cdnjs.cloudflare.com/ajax/libs/babel-core/5.8.24/browser.min.js"></script>
//package.json
"babel-preset-es2015": "^6.24.1",
"babel-preset-react": "^6.24.1",
//.babelrc file
{
"presets": ["react", "es2015", "stage-1"]
}
Не уверен, что это актуально, но у меня есть это на моем экспресс-сервере, который я считаю стандартным:
if (process.env.NODE_ENV === "production") {
app.use(express.static('client/built'));
app.get("*", (req, res) => {
res.sendFile(require('path')
.resolve(__dirname, 'client', 'build', 'index.html'));
})
}
Предполагая, что это на самом деле проблема JSX, все это очень запутанно - не должно create-react-app
обрабатывать JSX автоматически?
ОБНОВЛЕНИЕ: я только что отправил этот вопрос, но уже есть соответствующее обновление. Я могу обслуживать страницу статически через pm2, запустив pm2 serve build
поэтому я думаю, что проблема может быть с моей конфигурацией сервера.
12 ответов
Спасибо, это мне очень помогло. Просто хочу добавить к этому пример из проекта Create-React-App, у которого было то же решение: я получил ту же ошибку после развертывания на heroku.
Uncaught SyntaxError: Неожиданный токен <после сборки serve -s
Для меня проблема была в файле packages.json. Параметр "homepage", который я дал, был неверным. Изменение правильного URL героя решило проблему.
"homepage": "https://myapp.herokuapp.com/"
Надеюсь, это дополнение полезно.
В итоге я нашел ответ здесь: https://github.com/facebook/create-react-app/issues/1812
Я обрезал полное решение сверху, но я изменил:
app.use(express.static('client/build'));
app.get("*", (req, res) => {
res.sendFile(require('path')
.resolve(__dirname, 'client', 'build', 'index.html'));
})
чтобы:
const root = require('path').join(__dirname, 'client', 'build')
app.use(express.static(root));
app.get("*", (req, res) => {
res.sendFile('index.html', { root });
})
Мне определенно немного странно, что первый блок не работал. Я предполагаю, что это как-то связано с относительными ссылками в моем проекте React, так как я получаю index.html
файл доставлен в браузер, несмотря на получение ошибки. Возможно, полностью статический файл будет работать с первым блоком, но мне было бы интересно узнать, верно ли это.
Просто удали
"домашняя страница": "URL вашего приложения"
из package.json, чтобы исправить это
Просто чтобы добавить к ответу @Shashwat Gupta. Удалить"homepage": "app-url"
из package.json. Отсутствиеhomepage
в package.json будет предполагать, что он будет размещен в корне сервера, или вы будете обслуживать сборку с serve -s build
.
Вы можете увидеть ниже изображение сообщений сборки после удаления homepage
.
сборка пряжи
Выход
И да, указав homepage
будет полезно, когда вы собираетесь развернуть приложение в подкаталоге корня сервера.
Я создал версию сборки приложения React, используя "npm run build". Имею сервер (узел / экспресс). Я хотел включить сборку на стороне сервера и развернуть ее на heroku. Я скопировал папку сборки в корневую папку сервера и использовал код в файле запуска на стороне сервера:
app.get('/*', function (req, res, next) {
if (!req.path.includes('api'))
res.sendFile(path.join(__dirname, 'build', 'index.html'));
else next();
});
Я получал ту же ошибку. Поэтому я просто установил путь для статического содержимого при запуске:
var app = express();
//here below
app.use(express.static(path.join(__dirname, 'build')));
И мой статический index.html работал нормально и смог найти ресурсы css и js.
Я столкнулся с той же проблемой при развертывании моей реактивной сборки в производственной среде. Потратив часы на то, чтобы выяснить, что пошло не так с ранее работающим кодом, я выяснил ошибку, которую допустил при развертывании.
Я не копировал папку static
внутри build
на сервер, потому что я использовал scp build/*
скопировать папку сборки вместо scp -r build/*
.
Я понимаю, что это не точный ответ на заданный здесь вопрос. Но я перепробовал почти все возможные варианты из ответов, данных здесь экспертами, прежде чем заметил ошибку, которую делал. Следовательно, добавляем это здесь как указатель на всех, кто сталкивается с подобной проблемой, чтобы также проверить шаги развертывания.
Возникла та же проблема, когда я хочу развернуть статическую сборку create-react-app
проект на мой Linux-сервер.
Я решил эту проблему, прокомментировав cra's github и официальный документ cra о том, как развернуть производственную сборку.
Например:
Я хочу разместить веб-сайт производственной сборки примерно как http://example.com/foo/bar.
Когда я выполняю развертывание без изменения каких-либо настроек по умолчанию, я получаю сообщение об ошибке "Uncaught SyntaxError: Unexpected token <", и на экране ничего не отображается.
Вот решение:
1) Добавьте параметр домашней страницы в свой package.json.
+ "homepage": "/foo/bar"
2) Добавьте "/foo/bar" ко всем вашим статическим ресурсам в css, что будет примерно таким:
.dummyimage {
- content: url('/dummyimage.jpg');
+ content: url('/foo/bar/dummyimage.jpg');
}
3) Добавьте "/foo/bar" ко всем своим ссылкам и маршрутам.
- linkTo: '/contact'
+ linkTo: '/foo/bar/contact'
4) Немного изменив код вашей программы обслуживания, в node.js/express это будет примерно так:
- app.use(express.static(path.join(__dirname, '/build')));
+ app.use('/foo/bar/', express.static(path.join(__dirname, '/build')));
5) Строим заново.
6) Развернуть сборку / на сервер.
7) Перезапустите свою программу подачи, например node.js/express.
Задача решена!!
Надеюсь, это решение поможет.
Просто удалите домашнюю страницу в
package.json
а также не забудьте удалить
basename
в
BrowserRouter
, если вы используете реагирующий маршрутизатор.
Вот и все. Это работает
Поскольку большинство из нас уже предложили удалить свойство домашней страницы из package.json
Позвольте мне объяснить, почему это сработало в моем случае:
Ранее я настроил свой проект для размещения на страницах Github, и в результате для свойства домашней страницы было установлено что-то вроде «https://shubhamshd.github.io/supplyChainApp».
Однако, поскольку на Github-страницах есть известные навигационные ошибки, в основном связанные с пакетом BrowserRouter, мне пришлось переключиться на другие платформы хостинга.
И поскольку я забыл удалить свойство домашней страницы, развертывание не работало ни на одной из платформ, таких как Vercel или Netlify.
После долгих часов поиска и проб я, наконец, наткнулся на эту ветку, в частности на @ user7765900 , и, наконец, мне удалось решить ее, удалив нежелательное свойство домашней страницы.
Я столкнулся с той же проблемой, когда хочу развернуть свое приложение для реагирования на github-pages: - необходимо следовать нескольким рекомендациям
Имя репозитория должно быть маленьким последним
Если имя проекта совпадает с именем репо, это полезно
addd { "predploy": "npm run build", "deploy": "gh-pages -d build" } в package.json
добавить скрипт домашней страницы в начало package.json
{"домашняя страница": "http://[Имя пользователя].github.io/[reponame]", "name": "-", "version": "-", "private": boolean, }
Эта ошибка возникает, когда вы пытаетесь развернуть приложение из корневого подкаталога сервера. Вы можете устранить ошибку, выполнив следующие действия.
По умолчанию Create React App создает сборку, предполагая, что ваше приложение размещено в корневом каталоге сервера. Чтобы переопределить это, укажите домашнюю страницу в своем
package.json
. Это позволит Create React App правильно определить корневой путь для использования в сгенерированном HTML-файле."homepage": "abc/",
Измените имя базового маршрута, если вы обслуживаете приложение из подкаталога.
<BrowserRouter basename={"/abc"}> <Routes/> </BrowserRouter>
Если вы используете сервер Nginx, вам нужно указать местоположение следующим образом:
location /abc { alias /build-folder-path; try_files $uri /$uri /abc/index.html; }
NB: abc — это имя подкаталога/имя подмаршрута.
Если вы развертываете свой клиент на S3, при развертывании с помощью response-deploy-s3 назначьте идентификатор распространения из CloudFront
react-deploy-s3 deploy \
--access-key-id XXXXXXXXXXXXXXXXX \
--secret-access-key XXXXXXXXXXXXXXXXXXXXXXXX \
--bucket XXXXXXX \
--regionus-east-1 \
--distribution-id XXXXXXXXXXXXX <---