Open 6174 opened 7 years ago
目前大多数的前端项目都是以单页面(SPA)的方式进行开发,单页面的开发一大特点是前后端解耦,很多情况下前端会单独部署,但通常一个公司会有多个前端项目共同开发,且面临着多个应用的相互关联,涉及到开发和部署的问题。
SPA 项目开发的时候需要依赖后端提供的 API , 那前端项目运行的时候就需要将这些 api proxy 到后端服务器,其基本工作流程为:
如果基于 express 的,可以使用 http-proxy-middleware
一个基本的配置:
const proxy = require('http-proxy-middleware'); const config = { "default": { "api": "http://127.0.0.1:8080", "endpoints": [ "/api/*", ] } } // Proxy middleware const addProxyMiddlewares = (app, options) => { const services = require(options.config); Object.keys(services).forEach((key) => { const service = services[key]; const api = service.api; const loglevel = service.logLevel || 'info'; const Proxy = proxy({ target: api, logLevel: loglevel, changeOrigin: true, }); service.endpoints.forEach((endpoint) => { app.all(endpoint, Proxy); }); }); };
在某些情况下,一个 SPA 的开发状态需要依赖其他项目,如每个 SPA 都有一套统一的单点登录系统。但如上的工作流中并没有启动单点登录相关的配置,这时候应该有几种情况:
前端应用的部署总的来说有两种方式
前端静态资源的部署也可分为两种
这是前后端未解耦的状态,也是大家最能理解的状态,如 PHP 直接输出 HTML ,配置一个路由,server 返回对应路由的 HTML 渲染结果,多个应用对应多个不同的路由,或者在不同的 server 中实现
前端完全独立部署,将前端应用的打包结果直接放置在 WWW 目录中,配置 Nginx 服务器,将对应的路由连接到对应的应用,一个基本的结构是
- www + app1 * assets * index.html + app2 * assets * index.html + app3 * assets * index.html
nginx 的配置,app1 为默认应用,访问根路径会 rewrite 到 app1/index.html
server { set $api_server http://server-api-domain.com; set $root /Users/admin/project-path/build; listen 80; server_name localhost; access_log logs/host.access.log; error_log logs/error.log debug; rewrite_log on; # rewrite root to index app location = / { root html; index index.html index.htm; rewrite ^(.*)$ /app1/index.html; } # apps with .html extention location ~ /([a-z|\d]+)\.html$ { root $root; rewrite ^/([a-z|\d]+)\.html$ /$1/; index index.html index.htm; } location / { root $root; if ( $content_type = "application/json" ) { proxy_pass $api_server ; } index index.html index.htm; client_max_body_size 1000m; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
这样的部署方式同时需要前端编译的修改,因为在服务其中,静态资源的位置为
/app/assets
而在本地开发模式中,静态资源的访问位置为
/assets
如果以 host/app.html 的方式访问或者 host/ 访问,那么静态资源位置就会访问错误
这时候可以修改 webpack 的 public 路径来解决(开发调试状态不用修改,production 状态需要修改)
实际上在本地开发的时候也可用上面的 nginx 服务器配置,用 nginx 代替 express 和 proxy 中间件,对应如果本地同时开发多个项目,如开发 app1, app2 ,那么可以:
# development multiple project #location ^~ /app1/ { # root $app1_development_root #} #location ^~ /app2/ { # root $app2_development_root #} # or proxy_pass other project #location ~ /([a-z|\d]+) { # set $appname $1; # proxy_pass $server; #}
前端除了 html 外需要部署的就是静态资源,如果使用如七牛这样的云服务,或者公司有自己的 CDN 服务,可以直接将打包好的前端资源发布到 CDN 中,并且通过版本区分
每次 release push 的时候。通过在 gitlab 或者 github 上面实现一个 hook,hook 调用上传脚本
然后对应前端在 production build 的时候修改 public 的 url 对应到 cdn 中的位置
单页面应用以及前后端解耦都快成了老生常谈的事儿了,但是对于不同成熟度的前端的团队在尝试单页面应用时遇到的挑战都是不同的,有的团队是有现成的产品基础,只是修修补补,有的则是从 0 到 1。
个人觉得单页面应用的部署和开发问题可能也是大多数团队遇到的问题,以上的这些 idea 仅供参考,如果您有更多的想法,欢迎讨论
mark
关于
目前大多数的前端项目都是以单页面(SPA)的方式进行开发,单页面的开发一大特点是前后端解耦,很多情况下前端会单独部署,但通常一个公司会有多个前端项目共同开发,且面临着多个应用的相互关联,涉及到开发和部署的问题。
开发状态
SPA 项目开发的时候需要依赖后端提供的 API , 那前端项目运行的时候就需要将这些 api proxy 到后端服务器,其基本工作流程为:
如果基于 express 的,可以使用 http-proxy-middleware
一个基本的配置:
在某些情况下,一个 SPA 的开发状态需要依赖其他项目,如每个 SPA 都有一套统一的单点登录系统。但如上的工作流中并没有启动单点登录相关的配置,这时候应该有几种情况:
部署状态
前端应用的部署总的来说有两种方式
前端静态资源的部署也可分为两种
把应用放在后端开发框架中
这是前后端未解耦的状态,也是大家最能理解的状态,如 PHP 直接输出 HTML ,配置一个路由,server 返回对应路由的 HTML 渲染结果,多个应用对应多个不同的路由,或者在不同的 server 中实现
把应用放置在 Nginx 中
前端完全独立部署,将前端应用的打包结果直接放置在 WWW 目录中,配置 Nginx 服务器,将对应的路由连接到对应的应用,一个基本的结构是
nginx 的配置,app1 为默认应用,访问根路径会 rewrite 到 app1/index.html
对应的前端编译问题
这样的部署方式同时需要前端编译的修改,因为在服务其中,静态资源的位置为
/app/assets
而在本地开发模式中,静态资源的访问位置为
/assets
如果以 host/app.html 的方式访问或者 host/ 访问,那么静态资源位置就会访问错误
这时候可以修改 webpack 的 public 路径来解决(开发调试状态不用修改,production 状态需要修改)
本地同时开发多个 SPA 的情况
实际上在本地开发的时候也可用上面的 nginx 服务器配置,用 nginx 代替 express 和 proxy 中间件,对应如果本地同时开发多个项目,如开发 app1, app2 ,那么可以:
通过 cdn 上传静态资源
前端除了 html 外需要部署的就是静态资源,如果使用如七牛这样的云服务,或者公司有自己的 CDN 服务,可以直接将打包好的前端资源发布到 CDN 中,并且通过版本区分
每次 release push 的时候。通过在 gitlab 或者 github 上面实现一个 hook,hook 调用上传脚本
然后对应前端在 production build 的时候修改 public 的 url 对应到 cdn 中的位置
总结
单页面应用以及前后端解耦都快成了老生常谈的事儿了,但是对于不同成熟度的前端的团队在尝试单页面应用时遇到的挑战都是不同的,有的团队是有现成的产品基础,只是修修补补,有的则是从 0 到 1。
个人觉得单页面应用的部署和开发问题可能也是大多数团队遇到的问题,以上的这些 idea 仅供参考,如果您有更多的想法,欢迎讨论