从前端角度回答:
不要听每个人都说不可能做,因为我在1996年共同编写的一个实验性旧金山州立大学Web服务终于在几年前进入Internet天堂,并且在那段时间根本不需要修复任何浏览器兼容性; 这几乎是您40年目标的一半。而这种基于JavaScript的前端我在1998年的斯坦福研究院项目与华丽的东西,几年后更换,但没有理由原有UI不能今天仍然可以运行有轻微的兼容性修补。
诀窍是确保您的应用仅使用广泛支持的W3C / ECMA标准,并在您的控制下设计简洁。虽然许多使用90年代新潮技术编写的Web应用程序目前无法很好地工作或根本无法正常工作,但按照主要标准编写的90年代Web应用程序仍然行之有效。他们可能看起来不错,但可以工作。
这里的目标不是编写一个可以在其服务器上运行并保持40年而又没有人再次触摸的Web应用程序。它的目的是建立一个可以在数十年后仍可使用的基础,它可以成长为支持新功能而不必从头开始构建。
首先,您必须按照官方标准编码,而只能按照官方标准编码。没有JavaScript功能不是批准的ECMAScript标准的一部分;ES5.1是当前版本,通常受支持,因此可以安全地定位。同样,当前版本的HTML5,CSS和Unicode也不错。没有实验性的JavaScript,CSS3或HTML功能(具有供应商前缀或浏览器之间没有100%协议的功能)。而且没有针对浏览器的兼容性黑客。您可以在标准中加入新功能后就开始使用它,并且所有人都支持不带前缀的新功能。
对ES5的支持将意味着放弃IE8或更早的版本,无论如何我还是建议这样做,因为它需要特定于浏览器的黑客,这在几年之内将无用。我建议使用ES5的严格模式,以获得长寿的最佳机会,这实际上将您的基准浏览器兼容性设置为IE10和其他所有人的最新版本。这些浏览器还对HTML5的许多表单验证和占位符功能提供了本机支持,这将在很长的一段时间内有用。
新版本的ECMAScript保持与旧版本的兼容性,因此,如果代码是根据当前标准编写的,则采用即将推出的功能会容易得多。例如,使用即将到来的class
语法定义的类将与使用当前constructor.prototype
语法定义的类完全互换。因此,在五年内,开发人员可以在不破坏任何内容的情况下,逐个文件地将类重写为ES6格式-当然,假设您也具有良好的单元测试。
其次,避免使用流行的JavaScript应用程序框架,尤其是当它们更改您对应用程序进行编码的方式时。骨干风靡一时,然后是SproutCore和Ember,现在是每个人都喜欢推广的Angular框架。它们可能有用,但也有一些共同点:它们经常破坏应用程序,并且在新版本问世且使用寿命长存有疑问时要求更改代码。我最近将Angular 1.1应用程序更新为1.2,必须重写很多代码。同样,从第2骨干到第3骨干也需要进行许多HTML更改。标准发展缓慢是有原因的,但是这些框架发展很快,而定期中断则是代价。
另外,新的官方标准通常会使旧框架过时,而一旦发生这种情况,这些框架要么变异(随着重大更改),要么被抛在后面。您知道一旦ECMAScript 6被批准并且所有浏览器都支持其标准化的Promise类,世界上所有竞争的Promise库将会发生什么?他们将过时,他们的开发人员将停止更新它们。如果选择正确的框架,您的代码可能会适应得很好,并且如果您猜错了,您将在进行主要的重构。
因此,如果您正在考虑采用第三方库或框架,请问自己将来要删除的难度有多大。如果它是一个像Angular这样的框架,那么如果不从头开始重新构建应用程序就无法删除它,那是一个好兆头,它不能在40年的体系结构中使用。如果它是您使用一些自定义中间件抽象的第三方日历小部件,则替换它将花费几个小时。
第三,给它一个良好的,干净的应用程序结构。即使您不使用应用程序框架,您仍然可以利用开发人员工具,构建脚本和良好的整洁设计。我个人是Closure Toolkit依赖管理的粉丝,因为它很轻巧,并且在构建应用程序时其开销已完全消除。LessCSS和SCSS还是用于组织样式表和构建要发布的基于标准的CSS样式表的出色工具。
您还可以将自己的代码组织成具有MVC结构的一次性类。这样可以更轻松地回到未来几年,并在编写内容时知道您的想法,并仅替换那些需要它的部分。
您还应该遵循W3C的建议,并将演示信息完全保留在HTML之外。(这包括作弊,例如给元素提供表示性的类名,例如“ big-green-text”和“整个两列”。)如果您的HTML是语义的,而CSS是表示性的,则维护和适应它会容易得多。未来的新平台。为盲人或残疾人士添加对专用浏览器的支持也将更加容易。
第四,使测试自动化,并确保您具有几乎完全的覆盖范围。为每个类编写单元测试,无论是服务器端还是JavaScript。在前端,确保每个类在每个受支持的浏览器中均按照其规范执行。对于每次提交,都可以从构建bot自动化这些测试。这对于延长使用寿命和可靠性都非常重要,因为即使当前的浏览器遮挡了错误,您也可以尽早发现错误。Jasmine和Google Closure的基于JSUnit的测试框架都很好。
您还需要运行完整的UI功能测试,Selenium / WebDriver擅长此测试。基本上,您编写了一个程序,该程序将逐步遍历您的UI并像有人在测试它一样使用它。将它们连接到构建机器人。
最后,正如其他人提到的那样,您的数据为准。请仔细考虑您的数据存储模型,并确保其持久耐用。确保您的数据架构是可靠的,并确保在每次提交时都对其进行了彻底的测试。并确保您的服务器体系结构可扩展。这比您在前端执行的任何操作都更为重要。