关于vue项目打包上线的时候,关于 webpac中的publicPath设置, vue-router中的base设置,nginx配置 的问题

524 阅读4分钟

问题1: 如果我不用nginx、base,只用publicPath有办法把项目放在myapp文件夹下吗?(这里的myapp指的是服务器上的地址路径)

回答: 可以。通过设置 vue.config.js 中的 来实现将 Vue CLI 生成的前端静态文件放在 myapp 目录下。(相对路径 ./ 和/myapp/都可以)

module.exports = {
  publicPath: '/myapp/'
  // publicPath: './'
}

这样打包生成的静态文件中的资源链接会带上 /myapp/ 前缀,比如 /myapp/js/app.js,访问时可以通过访问 yourdomain.com/myapp/ 来访问你的应用。 为什么这里 publicPath为/不行 ,因为设置成/ 后,打包上传到myapp文件夹下,通过访问 yourdomain.com/myapp/ 来访问你的应用。js的路径这个使用是 yourdomain.com/myapp/a.js, 但是请求的是yourdomain.com/a.js,所以不行

问题2: 如果我不用nginx,只用base,publicPath 有办法把项目放在myapp文件夹下吗?

回答:不太行,还是要确保Web服务器能够正确地将请求转发到静态文件存放的目录,否则资源文件有可能无法被正确加载。因此,在一些情况下,还是建议使用Nginx作为反向代理进行部署,这样可以更好地控制请求的转发和处理。(当然了如果保证输入的 URL 地址是正确的,那么不需要配置 nginx 也是可以正常访问的,但是只有首页可以正常刷新,当你点了其他页面,再进行刷新,就会404)

问题3: 为什么历史模式一般需要设置nginx指向静态资源,hash模式可以不需要?(对于问题2的补充)

在使用 Vue Router 的历史模式时,因为 URL 中不包含 hash 标记,所以当浏览器访问到不存在的 URL 时,需要将请求转发到服务器以避免 404 错误。因此,需要在服务器上配置一个指向应用根目录的代理或重定向规则,并且要确保该路径指向的文件目录存在应用的 index.html 文件。 在 nginx 中,可以使用 try_files 指令来实现重定向。try_files 的作用是依次查找文件,如果找到就返回该文件,如果没有找到则将请求重定向到指定的 URL。例如:try_files $uri $uri/ /myapp/index.html;这样,所有请求都将重定向到 /myapp/index.html 页面,由 Vue Router 进行路由解析和页面渲染。

而在使用 Vue Router 的 hash 模式时,URL 中包含 hash 标记(例如:example.com/#/path),因此浏… HTTP 请求到服务器,而是将请求发送到客户端,由客户端的 JavaScript 解析 URL,并通过 JavaScript 渲染对应的组件。因此,无需在服务器上配置指向应用根目录的代理或重定向规则。

因此,在使用 Vue Router 的历史模式时需要在服务器上配置反向代理或重定向规则,而在使用 hash 模式时则可以不需要(nginx默认代理80端口)

问题4: 在mode:history 模式下如何配置?

nginx:

 server{
	listen       80;
    server_name  zhoudaniel.top;
    location /vecharts2 {
      try_files $uri $uri/ /vecharts2/index.html;
    }
  }

这段配置将匹配所有以 /myapp 开头的请求,尝试查找请求的静态资源或者重定向到 /myapp/index.html 进行 Vue Router 解析。 同时,也需要将 Vue Router 的 base 设置为 /myapp/,在构建项目时可以设置 publicPath 为相对路径("./")或者 /myapp/。这样生成的静态资源路径就会带上前缀 /myapp/。 router值为:

const router = new VueRouter({
  base: '/myapp/',
  mode: 'history',
  routes: routes
});

publicPath:

module.exports = { publicPath: './'  } //或者
module.exports = { publicPath: '/myapp/'  } 
// 值`/`不行

所以:无论是使用历史模式还是哈希模式,base 属性的设置都与路由路径有关。如果你的路由路径以 /myapp/ 开头,那么在使用历史模式时,就需要将 base 属性设置为 /myapp/,以便正确地解析路由。而对于哈希模式,由于路由路径的解析与 URL 中的哈希值相关,因此不需要设置 base 属性。

如果你的路由路径不以 /myapp/ 开头,那么在使用历史模式时,就不需要将 base 属性设置为 /myapp/,而是应该将 base 属性设置为你的路由路径的前缀。对于哈希模式,仍然不需要设置 base 属性。

问题5:nginx配置一个静态资源目录和Express配置静态文件 有什么区别?

回答: nginx和使用 Express 静态文件中间件作用类似。 需要注意的是nginx配置静态资源路径和服务转发写在一起时会有冲突,如果两者都需要时,最好做个区分 如下:1,2
1:配置静态资源路径

location /myapp {
  alias xxxx/html/myapp/dist/;
  try_files $uri $uri/ /index.html;
}

2:服务转发

location /myapp-api/ {
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header Host $http_host;
  proxy_set_header X-NginX-Proxy true;
  proxy_pass  http://127.0.0.1:9002/;
}

或者在node服务中配置静态资源app.use(express.static('./dist')) ,nginx只需要转发服务,如上面的第2点

总结

  1. publicPath决定了打包之后的静态资源的路径(publicPath在vue-cli3默认值为/,在vue-cli2中是assetsPublicPath,默认值为'',它们对开发环境也起作用)
  2. vue-router中的base设置 决定了路由路径以什么开头
  3. nginx配置不仅可以反向代理,还可以配置静态资源
  4. 历史模式一般需要nginx配置