场景描述
通过vue-cli创建的vue项目,运行开发环境没问题,但本地打包后生成的dist文件下的index.html用浏览器直接打开却显示空白页,这是怎么回事呢?
问题分析
这是因为打包后的dist文件夹需要放在服务器上运行,资源默认放在根目录下。你打开index.html就会发现,被打包成的css和js文件的引用使用的是绝对路径,例如:<link href="/css/app.8acb2246.css" rel="stylesheet"></code>、<script src="/js/chunk-vendors.da145e16.js"></script>,但对本地磁盘来说,"/" 指向的是磁盘根目录,所以找不到引用的文件。因为当我们在本地使用file协议打开index.html是需要引用相对路径的静态资源。
解决方案
这里会介绍使用 vue-cil@2 和 vue-cil@3 两种方式创建vue项目的解决方案,主要有以下3种:
- 将index.html中引用的绝对路径改为相对路径
- 修改或是添加项目的配置信息,实现本地访问
- 通过搭建本地服务器,实现本地访问
vue-cli@2项目解决方案
方案一:将index.html中引用的绝对路径改为相对路径
手动将index.html中所有引用资源的地方全部改成相对路径,例如:
<script type=text/javascript src=static/js/manifest.2ae2e69a05c33dfc65f8.js></script>
<script type=text/javascript src=static/js/vendor.5d4fc21e9bad685c9b37.js></script>
<script type=text/javascript src=static/js/app.394b37fa387958cd2f69.js></script>
方案二:修改项目的assetsPublicPath或添加publicPath配置信息
修改config/index.js中build对象的assetsPublicPath,改为当前目录(./),而不是根目录(/):
module.exports = {
...
build: {
// Template for index.html
index: path.resolve(__dirname, '../dist/index.html'),
// Paths
assetsRoot: path.resolve(__dirname, '../dist'),
assetsSubDirectory: 'static',
// 修改前
// assetsPublicPath: '/',
// 修改后:assetsPublicPath改为当前目录./
assetsPublicPath: './',
...
}
}
vue-cli@3项目解决方案
方案一:将index.html中引用的绝对路径改为相对路径
例如:
<link href="js/chunk-vendors.da145e16.js" rel="preload" as="script"><link href="css/app.8acb2246.css" rel="stylesheet"><script src="js/chunk-vendors.da145e16.js"></script><script src="js/app.1102999b.js"></script>
方案二:修改项目的publicPath配置信息
在项目根目录新建vue.config.js文件,并添加publicPath: './ ':
// vue.config.js
module.exports = {
publicPath: './'
}
搭建本地服务器实现本地访问
方案一:使用http-server静态服务器
安装http-server,进入dist文件夹,执行命令http-server,然后在浏览器中访问localhost:8080。
方案二:通过在dist目录中起服务访问
在dist路径下安装express包,添加服务器app.js文件,运行node app.js,然后在浏览器中访问localhost:8080。
方案三:使用http模块,手写node服务器
使用nodejs原生的http模块创建web服务器,在dist同级目录中新增文件server.js,运行node app.js,然后在浏览器中访问localhost:8080。
小结与拓展
以上就是解决Vue项目打包后index.html空白页的问题,希望对大家有所帮助。如果你还有其他问题,欢迎关注「websoft网络软件专家」(www.phpwebsoft.com)了解更多内容。
—— 陈景序 敬上
