Проблема Express и Webpack: «Uncaught SyntaxError: Неожиданный токен <» - PullRequest
0 голосов
/ 25 сентября 2019

У меня проблемы с тестированием моей реагирующей веб-страницы, разработанной с использованием WebPack.Я пытаюсь запустить экспресс-сервер и получаю пустую страницу localhost с консольным сообщением Uncaught SyntaxError: Unexpected token <.Похоже, что веб-страница может найти мой файл index.html, который, в свою очередь, указывает на файл bundle.js, созданный webpack, но по какой-то причине мой файл bundle.js выглядит пустым, я полагаю?Это мой первый раз, когда я использую webpack, поэтому я все еще относительно новичок в этом.Ниже я опубликую изображения / фрагменты моей структуры каталогов, файла webpack.config.js, файла server.js и файла index.html.Заранее большое спасибо, снова я новичок в вебпаке, и я впервые пытаюсь развернуть его с помощью экспресс с вебпаком. Мое приложение реакции работает нормально, используя, кстати, webpack-dev-server, так что это не так.

Моя структура каталогов

структура каталогов

Мой webpack.config.js файл

const webpack = require('webpack');
const MomentLocalesPlugin = require('moment-locales-webpack-plugin');

module.exports = {
  entry: ['babel-polyfill','./src/index.js'],
  module: {
    rules: [
      {
        test: /\.(js|jsx)$/,
        exclude: /node_modules/,
        use: ['babel-loader']
      },
        {
            test: /\.(png|jp(e*)g|svg)$/,  
            use: [{
                loader: 'url-loader',
                options: { 
                    limit: 8000, // Convert images < 8kb to base64 strings
                    name: 'images/[hash]-[name].[ext]'
                } 
            }]
        },
        {
          test: /\.css$/,
          use: ['style-loader', 'css-loader']
        }
    ]
  },
  resolve: {
    extensions: ['*', '.js', '.jsx']
  },
  output: {
    path: __dirname + '/dist',
    publicPath: '/',
    filename: 'bundle.js'
  },
  plugins: [
    new webpack.HotModuleReplacementPlugin(),
    new MomentLocalesPlugin()
  ],
  devServer: {
    contentBase: './dist',
    hot: true
  }
};

Мой server.js файл

const express = require('express');
const path = require('path');
const port = process.env.PORT || 8080;
const app = express();


app.use(express.static(__dirname));


app.get('*', (req, res) => {
    res.sendFile(path.resolve(__dirname, 'index.html'));
});

app.listen(port, () => {
    console.log('listening on port ' + port);
    console.log(__dirname);
});

Мой index.html файл

<!DOCTYPE html>
<html>
  <head>
    <title>Hello Webpack</title>
  </head>
  <body>
    <div id='app'></div>
    <script src="/bundle.js"></script>
  </body>
</html>

Сетевые результаты Dev Tools

Сетевые результаты Chrome Dev Tools

EDIT

Мой server.js файл теперь редактируется, как показано ниже.Я получил первую ошибку, но теперь он не может найти мой файл bundle.js?Ниже я выложу изображение ошибки регистрации из моего терминала git bash.Консоль Chrome Dev Tools также выдает сообщение об ошибке 404.

const express = require('express');
const path = require('path');
const port = process.env.PORT || 8080;
const app = express();


app.use(express.static(__dirname));

app.get('*', (req, res) => {
    if (req.path.endsWith('bundle.js')) {
        res.sendFile(path.resolve(__dirname, 'bundle.js'));
    } else {
        res.sendFile(path.resolve(__dirname, 'index.html'));
    }
});




/*
app.get('*', (req, res) => {
    res.sendFile(path.resolve(__dirname, 'index.html'));
});
*/

app.listen(port, () => {
    console.log('listening on port ' + port);
    console.log(__dirname);
});

ошибка регистрации

Большое спасибо!

1 Ответ

0 голосов
/ 25 сентября 2019

Ваш server.js обслуживает index.html для всех запросов.

Это означает, что когда браузер запрашивает bundle.js, server.js возвращает index.html еще раз.Ошибка возникает из-за того, что браузер пытается проанализировать полученный HTML-код как код JavaScript.

Исправление

Ваш bundle.js, вероятно, не находится в той же папке, что и index.html, в противном случае Express будет его обслуживать(из-за линии app.use(express.static(__dirname));).

Так что дважды проверьте путь вашего bundle.js.Он должен быть на __dirname (а именно <code>${__dirname}/bundle.js).

На изображении, которое вы разместили, нет bundle.js в папке dist/ где index.html и server.js расположены.

Генерация bundle.js

Вы должны создать пакет.Вы говорите из комментариев , что ваши scripts:

"scripts": {
  "start": "webpack-dev-server --config ./webpack.config.js --mode development", 
  "test": "echo \"Error: no test specified\" && exit 1"
},

Чтобы сгенерировать пакет, вы должны добавить сценарий build и выполнить его.

Добавьте это в свой пакет).build.js теперь должен находиться в папке dist/.

Помните, что если вы когда-либо развернете его, вы должны взять и index.html, и bundle.js в одной папке, когда будете обслуживать его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...