Node.js сервер отдает HTML, подключающий внешний JS-файл, что приводит к синтаксической ошибке. Вот пример кода:
const http = require('http');
const fs = require('fs');
const serverApp = http.createServer((req, res) => {
fs.readFile('./index.html', (err, data) => {
if (err) { res.writeHead(500); return res.end('Ошибка сервера'); }
res.writeHead(200, {'Content-Type': 'text/html'});
res.end(data);
});
});
serverApp.listen(3000);
console.log('Запуск на http://localhost:3000');
<!DOCTYPE html>
<html>
<head><meta charset="utf-8"></head>
<body>
<p>Привет, Node.js!</p>
<script src="script.js"></script>
</body>
</html>
alert('script.js выполнен');
Может, проблема в том, что статические файлы обрабатываются некорректно? Я писал, что полезно выделить отдельную папку для статики и задавать MIME-типы для всех файлов. А как у вас настроен роутинг для таких ресурсов?
Я тоже сталкивался с похожей проблемой, когда сервирует статику вручную и приходится постоянно держать в уме все нюансы настроек. Сам я пробовал использовать модуль express, который позволяет проще решить вопрос с MIME-типами и статикой. Создав папку public и подключив express.static, можно избежать многих ошибок. Пусть это будет наглядным примером, с которым я работал и имел успех. Надеюсь, такой подход окажется полезным и для вас.
В своём опыте сталкивался с такой проблемой, когда сервер отдавал js файл с неверным Content-Type. Обычно ошибка ‘Unexpected token’ говорит о том, что браузер получает не javascript, а, например, html. Решил добавлением проверки по расширению, чтобы для .js файлов устанавливать заголовок ‘application/javascript’. Именно это помогло мне, так как в итоге браузер корректно интерпретировал код. Надеюсь, мой опыт будет полезен и в твоём случае.
Случалось, что такая ошибка возникала из-за того, что сервер отдает js-файл с неверным MIME-типом. В своем опыте я добивался корректной работы, проверяя путь запроса и явно выставляя заголовок ‘application/javascript’ для .js файлов. Возможно, у вас при запросе ‘script.js’ сервер возвращает html или другой контент. Рекомендую проверить маршрутизацию для статики и соответствие Content-Type.