单页应用的部署方案

本文同步发布于个人我的博客上 - 单页应用的部署方案javascript

本文主要简单讲一下单页应用的开发及部署方法,默认你懂一些服务端知识及nginx知识,若是有任何能够在下方评论留言。

单页应用

SPA(单页应用)能够说是这几年前端领域的一个技能栈了。 html

单页应用不一样与传统的多页面应用,顾名思义,单页应用整个应用架构中只有一个实际页面运行,再借助于H5的History API或hash路由来实现前端路由,从而实现了先后端的解耦,或者先后端分离。不一样于之前,前端页面都是放在后端项目的模板目录下的,由服务端来渲染模板,而且由后端路由来决定一个请求应该渲染哪一个模板,能够说前端对后端的依赖是很是大的。 前端

单页应用实现了先后端分离,页面的渲染与路由跳转都由前端同窗自行控制,后端只提供API接口。这种模式下看似前端同窗实现了一个大独立,可是不少同窗面对这种开发模式彻底不知道如何搭建开发环境以及线上部署。vue

开发环境

开发环境的搭建通常来讲比较简单,常见的单页应用框架都提供了脚手架,好比vuevue-cli,只须要安装后,一个vue create project就能够初始化一个项目,而后就能够开发了。 java

这里主要关注,与后端的调用关系。通常来讲,项目里面直接去调用后端接口就能够了,可是单页应用因为是先后端分离的,因此先后端的域名通常来讲都不同,这样就会出现一个跨域问题。 nginx

使用CORS能够很好的解决这个问题,可是这个是须要后端同窗配合的,前端同窗没办法干预。并且有些后端同窗可能根本不了解CORS,这时候你就须要去跟后端同窗扯皮,让他给你支持跨域问题,碰到很差合做的同窗真的很浪费时间。别笑,我还真遇到过这种问题,后端同窗彻底不知道CORS,学习半天,好不容易能支持了,又写的乱七八糟的,后面改域名跟带cookie时,又搞了好几天,真的浪费时间。 vue-cli

这里我们可使用vue-cli的转发功能来解决开发时的跨域问题:shell

// vue.config.js
module.exports = {
  devServer: {
    proxy: {
      '/api': {
        target: 'http://127.0.0.1:7002',
        changeOrigin: true
      },
    }
  }
}

这样,前端发请求/api/user/detail这样的请求就会转发到后端的http://localhost:7002/api/user/detail了。因为前端不是直接请求后端接口,因此也就不会跨域了。后端

clipboard.png

clipboard.png

能够看到前端发出的请求会自动转发到后端,而且不会触发跨域。api

线上部署

开发完成后面临一个部署问题,通常来讲部署的工做是轮不到前端来作的,通常会交给运维或者后端同窗。可是我们前端同窗也要自强不息啊,开个玩笑,实际上不少状况下,小公司的运维同窗可能本身都不知道怎么部署单页应用,有些时候仍是要本身上。

跟开发的时候一个思路,也能够将后端请求作一个转发,这个时候就没办法经过devServer.proxy来转发了。我们能够经过NGINX来作一下转发。

先看看单页应用的部署,单页应用开发完只有一个index.html,页面的渲染及其余页面都经过js来生成和控制。同时浏览器刷新页面的时候,是会发请求到服务器的,因此若是按照常规方式来部署,就会出如今/user/detail这样的页面刷新的时候,会出现404错误,由于浏览器将页面发到服务器,却发现服务器上根本没有这个资源,因此就404了。因此单页应用的部署,须要将全部的页面请求都返回index.html,浏览器下载了index.htmljs会自动解析并导航到对应页面。

# nginx.conf
server {
    listen 80;
    server_name www.yuexiaohao.com;
    root /home/yuexiaohao/project/spa/fe/dist;
    index    index.html index.htm;

    location / {
        etag         on;
        expires      max;
        try_files $uri $uri/ /index.html;
    }
}

clipboard.png

配置好nginx启动能够看到这时候网站以及能够在线上运行起来了。前端路由以及页面刷新都没有任何问题,可是数据请求确定是有问题的,由于这个时候线上域名下可没有/api/xxx接口,由于单页应用打包出来的实际上是一个只包含一个index.html的静态网站,没有任何动态语言能力的。

咱们使用nginx来转发一下数据请求:

# nginx.conf
server {
    listen 80;
    server_name www.yuexiaohao.com;
    root /home/yuexiaohao/project/spa/fe/dist;
    index    index.html index.htm;

    location /api/ {
        # 这里的接口地址自行修改便可,后端项目跟前端项目在一个机器上可使用本地地址,或者使用内网地址,公网地址都没有问题
        proxy_pass http://127.0.0.1:7002/api/;
    }

    location / {
        etag         on;
        expires      max;
        try_files $uri $uri/ /index.html;
    }
}

clipboard.png

这个时候能够看到数据请求也OK了,整个部署过程就完成了。

总结

单页应用与之前的常规多页面应用仍是有区别的,开发过程与后端解耦了,同时会出现跨域、鉴权以及应用部署的问题。可是经过工具以及nginx提供的代理或转发功能,仍是能够很好的跨域问题的。

相关文章
相关标签/搜索