从273二手车的M站点初探js模块化编程
前言
这几天在看273M站点时被他们的页面交互方式所吸引,他们的首页是采用三次加载+分页的方式。也就说分为大分页和小分页两种交互。大分页就是通过分页按钮来操作,小分页是通过下拉(向下滑动)时异步加载数据。
273这个M站点是产品推荐我看的。第一眼看这个产品时我就再想他们这个三次加载和翻页按钮的方式,那么小分页的pageIndex是怎么计算的。所以就顺便看了下源码。 提到看源码时用到了Chrome浏览器的格式化工具(还是朋友推荐我的,不过这个格式化按钮的确不明显,不会的话自行百度)。
三次加载和分页思路分析



1、从页面最底部的分页数量来看,只设置了25页而不是随着翻页数量的变化而动态设置,也就是说只能看到最新的25页数据。再换句话说这里的分页数量是固定死的,无法查看历史数据。
2、从第一张图中可以看出,每页的首屏数据是【同步的方式加载】。
3、从第三张图中可以看出,当你第二次下拉和第三次下拉时从右边的报文中看出,第二次和第三次分别是【异步刷新】加载数据。在NetWork中看出,异步加载数据时请求ajax.php?module=getCarSalePost. POST请求。重点就在POST请求的数据上。 第二次请求的POST数据:page:2、filter:/car/、need_bak。
异步记载数据时page是怎么计算的?
filter不用说是大分页每次的页码和其他附加条件。need_bak没搞懂是什么参数。OK,那看到这里无非就是搞清楚这个page是怎么计算的,通常我们都是分页公式,(pageIndex-1)* pageSize。Skip()、 Take()之类的方法。 一开始我就钻了个牛角尖,忘了他每页的【首屏数据是同步方式加载】的,这就计算了好几次公式都不对。OK。思路通了就开始看他们的源码。F12. 格式化、下断点。

从ajax.php?module=getCarSalePost关键字搜索,很容易就找到上面这段代码。当然我最关心的就是这个方法的第二句代码:s=3*n-(3-i)。还有就是ajax的success事件中他们用到了history.replaceState({page:999},"","#"+s); 改变地址url而页面不刷新的。 HTML5 API新增的pushState()和replaceState()。n代表什么? i又是什么值呢?
n就是大分页的页码。第二页那n=2. i的变量在下面找到定义i=2也就是说他这里的计算是从小分页第二页开始的。 第一页也就是是首屏是同步的方式记载的。看到这里基本上这个三次加载和分页的思路就摸清楚了。
分析完这个我又整体看到了下他们的代码发现用到了define关键字。这就又开始了解下js模块化编程。
初探js模块化编程(CommonJs、AMD规范、CMD规范)
初次接触js模块化编程是在学习node.js的过程,require、exports。众所周知node.js是采用了CommonJs。
在接触CommonJs、AMD、CMD前我们先了解下什么是模块化、模块化开发。
模块化是指在解决某一个复杂问题或者一系列的杂糅问题时,依照一种分类的思维把问题进行系统性的分解以之处理。模块化是一种处理复杂系统分解为代码结构更合理,可维护性更高的可管理的模块的方式。可以想象一个巨大的系统代码,被整合优化分割成逻辑性很强的模块时,对于软件是一种何等意义的存在。对于软件行业来说:解耦软件系统的复杂性,使得不管多么大的系统,也可以将管理,开发,维护变得“有理可循”。
AMD和CMD
node.js中的模块化编程就是参照CommonJs实现的。在CommonJs中有一个全局方法require()。用于加载模块。 有了服务端模块以后,很自然大家就希望在浏览器端也有模块化编程。而且最好两者能够兼容,在服务端和客户端都能运行。
CommonJs规范虽好但却不适合浏览器环境,因为require是同步方式运行,每引用一个lib就必须等待加载完成,也就是说加载时间过程的话浏览器就会假死,整个应用会停顿在哪里。因此,浏览器端的模块不能采用不同的方式记载,只能采用异步的方式记载,这就是AMD规范诞生的背景。
AMD(Asynchronous Module Definition)意思就是异步模块定义。它采用异步的方式加载,模块的加载不影响后面语句的运行。所有依赖这个模块的语句,都定义在一个回调函数中,等到加载完成之后,这个回调函数才会运行。
目前采用AMD规范实现的Javascript库 require.js。
require.js 主要解决两个问题:
1、 多个js可能有依赖关系,被依赖的文件需要早于依赖它的文件加载到浏览器
2、 Js加载的时候浏览器会停止渲染页面,加载文件越多,页面失去响应时间越长。
CMD(Common Module Definition),该规范明确了模块的基本书写格式和基本交互原则。在CMD规范中,一个文件就是一个模块,基本定义如下:
define(factory) 。define是一个全局函数用来定义模块,接受参数factory,factory可以是一个函数,也可以是一个对象或字符串。define({"foo":"bar"})。
AMD和CMD又是什么区别呢? AMD是提前执行,CMD是延迟执行。AMD速度快,会浪费资源,预先加载所有的依赖,直到使用的时候才执行。CMD只有真正使用才加载依赖,性能较差,直到使用时才定义依赖。
总结
了解了CommonJs、AMD、CMD的基本概念后还需要对其代表的典型框架投入使用,如requirejs、seajs。 主键改造项目中纯function的现状和项目迭代因人为差异带来的成本。
参考资料
http://www.cnblogs.com/skylar/p/4065455.html
https://github.com/seajs/seajs/issues/277
https://www.douban.com/note/283566440/
http://blog.chinaunix.net/uid-26672038-id-4112229.html
从273二手车的M站点初探js模块化编程的更多相关文章
- require.js实现js模块化编程(一)
1.认识require.js: 官方文档:http://requirejs.org/RequireJS是一个非常小巧的JavaScript模块载入框架,是AMD规范最好的实现者之一.最新版本的Requ ...
- require.js实现js模块化编程(二):RequireJS Optimizer
require.js实现js模块化编程(二):RequireJS Optimizer 这一节,我们主要学习一下require.js所提供的一个优化工具r.js的用法. 1.认识RequireJS Op ...
- 初步理解require.js模块化编程
初步理解require.js模块化编程 一.Javascript模块化编程 目前,通行的Javascript模块规范共有两种:CommonJS和AMD. 1.commonjs 2009年,美国程序员R ...
- [转]js模块化编程之彻底弄懂CommonJS和AMD/CMD!
原文: https://www.cnblogs.com/chenguangliang/p/5856701.html ------------------------------------------ ...
- js模块化编程总结
大家都知道,js中的变量(variable)有其作用范围,比如:函数里用var定义的变量在函数外是看不到的,而定义在函数外面的变量(不能有没有var修饰)均是全局变量,在js程序的任何位置都可以访问. ...
- js模块化编程之彻底弄懂CommonJS和AMD/CMD!
先回答我:为什么模块很重要? 答:因为有了模块,我们就可以更方便地使用别人的代码,想要什么功能,就加载什么模块.但是,这样做有一个前提,那就是大家必须以同样的方式编写模块,否则你有你的写法,我有我的写 ...
- 好文推荐系列-------(5)js模块化编程
本文主要来源于阮一峰的<Javascript模块化编程>系列文章整合,原文地址:http://www.ruanyifeng.com/blog/2012/10/javascript_modu ...
- JS模块化编程(一):CommonJS,AMD/CMD
前言 模块化是什么? 为什么采用模块化? 场景: 一个html,因不同的业务需求开发,会不断的引入js文件.另外,a.js和b.js中的变量或函数必须是全局的,才能暴露给使用方. <script ...
- JS模块化编程(二)
背景 我们常在页面引用js遇到下面情况 <script src="1.js"></script> <script src="2.js&quo ...
随机推荐
- 详解树莓派Model B+控制蜂鸣器演奏乐曲
步进电机以及无源蜂鸣器这些都需要脉冲信号才能够驱动,这里将用GPIO的PWM接口驱动无源蜂鸣器弹奏乐曲,本文基于树莓派Mode B+,其他版本树莓派实现时需参照相关资料进行修改! 1 预备知识 1.1 ...
- 前端网络、JavaScript优化以及开发小技巧
一.网络优化 YSlow有23条规则,中文可以参考这里.这几十条规则最主要是在做消除或减少不必要的网络延迟,将需要传输的数据压缩至最少. 1)合并压缩CSS.JavaScript.图片,静态资源CDN ...
- 在Ubuntu下搭建ASP.NET 5开发环境
在Ubuntu下搭建ASP.NET 5开发环境 0x00 写在前面的废话 年底这段时间实在太忙了,各种事情都凑在这个时候,没时间去学习自己感兴趣的东西,所以博客也好就没写了.最近工作上有个小功能要做成 ...
- 8.仿阿里云虚拟云服务器的FTP(包括FTP文件夹大小限制)
平台之大势何人能挡? 带着你的Net飞奔吧!:http://www.cnblogs.com/dunitian/p/4822808.html#iis 原文:http://dnt.dkill.net/Ar ...
- vue双向数据绑定原理探究(附demo)
昨天被导师叫去研究了一下vue的双向数据绑定原理...本来以为原理的东西都非常高深,没想到vue的双向绑定真的很好理解啊...自己动手写了一个. 传送门 双向绑定的思想 双向数据绑定的思想就是数据层与 ...
- 高效而稳定的企业级.NET Office 组件Spire(.NET组件介绍之二)
在项目开发中,尤其是企业的业务系统中,对文档的操作是非常多的,有时几乎给人一种错觉的是”这个系统似乎就是专门操作文档的“.毕竟现在的很多办公中大都是在PC端操作文档等软件,在这些庞大而繁重的业务中,单 ...
- 由js apply与call方法想到的js数据类型(原始类型和引用类型)
原文地址:由js apply与call方法想到的js数据类型(原始类型和引用类型) js的call方法与apply方法的区别在于第二个参数的不同,他们都有2个参数,第一个为对象(即需要用对象a继承b, ...
- 自己来实现一个简易的OCR
来做个简易的字符识别 ,既然是简易的 那么我们就不能用任何的第三方库 .啥谷歌的 tesseract-ocr, opencv 之类的 那些玩意是叼 至少图像处理 机器视觉这类课题对我这种高中没毕业的人 ...
- Html.DropDownLis绑定数据库
效果: 方法一: View: <div class="col-md-md-4"> <div class="input-group"> & ...
- 负载均衡——nginx理论
nginx是什么? nginx是一个强大的web服务器软件,用于处理高并发的http请求和作为反向代理服务器做负载均衡.具有高性能.轻量级.内存消耗少,强大的负载均衡能力等优势. nginx架构? ...