解决vue路由History mode打包代码后,上线服务器后白屏问题及关于每次点击链接都要刷新页面的问题
vue项目打包上线以后出现白屏的情况第一种情况:由于把路由模式mode设置成history了,默认是hash。在项目开始的时候就设置了这个,然后一直没找到问题所在,后面百度了好久才发现是这个问题解决方法:路由里边router/index.js路由配置里边默认模式是hash,如果你改成了history模式的话,打开也会是一片空白。所以改为hash或者直接把模式配置删除,让它默认的就行。如...
vue项目打包上线以后出现白屏的情况
第一种情况:由于把路由模式mode
设置成history
了,默认是hash
。
在项目开始的时候就设置了这个,然后一直没找到问题所在,后面百度了好久才发现是这个问题
解决方法:
路由里边
router/index.js
路由配置里边默认模式是hash
,如果你改成了history
模式的话,打开也会是一片空白。所以改为hash
或者直接把模式配置删除,让它默认的就行
。如果非要使用history
模式的话,需要你在服务端加一个覆盖所有的情况的候选资源即必须要服务端在服务器上有对应的模式才能使用history(看上面链接),如果服务器上没有配置,可以先使用默认的hash;:如果URL
匹配不到任何静态资源,则应该返回一个index.html,
这个页面就是你app
依赖页面。所以只要删除
mode
或者把mode
改成hash就OK
了。
export default new Router({
mode: "history",
base: process.env.BASE_URL,
routes: [
{
path: "/home",
name: "home",
component: Home,
meta: {
keepAlive: true
},
children:[
]
},
.....
]
})
当然如果非要使用history
,可以后台配置一下,具体配置如下:
Apache
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.html$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.html [L]
</IfModule>
nginx
location / {
try_files $uri $uri/ /index.html;
}
vue-router
对mode
的说明:
- 类型:
string
- 默认值: “
hash
” (浏览器环境) | “abstract
” (Node.js
环境) - 可选值:
"hash" | "history" | "abstract"
- 配置路由模式:
1、hash
: 使用 URL hash
值来作路由。支持所有浏览器,包括不支持 HTML5 History Api
的浏览器。
2、history
: 依赖 HTML5 History API
和服务器配置。附上链接查看 HTML5 History
模式配置.
3、abstract
: 支持所有 JavaScript
运行环境,如 Node.js
服务器端。如果发现没有浏览器的 API
,路由会自动强制进入这个模式。
第二种情况:在项目中使用了es6
的语法,一些浏览器不支持es6
,造成编译错误不能解析而造成白屏
解决方法:
安装
npm install --save-dev babel-preset-es2015
安装
npm install --save-dev babel-preset-stage-3
在项目根目录创建一个.babelrc
文件 里面内容 最基本配置是:
{
// 此项指明,转码的规则
"presets": [
// env项是借助插件babel-preset-env,下面这个配置说的是babel对es6,es7,es8进行转码,并且设置amd,commonjs这样的模块化文件,不进行转码
["env", { "modules": false }],
// 下面这个是不同阶段出现的es语法,包含不同的转码插件
"stage-2"
],
// 下面这个选项是引用插件来处理代码的转换,transform-runtime用来处理全局函数和优化babel编译
"plugins": ["transform-runtime"],
// 下面指的是在生成的文件中,不产生注释
"comments": false,
// 下面这段是在特定的环境中所执行的转码规则,当环境变量是下面的test就会覆盖上面的设置
"env": {
// test 是提前设置的环境变量,如果没有设置BABEL_ENV则使用NODE_ENV,如果都没有设置默认就是development
"test": {
"presets": ["env", "stage-2"],
// instanbul是一个用来测试转码后代码的工具
"plugins": ["istanbul"]
}
}
}
然后重启npm run dev
关于每次点击链接都要刷新页面的问题
众所周知,开发单页应用就是因为那丝般顺滑的体验效果,如果每次点击都会刷新页面…
出现这个的原因是因为使用了window.location
来跳转,只需要使用使用router
提供的方法,就能够解决这个问题:
在main.js
中配置中将router
绑定到全局
Vue.prototype.router = router;
之后都使用如下的方式来控制跳转
this.router.push('driver/service');
更多推荐
所有评论(0)