2016年金山云企业网盘系统跨浏览器兼容性技术方案

项目背景与业务价值

2016年,我在金山云负责企业网盘产品的前端开发工作。当时国内企业级软件仍需要大量支持IE浏览器(IE8/9市场占有率仍然很高)。该项目是金山云重要的企业级产品,直接服务于众多大型企业客户,对公司的企业服务战略具有重要意义。

团队构成与个人角色

在金山云的这个项目中,我是唯一的前端开发工程师,负责所有前端相关工作,包括:

  • Web端整体架构设计
  • 与PC客户端的通信方案设计
  • 跨浏览器兼容性解决方案
  • 前端性能优化

团队构成:

  • 前端开发(1人):我个人,负责所有前端相关工作
  • PC客户端团队(2人):负责C++客户端开发
  • 后端团队(2人):提供API支持
  • 产品经理(1人):负责产品规划和需求对接

作为唯一的前端开发,我需要:

  1. 完成技术方案的调研和决策
  2. 与PC客户端团队密切配合,设计浏览器与客户端的通信方案
  3. 确保产品在各种浏览器环境下运行

技术挑战与解决方案

1. 跨域通信基础方案

客户端的服务地址为 http://127.0.0.1:15000/startapp,需要通过POST方法传输数据。由于数据量大且包含文件信息和token信息,无法使用JSONP方案。经过调研,决定采用CORS方案作为基础通信方案。

解决方案:

// C++客户端设置CORS
Access-Control-Allow-Origin: http://foo.example //表明服务器允许http://foo.example的请求
Access-Control-Allow-Origin: * //表明服务器允许所有请求

2. IE8/9专项兼容

在测试过程中发现IE8/9环境下请求失败。通过源码分析发现,IE10以上版本的XMLHttpRequest已原生支持跨域请求,而低版本IE需要使用专有的XDomainRequest对象。

查看 Angularjs 源码发现 是没有这个
function createXhr() {
  return new window.XMLHttpRequest()
}

解决方案: 使用 jquery.xdomainrequest 插件 引入后 在 IE9 下发起请求 成功返回

3. HTTPS混合内容处理

网站是 https 协议的,访问本地客户端是 http,这些浏览器在请求还未发出的时候就会拦截请求。 在Chrome和Firefox等现代浏览器中,当HTTPS页面请求HTTP资源时会被浏览器安全策略拦截。这是由于混合内容(Mixed Content)限制导致的。

解决方案: 通过分析百度云盘的请求发现 是用了Flash跨域代理方案,然后再 github 上找相关插件下载下来 这个模块

cors-proxy-browser-master

这个模块主要是把 html 代码添加相应的 flash 属性 我们直接把改变后的代码加到页面中 把生成的过程代码给注释掉

<span style="position:absolute;top:0;left:0">
  <object type="application/x-shockwave-flash" data="/dist/common/crossxhr.swf" width="1" height="1" id="FlashHttpRequest_gateway" style="visibility: visible;">
         <param name="wmode" value="transparent">
         <param name="allowscriptaccess" value="always">
    </object>
    </span>

项目成果与个人成长

  1. 项目直接成果:

    • 支持了超过95%的企业用户浏览器环境
    • 产品稳定运行,客户满意度达到90%以上
    • 帮助金山云成功签约XX个大型企业客户
  2. 个人成长:

    • 培养了解决复杂技术问题的能力
    • 提升了跨团队协作和沟通能力
    • 锻炼了技术方案调研和决策能力
    • 开始建立了完整的前端技术体系思维,为我以后的日常工作增长了这方面的见识.
  3. 技术演进的思考:

    • 2016年到现在(2024年),前端技术发生了翻天覆地的变化
    • 作为开发者,要时刻保持技术敏感度
    • 在资源有限的情况下,如何做出最优的技术选择
    • 开发不等于单打独斗,要善于利用团队资源

这段经历让我深刻理解到:作为开发者,不仅要有扎实的技术功底,更要有全局视角和决策能力。这些能力在我后续的职业发展中发挥了重要作用。