干货:Web应用上线之前程序员应该了解的技术细节

时间:2022-08-26 23:35:30

【伯乐在线注】:《Web 应用上线前,程序员应考虑哪些技术细节呢?》这是 StackExchange 上面的一个经典问题贴。

最赞回复有 2200+ 顶,虽然大多数人可能都听过其中大部分内容,但应该会有你没有深入了解的内容。一起来看看。


问题

Web 应用上线前,程序员应考虑哪些技术细节呢? 如果 Jeff Atwood 忘记把 HttpOnly cookiessitemaps 和 cross-site request forgeries 放在同一个网站,那我会把什么重要的东西也会忘掉呢?

我以一个 Web 开发人员的角度思考这个问题,别人为网站进行美化设计并填充内容。因此,他们可能认为可用性和内容比平台更重要,程序员在这方面没多少发言权了。而你需要考虑到的是:你实现平台的稳定性、安全性和满足其它商业目的(如成本不要太高、耗时不要太长和网站排名)。

而以一位已经在相当可信的环境下,完成了几个企业内网应用程序项目的开发者角度思考,并在一个流行且权威网站上为整个糟糕的万维网打响第一枪。

另外,我希望能回答得更加具体一点,而不仅仅是一个“Web标准”这样模糊的答案。通过 HTTP 传输的 HTML、JavaScript、CSS 是必须要掌握的,特别是针对那些资深 Web 开发者。所以,超出上述范围,哪一个标准?在什么环境下,并且为什么这样?麻烦您提供一个跳转到该标准说明的链接。

最佳回复

下面列表里的大部分内容,我们大多数人都应该已经听过了。所以在这之前,你可能只有一到两个项目没有深入查看和理解透彻,或甚至没听过。

界面和用户体验

  • 应意识到浏览器实现标准不一致,并确保你的网站能在所有主流浏览器上合理运行。至少起码在最近的 Gecko 引擎(Firefox)、Webkit 引擎(Safari 和一些移动端浏览器)、Chrome、支持 IE 浏览器(利用 Application Compatibility VPC Images 进行测试)和 Opera。另外,也要考虑浏览器在不同操作系统下是如何渲染网站的。
  • 要考虑到用户除了通过主流浏览器来浏览网站外,还有其它方式:手机、屏幕阅读器和搜索引擎等。 这有一些相关信息:WAI 和 Section508,移动开发:MobiForge
  • Staging:如何部署更新而不影响用户。进行一次或多次测试或 staging 环境可用来实现架构的更改,确保代码或全部内容能部署在一个可控的方式而不会破坏任何东西。有一个自动化的方式部署批准改变网站。最有效地实现方法是使用版本控制系统(Git、CVS、Subversion 等)和一个自动构建机制( Ant、 NAnt 等)。
  • 不要向用户直接显示不友好的错误提示。
  • 不要以纯文本的方式显示用户的 Email 地址,否则他们将会收到该死的垃圾邮件。
  • 为用户链接添加属性 rel = “nofollow” 来 避免垃圾邮件
  • 为你的网站建立深思熟虑的限制 – 这也属于下面将要讲到的安全性。
  • 学会如何实现网页的 渐进增强
  • POST 提交成功后,要重定向,以防止再次提交引起刷新。
  • 别忘了考虑到访问性(accessibility,即残障人士如何使用网站)。这一直是好想法并且有时这是法定要求。WAI-ARIA 和 WCAG 2 都是这方面很好的资源。
  • 别让用户思考如何操作。

安全性

性能

  • 如有必要,就实现缓存。了解和正确地使用 HTTP 缓存(caching)和 HTML 5 离线缓存。
  • 优化图片 – 别使用一个 20 KB 大小的图片做为一个重复背景。
  • 学习如何用 gzip / deflate 压缩内容deflate更好)。
  • 合并多个样式表单或脚本文件,以减少浏览器发送请求次数,而且要利用 gzip 压缩文件之间重复的部分。
  • 浏览 Yahoo Exceptional Performance(雅虎优越性能)网站,里面有很多优秀的指引,其中就包括提高前端性能和它们的 YSlow 工具(需要 Fixfox、Safari、Chrome 或 Opera)。另外,Google PageSpeed (以 浏览器扩展 的方式)是另一个测试性能的工具,而且它也会优化你的图片。
  • 为较小且有关联的图片使用 CSS 图片精灵 技术,如工具栏(看“把 HTTP 请求减到最低”那点建议)
  • 繁忙 Web 站点应考虑将 网页的内容分开存放 在不同的域名下。特别是…
  • 静态内容(也就是图片、CSS、JavaScript 和无需通过 cookies 获取的一般内容)应放进独立且 不使用 cookies 的域名上,因为所有域名和其子域名为客户端生成的 cookies 都会伴随请求发送回给自己。 一个很好的选择是使用内容分发网络(CDN),但要考虑到这种情况:CDN(包括可替代的 CDN)可能会失效,这时本地副本能代替它来进行传输。
  • 将浏览器渲染页面所需 HTTP 请求数量最少化。
  • 用Google的 Closure Compiler 压缩 JavaScript,当然也可以使用 其他压缩工具
  • 确保有一个 favicon.ico 文件在网站的根目录,也就是说 /favicon.ico。浏览器会自动请求它,即使在 HTML 中并未提及到它。如果没有 /favicon.ico,那么请求返回的结果是 大量的 404 错误,这将会耗尽服务器的带宽。

SEO(搜索引擎优化)

  • 使用“对搜索引擎友好”的链接,比如说 example.com/pages/45-article-title 优于 example.com/index.php?page=45。是 googlebot(Google 的 web 爬虫)用来替换 #! 的。换句话说,./#!page=1 会被Google搜索引擎转成 ./?_escaped_fragments_=page=1。 (通常来说 URL 中的 # 后的东西都不会被传到服务器上,所以,为了要让 Google 可以抓取 AJAX 的东西,你需要使用 #!,而 Google 会把“#!”转成“_escaped_fragment_”来向服务器发请求,Twitter 的大量链接者是#!的,比如:https://twitter.com/#!/your_activity —— 陈皓注)。另外,用户也许会使用 Firefox 或 Chromium,那么 history.pushState({"foo":"bar"}, "About", "./?page=1"); 是一个很不错的命令。因为即使地址栏上的地址改变了,页面也不会重新加载。这可让你使用 ? 而不是 #!来动态加载内容了,也告诉服务器,当下次访问该页面时给该链接发邮件,AJAX 无须再发送一个额外的请求了。
  • 别使用 “点击这里” 这类的链接。这是浪费一个 SEO 的机会,并且会对使用屏幕朗读器用户造成困惑。
  • 拥有一个 XML 网站地图,它的默认路径最好是 /sitemap.xml。
  • 当你有多个 URL 指向同一个内容时,请使用 <link rel="canonical" ... />。这个问题可利用 Google Webmaster Tools 解决。
  • 使用 Google Webmaster Tools 和 Bing Webmaster Tools
  • 在一开始就正确安装 Google Analytics (或一个开源的分析工具,如 Piwik)。
  • 要知道 robots.txt 和搜索引擎爬虫是如何工作的。
  • 重定向请求(使用 301 永久性移走),要求 www.example.com 重定向到 example.com (或反过来),从而防止分裂两个站点之间的谷歌排名。
  • 知道并不是所有的爬虫都是好的,有些爬虫的行为并不好。
  • 如果有非文本内容(如视频等)需要添加到 Google 网站地图的话,你可以到 Tim Farley’s answer 看看,里面有一些关于这方面的,而且不错的信息。

技术

  • 搞懂 HTTP 协议,以及诸如 GET 、POST、sessions 和 cookies 这些概念,而且要知道“无状态”是什么意思。
  • 根据 W3C 文档 编写你的 XHTML / HTML 和 CSS 代码,并确保它们 有效。这里的目的是避免浏览器的怪异模式,并让它们更容易在非传统浏览器(如屏幕阅读器和移动设备)上运行。
  • 搞懂浏览器是如何处理 JavaScript。
  • 搞懂页面上的 JavaScript、样式表单和其他资源是如何加载和运行的,并考虑它们对性能的影响。现在广泛认同的做法是:除了通用脚本,如 analytics apps 或 HTML5 shims,将其它脚本放到页面底部
  • 搞懂 JavaScript 沙箱如何工作,特别是你打算用 iframes。
  • 要意识到 JavaScript 可能会被禁用,因此 AJAX 也只是一个扩展,不一定会被运行。即使大多数普通的用户并不会理会 JavaScript 被禁用,但要记住 NoScript 正变得更流行,移动设备可能默认禁止 JavaScript,而且 Google 在索引你的网站时,并不会执行大多数 JavaScript。
  • 学会区分 301 和 302 重定向 的不同之处(这也是一个 SEO 问题)。
  • 尽可能多地学习你部署平台的相关知识。
  • 考虑使用 Reset Style Sheet(重置样式表单) 或 normalize.css
  • 考虑使用 JavaScript 框架(如 jQueryMooToolsPrototypeDojo 或 YUI 3),它们会解决很多在使用 JavaScript 操作 DOM 时的浏览器差异问题。
  • 把性能和 JS 框架合在一起讨论,考虑使用诸如 Google Libraries API 服务来加载框架, 以至于浏览器能使用已缓存框架的副本,而不是从你的网站下载同样的副本。
  • 不要重复造*。在做任何事之前,可搜索一个组件或案例是如何实现的。但有 99% 机会是其它人已经做过了,并发布了 OSS 版本的代码。
  • 另外,即时确定你需要的是什么,但也别使用太多库。特别是在 Web 客户端,保持轻量、快速和灵活非常重要。

BUG 修复

  • 要明白你将花费 20% 时间敲代码,而剩下 80% 的时间是在维护你的代码,所以代码质量很重要。
  • 建立一个良好的错误报告解决方案。
  • 为用户提供一个能向你提交建议与批评的系统。
  • 为将来的维护和技术支持人员撰写文档,解释清楚系统是怎么运行的。
  • 经常备份!(并确保那些备份是可用的)除了备份机制,你还必须有一个恢复机制。
  • 使用版本控制系统来存储你的文件,如 SubversionMercurial 或 Git
  • 别忘记进行验收测试。框架(如 Selenium)能为你提供相应帮助。特别是如果你想完全自动化测试,也可通过使用持续集成工具,比如 Jenkins
  • 在网站运行时,要确保你有足够的日志,当然你可以使用框架,如 log4jlog4net 或 log4r。因为当你的网站某部分发生错误,你将需要一种方式找出是哪里发生的。
  • 当日志能确保你能同时捕捉到处理异常和未处理异常。那么可通过记录/分析输出的日志,可显示网站的关键问题出现在哪里。

其他

  • 服务器端和客户端都要监控和分析(应主动而不是被动)。
  • 使用能与用户保持联系的服务(如 UserVoice 和 Intercom,或其它类似的工具)。
  • 采用 Vincent Driessen 的 Git 分支模型(Git branching model)。

文中有很多省略掉的东西,并不是因为它们不是有用的答案,而是它们过于详细,且超出本问题的范围。而对于想懂得更多的人来说,他们希望学到更多的东西,因此他们应该知道这些概述。另外,我也欢迎大家编辑补充这个答案,因为我可能忽略了一些东西或犯了一些错误。

关于作者: J.c

干货:Web应用上线之前程序员应该了解的技术细节的更多相关文章

  1. 「编程羽录」上线,程序员必备的这些技能你能get到嘛?

    大家好,我是小羽. 好久不见,给大家带来个好消息,小羽的全新专题「编程羽录」系列正式上新,主要是介绍一些关于面试题和经验总结的文章. 会为大家提供一些技术栈之外,程序员还需要的其他方面硬核知识,做到全 ...

  2. 一个Web前端工程师或程序员的发展方向,未来困境及穷途末路

    如果你刚好是一个Web前端工程师,或者你将要从事web前端工作.你应该和我有同样的感慨,web前端技术到了自己的天花板,前端工作我能做多少年?3年或5年?自己的职业规划应该怎么样?收入为什么没有增长? ...

  3. 程序员Web面试之前端框架等知识

    基于前面2篇博客: 程序员Web面试之jQuery 程序员Web面试之JSON 您已经可以顺利进入Web开发的大门. 但是要动手干,还需要了解一些已有的前端框架.UI套件,即要站在巨人肩膀上而不是从轮 ...

  4. Java程序员从笨鸟到菜鸟之(一百零二)sql注入攻击详解(三)sql注入解决办法

    sql注入攻击详解(二)sql注入过程详解 sql注入攻击详解(一)sql注入原理详解 我们了解了sql注入原理和sql注入过程,今天我们就来了解一下sql注入的解决办法.怎么来解决和防范sql注入, ...

  5. 身为java程序员你需要知道的网站&lpar;包含书籍&comma;面试题&comma;架构&period;&period;&period;&rpar;

    推荐几本书<高级java程序员值得拥有的10本书>,     首页 所有文章 资讯 Web 架构 基础技术 书籍 教程 我要投稿 更多频道 » - 导航条 - 首页 所有文章 资讯 Web ...

  6. 好程序员web前端分享想要学习前端需要学那些课程

    好程序员web前端分享想要学习前端需要学那些课程,仔细思考了一下如何回答好这个话题,其实前端是一个涵盖面非常之广泛的一个职位,所需知识体系非常庞杂,与传统语言“想要精一行,必先通一门” 有很大差别, ...

  7. 精干货! Java 后端程序员 1 年工作经验总结

    一.引言   毕业已经一年有余,这一年里特别感谢技术管理人员的器重,以及同事的帮忙,学到了不少 东西.这一年里走过一些弯路,也碰到一些难题,也受到过做为一名开发却经常为系统维护 和发布当救火队员的苦恼 ...

  8. 史上最全的web前端开发程序员学习清单!

    今天为什么要给大家分享这篇文章呢,我发现最近来学前端的特别多,群里面整天都有人问:前端好找工作吗?前端要怎么学啊?前端工资怎么样?前端XX,前端XXX,虽然我回答过无数次这种问题了,但是问这个的还是有 ...

  9. 最全的WEB前端开发程序员学习清单

    史上最全的WEB前端开发程序员学习清单! 今天为什么要给大家分享这篇文章呢,我发现最近来学前端的特别多,群里面整天都有人问:前端好找工作吗?前端要怎么学啊?前端工资怎么样?前端XX,前端XXX,虽然我 ...

随机推荐

  1. Django模板与Vue&period;js冲突问题

    参考: https://my.oschina.net/soarwilldo/blog/755984 方法1:修改vue.js的默认的绑定符号 Vue.config.delimiters = [&quo ...

  2. Apex Design Patterns

    Apex allows you to build just about any custom solution on the Force.com platform. But what are the ...

  3. 使用 HTML5 Shiv 让 IE 支持 HTML5

    HTML5 Shiv 使用 html5.js 必须在页面head元素内调用(因为 IE 必须在元素解析前知道这个元素,所以这个 JS 文件不能在页面底部调用.) 作者已经把js文件放在Google c ...

  4. springmvc实现REST中的GET、POST、PUT和DELETE

    spring mvc 支持REST风格的请求方法,GET.POST.PUT和DELETE四种请求方法分别代表了数据库CRUD中的select.insert.update.delete,下面演示一个简单 ...

  5. SpringBoot入门系列:第一篇 Hello World

    跟随SpringBoot的文档(http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#boot-d ...

  6. php调用java类文件

    最近在折腾php调用java类,网上查阅资料,最终选用JavaBridge,遇到的第一个问题是java_require() 函数引入自定义java打包而成的jar文件,在新版本的JavaBridge中 ...

  7. MVC4入门指南

    本系列共10篇文章,翻译自Asp.Net MVC4 官方教程,由于本系列文章言简意赅,篇幅适中,从一个示例开始讲解,全文最终完成了一个管理影片的小系统,非常适合新手入门Asp.Net MVC4,并由此 ...

  8. POJ 2311 Cutting Game(SG&plus;记忆化)

    题目链接 #include<iostream> #include<cstdio> #include<cstring> using namespace std; ][ ...

  9. &lbrack;转&rsqb;dd命令、cp命令详解&plus;dd命令、cp命令对比 ---delong

    出处:http://blog.csdn.net/sun_app/article/details/18263299 1.dd命令详解 1)中文man手册dd的解释 NAME       dd - 转换和 ...

  10. Cloud-Platform部署学习

    1. Cloud-Platform部署学习 1.1. 介绍 Cloud-Platform是国内首个基于Spring Cloud微服务化开发平台,核心技术采用Spring Boot2以及Spring C ...