小能豆

Uncaught SyntaxError: Unexpected token '<' 报错,页面停留时间久了 ,就白屏了,这个怎么解决

javascript

Uncaught SyntaxError: Unexpected token ‘<’ 报错,页面停留时间久了 ,就白屏了,这个怎么解决


阅读 45

收藏
2024-06-23

共1个答案

小能豆

Uncaught SyntaxError: Unexpected token '<' 错误通常表明您的应用程序试图解析一个非 JavaScript 文件作为 JavaScript 文件,通常是因为找不到请求的资源。这个错误经常发生在使用 React Router 或其他 SPA(单页应用程序)框架时,刷新或直接访问一个路径导致服务器未正确处理该路径。

原因及解决方法

  1. 服务器配置问题
  2. 当用户直接访问非根路径(如 /about)时,服务器没有正确返回 index.html 文件,而是返回了 404 页面或其他 HTML 文件。这会导致浏览器试图解析 HTML 文件作为 JavaScript 文件,从而报错。

  3. webpack-dev-server 配置问题

  4. 如果使用 webpack-dev-server,确保其配置正确以处理所有路由。

解决方案

1. 配置服务器以支持单页应用程序

如果您使用的是 Express.js 服务器,确保配置如下:

const express = require('express');
const path = require('path');
const app = express();

// Serve static files from the React app
app.use(express.static(path.join(__dirname, 'public')));

// The "catchall" handler: for any request that doesn't match the above, send back index.html
app.get('*', (req, res) => {
  res.sendFile(path.join(__dirname, 'public', 'index.html'));
});

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
  console.log(`Server is running on port ${PORT}`);
});

2. 配置 webpack-dev-server

确保 webpack-dev-server 配置正确处理所有路由:

const webpack = require('webpack');
const WebpackDevServer = require('webpack-dev-server');
const path = require('path');
const config = require('./webpack.config.js');

const compiler = webpack(config);
const server = new WebpackDevServer(compiler, {
  contentBase: path.join(__dirname, 'public'),
  historyApiFallback: true,  // This is the key line
  proxy: {
    '/graphql': `http://localhost:${GRAPHQL_PORT}`
  },
  publicPath: '/js/',
  stats: { colors: true },
});

server.listen(3000, 'localhost', () => {
  console.log('webpack-dev-server is running on port 3000');
});

3. 检查 webpack 配置

确保 webpack 配置中的 output.publicPath 设置正确:

const path = require('path');

module.exports = {
  entry: ['whatwg-fetch', path.resolve(__dirname, 'js', 'app.js')],
  module: {
    rules: [
      {
        exclude: /node_modules/,
        test: /\.js$/,
        use: 'babel-loader',
      },
    ],
  },
  output: {
    filename: 'app.js',
    path: path.resolve(__dirname, 'public', 'js'),  // Ensure this points to the correct directory
    publicPath: '/js/',
  },
  devServer: {
    contentBase: path.join(__dirname, 'public'),
    historyApiFallback: true,  // This is the key line
  },
};

总结

通过正确配置服务器和 webpack-dev-server,可以确保所有非根路径请求都返回 index.html 文件,从而避免 Uncaught SyntaxError: Unexpected token '<' 错误。这对使用 React Router 的单页应用程序尤其重要。通过这些配置,您的应用程序将能够正确处理刷新和直接访问任意路径。

2024-06-23