# Vue Script Static file Uncaught SyntaxError

Vue Script Static file Uncaught SyntaxError: Unexpected token <

# 背景

Vue 项目 index.html 中的 script 标签引用 static 目录下的文件时报错

Uncaught SyntaxError: Unexpected token <

# 先贴一下代码:

<body>
  <div id="app"></div>

  <script src="https://unpkg.com/element-ui/lib/index.js"></script>
  <script src="./static/moment.min.js"></script>

  <!-- built files will be auto injected -->
</body>

# 分析

额,其实如果不看上面那个报错的话,还能直接发现一个很明显的问题,就是我引用的 moment.min.js 路径写错了。但是在实际的开发过程中,竟然没有报 404 not found , 于是就没有注意到这个低级错误。

# 排错

事后诸葛亮,我们还是来看一下,这个问题的排查过程。

点击控制台报错的详情,进入 Source E ... 看起来还是一个很头疼的问题呢,看Source 没用。点击 Network 看看吧:

咦... 怎么没有内容显示出来。因为手贱,其实我已经将这些 build 之后的文件都发到服务器上去了。我们看看访问服务器上页面的 Network

震惊了竟然出现了 nginx 画面之后,我懂了。因为服务器上的静态资源是通过nginx 来路由的,针对没有路由到的文件(因为我还没有做专门的 error.html)就会显示这个初始的 nginx welcome page 。于是我想到了肯定是因为路径写错啦!

# 事后分析

那么到底为什么,因为路径写错了,就显示了

打开 dist 文件夹中的 index.html 文件:

这里的 html 标签不写双引号是 HTML5 的一个特性。如果是 HTML5 以前的版本,标准写法是需要加双引号的。不过还是加上吧,感觉这不是一个好的规范,忽略即可。

script 标签将去请求 src= 后面跟随的路径的返回结果(一般是 js 的代码块),填充到 script 标签内。想一想下面两个script 标签:

而实际去请求 http://localhost:8080/static/js/moment.min.js 这个地址返回的是一段 html 代码,也就是

下面来模仿一下这个 err, 你自己也可以试试: 再访问一下这个页面,你就会看到同样的错误了。

# 最后

是个小问题,但是背后的原理一细想,还是有很多的,我们要知道为什么错了,以及要多一点寻找根本的耐心。

Happy Coding!