vue-router 启用 history 模式下的开发及非根目录部署

84307063 2019-06-30

vue-router 的 history 模式是个提高颜值的好东西,没有了 hash 的路由看起来清爽许多。

开发的时候,如果我们使用 devServer 来启动服务,由于一般不共用端口,我们一般不存在非根目录的问题。

而刷新后 404 的问题可以借助 historyApiFallback 来解决。

但当我们项目对外开放时,往往无法在域名根目录下提供服务,这个时候资源的访问路径与开发时的根目录就有了区别。

首先,我们通过 webpack 来配置一下项目中所有资源的基础路径,让这份代码在开发和生产环境中都可以正确找到资源。

// config/index.js
module.exports = {
    dev: {
        ...
        // 开发环境根目录 - 服务根目录 - 绝对路径
        assetsPublicPath: '/'
        ...
    },
    build: {
        ...
        // 生产环境根目录 - 服务器访问路径 - 绝对路径
        assetsPublicPath: '/test/project1/'
        ...
    }
}

// build/webpack.common.conf.js
const config = require('../config')
module.exports = {
    output: {
        publicPath: process.env.NODE_ENV === 'production'
            ? config.build.assetsPublicPath
            : config.dev.assetsPublicPath
    }
}

// build/webpack.dev.conf.js
const common = require('./webpack.common')
module.exports = merge(common, {
    devServer: {
        historyApiFallback: true
    }
}

然后在提供服务的服务器配置中做如下配置(以 nginx 为例):

location /test/project1 {
        alias .../project1; // 项目的真实路径
        index index.html;
        try_files $uri $uri/ /test/project1/index.html;
}

try_files 会按顺序检查参数中的资源是否存在,并返回第一个找到的资源,如果都没有找到,它会让 nginx 内部重定向到会后一个参数。

对了,所以它的的作用是解决刷新 404 的问题。

这里值得注意的是 try_files 的参数是绝对路径。

至此,你开启 history 模式的项目就可以顺利的跑在任何路径了。

欢迎大家点评指正点个赞~ wink

原文链接 -《vue-router 启用 history 模式下的开发及非根目录部署》

相关推荐