查看: 5838|回复: 15

浅谈如何降低 HTML5 的异步编程复杂度

[复制链接]
论坛徽章:
350
2006年度最佳版主
日期:2007-01-24 12:56:49NBA大富翁
日期:2008-04-21 22:57:29地主之星
日期:2008-11-17 19:37:352008年度最佳版主
日期:2009-03-26 09:33:53股神
日期:2009-04-01 10:05:56NBA季后赛大富翁
日期:2009-06-16 11:48:01NBA季后赛大富翁
日期:2009-06-16 11:48:01ITPUB年度最佳版主
日期:2011-04-08 18:37:09ITPUB年度最佳版主
日期:2011-12-28 15:24:18ITPUB年度最佳技术原创精华奖
日期:2012-03-13 17:12:05
发表于 2013-9-20 21:32 | 显示全部楼层 |阅读模式

准备工作
假设一模拟场景,需求如下:
从服务端获取员工列表数据(基本数据:员工 ID,姓名,年龄),并存于客户端;
对于年龄在 30 岁以上的员工,获取其详细数据(基本数据及其入职时间),并存于客户端。
您可以根据自身经验,先评估用传统回调方式完成该需求的时间,然后和下文中的具体实现做比较。附件则为本文例子相关源码,使用技术主要有 SpringMVC + jQuery/Wind.js/JSDeferred + Web SQL(HTML5)等,基于 Maven 构建。
如果您对 HTML5 的 Web SQL 不是很熟悉,可以先阅读本站 HTML5 专题中的相关文章。
论坛徽章:
350
2006年度最佳版主
日期:2007-01-24 12:56:49NBA大富翁
日期:2008-04-21 22:57:29地主之星
日期:2008-11-17 19:37:352008年度最佳版主
日期:2009-03-26 09:33:53股神
日期:2009-04-01 10:05:56NBA季后赛大富翁
日期:2009-06-16 11:48:01NBA季后赛大富翁
日期:2009-06-16 11:48:01ITPUB年度最佳版主
日期:2011-04-08 18:37:09ITPUB年度最佳版主
日期:2011-12-28 15:24:18ITPUB年度最佳技术原创精华奖
日期:2012-03-13 17:12:05
 楼主| 发表于 2013-9-20 21:33 | 显示全部楼层
JavaScript 异步编程
对 JavaScript 异步编程概念不熟悉的读者可先阅读阮一峰的 JavaScript 异步编程的 4 种方法。引用他的话来说,JavaScript 执行环境是“单线程”。而所谓"单线程",就是指一次只能完成一件任务。如果有多个任务,就必须排队,前面一个任务完成,再执行后面一个任务,以此类推。那么这种语言特性导致的结果就是:JavaScript 代码风格大多以回调写法为主。HTML4 规范下,您也许写过以下场景的代码:
通过 Ajax 获取服务端数据;
使用某个 UI 框架的 Dialog,定义某个按钮点击时的回调函数;
实现某个动画。
等等,那么步入 HTML5 时代,您可能还会基于回调方式写一下场景的代码:
实现离线存储功能;
实现文件读写功能;
基于 Worklight、PhoneGap 等框架提供的 JavaScript API 来使用移动设备资源。
日益种类繁多的回调式写法势必会给开发带来更多复杂度,下面将简单介绍几种改善异步编程体验的方式:

使用道具 举报

回复
论坛徽章:
350
2006年度最佳版主
日期:2007-01-24 12:56:49NBA大富翁
日期:2008-04-21 22:57:29地主之星
日期:2008-11-17 19:37:352008年度最佳版主
日期:2009-03-26 09:33:53股神
日期:2009-04-01 10:05:56NBA季后赛大富翁
日期:2009-06-16 11:48:01NBA季后赛大富翁
日期:2009-06-16 11:48:01ITPUB年度最佳版主
日期:2011-04-08 18:37:09ITPUB年度最佳版主
日期:2011-12-28 15:24:18ITPUB年度最佳技术原创精华奖
日期:2012-03-13 17:12:05
 楼主| 发表于 2013-9-20 21:33 | 显示全部楼层
[size=0.76em]Promise 方式
[size=0.76em]Promise 规范
[size=0.76em]Promise 规范由 CommonJS 组织提出,目前还处于草案阶段。就设计目的简单的说,就是提供一个对象,通过该对象的方法,来代表某个异步操作的成功,失败等;现有草案(包含校订中的)主要有 5 个:Promises/APromises/BPromises/KISS、Promises/C(校订中)、Promises/D。即便该规范还不是标准,jQuery 1.5+、Dojo 1.7+、Node.js 中的 node-promise 等已经实现了 Promises/A 的规范,有些还提供了扩展功能,如中断操作,多个异步操作同时执行等;而 Node.js 则实现了 Promises/B 和 Promises/D。下面将主要介绍 Promises/A 以及 jQuery 的实现方式。
[size=0.76em]Promises/A 规范主要有以下几点:
  • 创建一个 promise 对象代表异步操作;
  • 该对象有三种状态:未完成(unfulfilled)、完成(fulfilled)、失败(failed);
  • 该对象提供一个名为 then 的方法,该方法有三个入参,依次能传入完成时的函数句柄(fulfilledHandler),失败时的函数句柄(errorHandler)以及获取当前进展的函数句柄(progressHandler);
  • then 方法会返回一个新的 promise 对象,这为链式(chain)操作提供便利。
[size=0.76em]jQuery 的实现
[size=0.76em]jQuery 从 1.5 起引入了 Deferred 类,实现了 Promises/A 规范,并提供一些增强功能,下面是一个简单的例子:如果获得一个偶数,异步操作成功,反之失败。希望通过这个例子能让读者对 Promise 规范有一个直观了解:

清单 1.jQuery 的 Deferred 类示例代码
$(document).ready(function() {    var asyncTask = function(idx) {        var dfd = $.Deferred(); // 获得一个 Deferred 实例        setTimeout(function() {            var result = parseInt(Math.random() * 100, 10) % 2,                time = (new Date()).getTime(),                prefix = "jQuery " + time + " " + idx + ":";            if (result == 0) {                dfd.resolve(prefix + "got an even number"); // 如果得到偶数,表示操作成功            } else {                dfd.reject(prefix + "failed to get an even number"); // 反之表示操作失败            }        }, 2000); // 延迟2秒执行函数        return dfd; // 返回Deferred实例    }        function printResult (result) {        console.info(result);    }    for (var i=0; i<5; i++) {        asyncTask(i).then(printResult, printResult); // 执行5次,输出成功或者失败结果    }});


图 1.在 Chrome 运行的结果

[size=0.76em]需求实现
[size=0.76em]回到模拟场景,我们将创建一个 Employee 类,然后基于 Promise 规范创建三个关键方法:
  • 从服务端获取员工列表数据,代码见清单 2;
  • 从服务端获取详细数据;
  • 在客户端保存员工数据。
[size=0.76em]然后按场景需求,将这三个方法组合使用,代码见清单 3。

清单 2.从服务端获取员工列表数据的代码
Employee.all = function(opt) {    var opt = opt || {local: true}, dfd = $.Deferred();    if (opt.local === true) {        throw new Error('not implemented!'); // 暂不实现离线存储部分的代码    } else {        // 通过ajax获取员工数据, jQuery的ajax方法也同样返回了一个Deferred实例        $.ajax({            url: "/async/api/employee",            dataType: "json"        }).then(function(items) {            var employees = [];            $(items).each(function(idx, item) {                employees.push(new Employee(item))            });            dfd.resolve(employees);        }, function(err) {            dfd.reject(err);        });    }    return dfd;};


清单 3.实现模拟场景的代码
$(document).ready(function() {    var msg;    Employee.all({local: false}).then(function(employees) { // 从服务器读取员工数据        $(employees).each(function(idx, employee) {            if (employee.age >= 30) {                Employee.get(employee.id, {local: false}). // 从服务器读取员工明细                then(function(employee) {                    employee.create({local: true}); // 将年龄大于30(含)的员工明细存于本地                }, function(err) {                    msg = 'failed to retrieve the detail info from the server';                    console.error(msg);                });            } else {                employee.create({local: true}); // 将年龄小于30的员工明细存于本地            }        });    }, function(err) {        msg = 'failed to retrieve all employee\'s info from the server.';        console.error(msg);    });});


图 2.清单 3 代码的运行结果

[size=0.76em]由此可见,代码的可读性和可维护性得到了一定的提高,细心的读者也许会发现,for 循环中代码并不是顺序执行的。针对这个缺陷,我们会介绍两种非 Promise 的实现方式。


使用道具 举报

回复
论坛徽章:
350
2006年度最佳版主
日期:2007-01-24 12:56:49NBA大富翁
日期:2008-04-21 22:57:29地主之星
日期:2008-11-17 19:37:352008年度最佳版主
日期:2009-03-26 09:33:53股神
日期:2009-04-01 10:05:56NBA季后赛大富翁
日期:2009-06-16 11:48:01NBA季后赛大富翁
日期:2009-06-16 11:48:01ITPUB年度最佳版主
日期:2011-04-08 18:37:09ITPUB年度最佳版主
日期:2011-12-28 15:24:18ITPUB年度最佳技术原创精华奖
日期:2012-03-13 17:12:05
 楼主| 发表于 2013-9-20 21:34 | 显示全部楼层
非 Promise 方式
Wind.js 介绍
Wind.js是 IBM 高级咨询师赵劼的开源项目,引用他的话来说,是希望通过 JavaScript 这门语言体现 F# 中“计算表达式”特性,来达到简化异步编码的目的。基于 Wind.js 实现本文第一个例子,代码如下:

清单 4.基于 Wind.js 实现本文第一个例子的代码
var asyncTask = eval(Wind.compile("async", function (idx) { // 运行“编译”后的代码', 得到句柄
    for (var i=0; i<5; i++) {
        $await(Wind.Async.sleep(2000)); // 等待2秒再继续执行
        var result = parseInt(Math.random() * 100, 10) % 2,
            time = (new Date()).getTime(),
            prefix = "Wind.js " + time + " " + i + ":";
        if (result == 0) {
            console.info(prefix + "got an even number");
        } else {
            console.info(prefix + "got an odd number");
        }
    }
}));
asyncTask().start(); // 开始运行异步任务




图 3.清单 4 中代码的运行结果

由于使用了$await(Wind.Async.sleep(2000)) 这行代码,我们实现了每 2 秒获得一个奇数或者偶数。好奇的读者也许想知道 Wind.js 运行原理,简单的说,Wind.js 先对源代码进行词法分析、语法分析,然后动态生成新代码以实现异步编程。
需求实现
同样还是员工场景的那三个关键方法,我们将用到 Wind.js 的 Wind.Async.Task 类,将回调写法的代码封装起来,代码示例如下:

清单 5.从服务端获取员工列表数据的代码
Employee.all = function(opt) {
    var opt = opt || {local: true}, Task = Wind.Async.Task;
    if (opt.local === true) {
        throw new Error('not implemented!');
    } else {
        return Task.create(function(t) { // 创建 Wind.Async.Task实例, 封装必须使用回调方法的代码
            $.ajax({
                url: "/async/api/employee",
                dataType: "json"
            }).then(function(items) {
                var employees = [];
                $(items).each(function(idx, item) {
                    employees.push(new Employee(item))
                });
                t.complete("success", employees); // 操作成功
            }, function(err) {
                t.complete("failure", err); // 操作失败
            });
        });
    }
};



清单 6.实现模拟场景的代码
$(document).ready(function() {
    var employeeTask = eval(Wind.compile("async", function (idx) { // 生成句柄
        try {
            var employees = $await(Employee.all({local: false})); // 通过$await方法以便”编译”
            for (var i=0; i<employees.length; i++) {
                var employee = employees[i];
                if (employee.age >= 30) {
                    var employeeWithDetail =
                        $await(Employee.get(employee.id, {local: false}));
                    $await(employeeWithDetail.create({local: true}));
                } else {
                    $await(employee.create({local: true}));
                }
            }
        } catch(err) {
            console.error(err);
        }
        
    }));
    employeeTask().start();
});

});

从清单 6 的代码不难看出,这种代码风格已经看不到 JavaScript 中常用的回调写法,毫无疑问,开发者会更容易接受这种“顺序执行”编程体验。

使用道具 举报

回复
论坛徽章:
350
2006年度最佳版主
日期:2007-01-24 12:56:49NBA大富翁
日期:2008-04-21 22:57:29地主之星
日期:2008-11-17 19:37:352008年度最佳版主
日期:2009-03-26 09:33:53股神
日期:2009-04-01 10:05:56NBA季后赛大富翁
日期:2009-06-16 11:48:01NBA季后赛大富翁
日期:2009-06-16 11:48:01ITPUB年度最佳版主
日期:2011-04-08 18:37:09ITPUB年度最佳版主
日期:2011-12-28 15:24:18ITPUB年度最佳技术原创精华奖
日期:2012-03-13 17:12:05
 楼主| 发表于 2013-9-20 21:34 | 显示全部楼层
[size=0.76em]JSDeferred 介绍
[size=0.76em]JSDeferred则是一款独立、简洁的异步执行类库,通过 next、loop、call、parallel 和 wait 等方法实现异步编程。依然是基于 JSDeferred 改写本文第一个例子,代码如下:

清单 7.基于 JSDeferred 实现本文第一个例子的代码
Deferred.define(); // 将JSDeferred的方法变成全局方法loop(5, function (i) { // 顺序循环5次    var result = parseInt(Math.random() * 100, 10) % 2,        time = (new Date()).getTime(),        prefix = "JSDeferred " + time + " " + i + ":";    if (result == 0) {        console.info(prefix + "got an even number");    } else {        console.info(prefix + "got an odd number");    }    return wait(2); // 等待2秒});


图 4.清单 11 中代码的运行结果

[size=0.76em]由于篇幅限制,下面只列出 JSDeferred 实现模拟场景的代码:

清单 8.实现模拟场景的代码
$(document).ready(function() {    Deferred.define();    next(function () {        return Employee.all({local: false}); // 当从远端获得所有员工数据时,才运行下一步    }).    next(function (employees) {        return loop(employees.length, function(i) { // 顺序遍历员工            var employee = employees;            if (employee.age >= 30) {                return Employee.get(employee.id, {local: false})                       .next(function(employeeWithDetail) {                           return employeeWithDetail.create({local: true});                       }); // 从远端获取员工明细,保存到本地            } else {                return employee.create({local: true});            }        })    }).    error(function(err) {        console.error(err); // 异常会导致异步过程中断,并被打印    })});

[size=0.76em]由此可见,在改善异步编程体验方面,已经是百花齐放的局面,对于其他改善异步编程体验的方式,本文不一一罗列,感兴趣的读者可自行了解。

使用道具 举报

回复
招聘 : HTML页面制作
论坛徽章:
0
发表于 2014-9-25 16:27 | 显示全部楼层
学习中,谢谢分享

使用道具 举报

回复
论坛徽章:
350
2006年度最佳版主
日期:2007-01-24 12:56:49NBA大富翁
日期:2008-04-21 22:57:29地主之星
日期:2008-11-17 19:37:352008年度最佳版主
日期:2009-03-26 09:33:53股神
日期:2009-04-01 10:05:56NBA季后赛大富翁
日期:2009-06-16 11:48:01NBA季后赛大富翁
日期:2009-06-16 11:48:01ITPUB年度最佳版主
日期:2011-04-08 18:37:09ITPUB年度最佳版主
日期:2011-12-28 15:24:18ITPUB年度最佳技术原创精华奖
日期:2012-03-13 17:12:05
 楼主| 发表于 2014-10-15 20:07 | 显示全部楼层
2012年对HTML5是多事的一年。年初各界人士对HTML5进行了乐观的畅想。而Facebook在进行了长时间的尝试之后,8月份发表声明,在iOS平台转向native开发。昨天(12月14日),facebook发布了Android平台的原生应用。Facebook在官方博客中表示,新版Android应用在显示照片和加载时间线条目时速度是此前版本的2倍。

Facebook的早期员工,中国籍第二位工程师和第一位研发经理王淮Harry(微博)在他的博客文章《HTML5的明天, 局部有小雨》中谈到了该不该给HTML5投怀送抱这个问题。他表示,这个问题需要分两步:

你在WEB端还是移动端?
对于Web端而言, HTML5将是一个完整的操作系统。 它在不同的底层系统之上, 借助于浏览器的实现, 封装了统一标准的API允许开发的程序跨设备(PC or Mac or Smart Phone), 跨平台 (Windows, MacOS, iOS, Android, whatsoever)的运行。最大的好处, 就是一处开发, 多处使用。审核新版本的发布也不用看苹果爷爷的脸色。 直接在服务器端推送新代码就好了。 对于开发人员而言, 这对效率的提高, 有着致命的诱惑。 像”你们是先开发Web, 还是移动”之类的问题, 将愉快的失去意义。对于Web端的开发而言, 你可以尽情的享受HTML5这种统一封装带来的好处, 唯一要等待的就是浏览器对其支持的完善。 但这种完善的到来, 无疑是确定的。

如果是移动端, 取决于你的产品形态。
因为你的产品需要的功能可能永远也无法在移动端的浏览器的HTML5实现中被很好的实现。

使用道具 举报

回复
论坛徽章:
350
2006年度最佳版主
日期:2007-01-24 12:56:49NBA大富翁
日期:2008-04-21 22:57:29地主之星
日期:2008-11-17 19:37:352008年度最佳版主
日期:2009-03-26 09:33:53股神
日期:2009-04-01 10:05:56NBA季后赛大富翁
日期:2009-06-16 11:48:01NBA季后赛大富翁
日期:2009-06-16 11:48:01ITPUB年度最佳版主
日期:2011-04-08 18:37:09ITPUB年度最佳版主
日期:2011-12-28 15:24:18ITPUB年度最佳技术原创精华奖
日期:2012-03-13 17:12:05
 楼主| 发表于 2014-10-15 20:07 | 显示全部楼层
Harry表示:

App Store上超过50%的应用已经是用HTML5来开发, 将来可能90%的应用会是HTML5, 而那10%, 可能永远也不适合HTML5。

在分析情况之后,他介绍了一个动态检测浏览器对HTML支持程度的测试工具ringmark.io来帮助大家判断自己的位置,并道出了为什么HTML5在移动端不适用的原因:

照片分享, 浏览相关的功能极度依赖CSS Overflow Scrolling, 这一点, iOS上的浏览器支持极度不给力。 而换成Object C的Native Implementation之后, 速度快上了2倍之多。

最后,Harry从浏览器的编程模型阐述了问题的成因,并给出了技术选型的策略。

浏览器的编程模型还是90年代流行的单进程单线程 (single process single thread), 但原生实现(比如用Object C)的APP可以用多线程。 这一点带来的作用是致命的。

移动端编写APP, 可以使用多个线程, 第一个线程, 被称作主线程(main thread), 编程的第一原则是don’t do heavy work on main thread。 通常只让它处理UI事件等, 其他重度的工作让其他背景线程来做。

但浏览器只有一个线程, 所有的事情都是它干。移动浏览器编程一上来就破了第一原则。

在台式机上, 浏览器编程还没有太多问题, 因为够快(此外, 桌面浏览器对于Web Worker的支持也比较完善); 但在移动端, 这个弊端很明显。

我来举个例子, 比如你在用浏览器看朋友的照片, 你发的评论被发到服务器端, 此时你接着用手指往下拉屏; 此时, 服务器端返回信息, 评论发布成功, 浏览器中唯一的线程可能停止处理屏幕滚动(scrolling)而来处理服务器的返回信息, 由于移动设备的处理器(尤其单进程浏览器只能用上单核, 即使是多核手机!)和内存(处于省电原因使用低耗电的DDR1, 这一点和现在PC使用的DDR3相差甚远)的不给力, 完全可能造成滚动处理的不连续。 通常手机的刷新率是60MHZ, 即每一帧不超过15ms; 如果处理的延时大大超过15ms, 那么就会出现跳帧, 肉眼就能看出来。

这是交互操作(比如拉动, 滚动等)很多的APP, 如果是由HTML5实现, 出现拉动的时候停在那里一个很重要的原因。

所以, 如果你的APP是相对静态的, 不需要很多对于照片, 多点触摸, 多向拉动的处理, 那完全可以用HTML5来实现; 如果不是, 比如信息流的展示, 游戏等等, 还是乖乖的用原生的去实现。

使用道具 举报

回复
论坛徽章:
350
2006年度最佳版主
日期:2007-01-24 12:56:49NBA大富翁
日期:2008-04-21 22:57:29地主之星
日期:2008-11-17 19:37:352008年度最佳版主
日期:2009-03-26 09:33:53股神
日期:2009-04-01 10:05:56NBA季后赛大富翁
日期:2009-06-16 11:48:01NBA季后赛大富翁
日期:2009-06-16 11:48:01ITPUB年度最佳版主
日期:2011-04-08 18:37:09ITPUB年度最佳版主
日期:2011-12-28 15:24:18ITPUB年度最佳技术原创精华奖
日期:2012-03-13 17:12:05
 楼主| 发表于 2014-10-15 20:07 | 显示全部楼层
故事到这里还没有结束。HTML5开发专家大城小胖(微博)专门撰问《HTML5 与 ”性工能“障碍 》回应了Harry。在文中他赞同了Harry的观点:

在移动端是否采用HTML5技术, 取决于你的产品形态。
将来可能90%的应用会是HTML5, 而那10%, 可能永远也不适合HTML5。
HTML5性能的提升很大程度上将取决于低耗电高性能CPU/内存的出现, 或者电池技术的极大改善。
但他认为,HTML不支持多线程不是缺点,而是特点。

要提高HTML5的性能,不应该靠"引入多线程"来实现, 应该靠"提升单线程内处理每一项时的性能"(以及如何将大量的第一项里的工作分解)来实现。 而WebWorker 的引入, 其实就是为了提高 第1项的性能。

WebWorker 本身并不是传统的Thread模型,虽然底层是多线程实现的,但是它并没有引入同步锁 线程调度一类高级特性, 而是用简单的消息机制尽可能的保持了和单线程之间的匹配度。 换言之, WebWorker 并不是给单线程的 HTML带来的多线程特性, 而是给单线程的HTML带来了后台计算的能力。

使用道具 举报

回复
论坛徽章:
350
2006年度最佳版主
日期:2007-01-24 12:56:49NBA大富翁
日期:2008-04-21 22:57:29地主之星
日期:2008-11-17 19:37:352008年度最佳版主
日期:2009-03-26 09:33:53股神
日期:2009-04-01 10:05:56NBA季后赛大富翁
日期:2009-06-16 11:48:01NBA季后赛大富翁
日期:2009-06-16 11:48:01ITPUB年度最佳版主
日期:2011-04-08 18:37:09ITPUB年度最佳版主
日期:2011-12-28 15:24:18ITPUB年度最佳技术原创精华奖
日期:2012-03-13 17:12:05
 楼主| 发表于 2014-10-15 20:07 | 显示全部楼层
最后,大城小胖指出了HTML5现在最重要的三个问题:性能、工具和能力:

性能低下,这个事情基本上大家能够达成共识,至少和各种强大的Native展现层技术相比,确实有差距。但是这个问题不是致命的根本性问题。 当年Doom3 孤岛危机1 这些游戏出来时,也都是当时的硬件杀手,但是后来随着硬件的提升,性能问题也渐渐不再是核心问题了(这两个游戏在FPS游戏里,是真不好玩啊)。 换言之,当市场上对性能要求高的 好的产品和应用越来越多时,那些底层(浏览器 os 硬件)厂商不会坐视不理的,因为这对于他们来说 也是机会。 所以作为HTML前端工程师,我们所要做的就是尽可能的优化自己的代码,但不要被性能束缚了产品的手脚,同时在保证自己代码质量和算法没问题的情况下,行动+呼吁+等待就OK了。 当然,不要强迫HTML5去做不应该它来做的事情。

工具匮乏,从开发调试到测试维护整个过程中,确实缺少强有力的工具。这个问题在可预见的未来,应该还是比较难解决,不过对成熟的HTML开发团队而言,似乎也不是大问题,因为大家已经比较习惯和适应现在的开发环境和方式了。但是对于围绕上层应用所需要的辅助工具确实欠缺。拿HTML5游戏来说:地图编辑器、精灵编辑器、粒子效果、游戏脚本编辑器、音效管理工具、性能监控。。。等等,虽然理论上开发这些并不难,很多公司也都在尝试开发自己的基础架构,但是和unity3d flash这些比起来,还是太弱了。期待 cocos2d-x能够为我们带来不一样的局面(此处为植入广告,请林顺 王哲自行考虑所需费用)。 总之,HTML5为web应用带来了更多新的形式,不过围绕这些新形式的相关辅助工具确实还很欠缺。但是,未来可期。

能力不足,这个主要是指HTML5本身的定位和它的原则导致有很多事情是它根本做不了的。举个极端点的例子,你希望在网页里借助HTML5技术来格式化你的U盘、刻录一张CD几乎是不可能的(谁知道 HTML6789时会不会提供一组Disk API呢?)。因为很多事情根本就不在HTML的发展蓝图里。而且浏览器根本的目的是为了保证用户可以高效便捷安全的网上冲浪,这个根本目的导致了浏览器本身会存在一些制约,例如安全性上的。所以,指望HTML5能完全取代Native是不可能的,至少我觉得在我退休之前是不可能的。

各位读者,你们怎么看待HTML5的性能问题,适用场景和它的未来呢?

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 
京ICP备09055130号-4  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表