You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask静态托管编译后Vue应用无法渲染报JS错误如何解决

问题原因

出现Unexpected token '<'报错的核心原因是你定义的通配路由覆盖了Flask默认的静态资源处理逻辑:所有请求(包括请求js/、css/目录下的脚本、样式资源)都会被catch_all逻辑拦截,统一返回index.html的HTML内容。浏览器把HTML文本(第一行就是<开头的DOCTYPE标签)当作JS脚本解析,自然抛出语法错误。虽然请求都返回200状态码,但响应内容根本不是浏览器预期的资源文件。

修复方法

调整通配路由的逻辑:优先匹配真实存在的静态资源,只有当请求路径找不到对应静态文件时(也就是前端路由跳转的路径),才返回index.html交给Vue的前端路由处理,也就是SPA应用History模式必需的路由回退逻辑。
同时建议用绝对路径定位dist目录,避免因为脚本启动目录不同导致的路径解析错误。

修改后的server/server.py代码如下:

from flask import Flask, send_from_directory
import os

# 基于当前server.py的位置计算绝对路径,不受启动目录影响
BASE_DIR = os.path.abspath(os.path.dirname(__file__))
VUE_DIST_PATH = os.path.normpath(os.path.join(BASE_DIR, '../client/dist'))

app = Flask(
    __name__,
    static_folder=VUE_DIST_PATH,
    static_url_path=''  # 静态资源路径根和站点根对齐,匹配Vue打包的资源引用路径
)

@app.route('/', defaults={'path': ''})
@app.route('/<path:path>')
def spa_fallback(path):
    # 检查请求路径是否对应dist目录下的真实文件
    target_file = os.path.join(VUE_DIST_PATH, path)
    if path and os.path.isfile(target_file):
        # 是静态资源,直接返回对应文件
        return send_from_directory(VUE_DIST_PATH, path)
    # 非静态资源请求,统一返回入口HTML
    return send_from_directory(VUE_DIST_PATH, 'index.html')

if __name__ == '__main__':
    app.run(host='localhost', port=8000, debug=True)
注意事项
  • 如果Vue打包时在vue.config.js里自定义了publicPath配置,需要保证Flask的static_url_path和该配置值匹配,默认publicPath: '/'的场景下上述代码可直接运行。
  • 重启Flask服务后验证:访问js资源路径时,响应内容为正常的JS代码,响应头Content-Type为application/javascript,即可正常渲染应用。

内容的提问来源于stack exchange,提问作者enys

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 12:57:21