如何提高网站的可爬行性

我们花费心思引来蜘蛛,无非是希望其索引网站。而一个可爬行新高的网站意味着蜘蛛索引极具深度及广度,从而也会使其为我们带来更多的收录及更均衡的权重。那如何建立一个高爬行性的网站呢?
一、网站层次结构

要利于蜘蛛爬行,首先得有一个清晰的层次结构。树形结构是比较理想的网站结构,蜘蛛能够很好的理解并爬行。采用首页-索引页-内容页的形式有利于用户在最短的时间内找到需求的信息。而且由于相关性极强的内容在同一栏目下,提高了聚合度,这样更有利于蜘蛛的爬行整合。同时,树形结构应该遵循层数尽可能少的原则。

二、网站导航、次导航、面包屑

网站导航是网站不可或缺的重要组成部分。采用统一的导航栏不仅有助于用户体验,更有助于蜘蛛识别。由于蜘蛛能有效识别并爬行css。因此,对于导航栏字体使用font-weight属性是有效的。但切勿因为追求效果而采用js、ajax、inframe、flash等蜘蛛无法有效爬行的技术。次导航同样可以使用font-weight属性表明重要性,而面包屑导航也是必不可少的,要注意尽量避免使用url链接,而更多采用锚文本链接。

三、内容页

新的内容应尽量出现在蜘蛛频繁更新的地方。因此,内容页应按ID或发布时间排序。而每篇内容页应和其他页面有效链接。可以在内容结束后加入上一篇、下一篇窜连上下篇文章。同时可以增加相关阅读、推荐阅读等栏目,这样更有助于蜘蛛索引。

四、标签、标签云

标签、标签云是提高聚合类内容可爬行性的有效途径。而标签云采用不同颜色、不同大小、不同粗细以区分不同用户关注度的内容。因该说无论从用户体验还是索引的主次都是有益的。但不应为追求标签云效果,而采用jquery等技术,这样就失去了标签云的SEO意义。

五、Sitemap

Sitemap文件对于蜘蛛的索引是很重要的。Sitemap的制作不是本文讨论的重点。如果你的站点规模不是很大,请尽量采用.xml格式,并放置于根目录下。百度sitemap工具正在内测中,因此暂时无法提交sitemap文件,我们只能采用提交网页的方式,提交新的页面。

[ 1 条评论 ] 收藏、分享这篇文章!

月影MM对面向对象,原型,函数式的理解

“面向对象”其实好比是人类成年期学习和整理知识的方法
——把知识分门别类
比如猫、老虎,都属于猫科动物
class 猫 extends 猫科动物
class 老虎 extends 猫科动物
描述的就是这种认知世界的方式

而“原型”是另一种认知世界的方式,是人类与生俱来的,幼年时期的学习方式
小孩子问父母,老虎是什么
父母可能会回答小孩,老虎很像体型较大的猫
或者说,小孩的意识里“猫”和“老虎”相似
用原型体系来表示,就是

猫.prototype = 一只老虎
或者 老虎.prototype = 一只猫
对于小孩来说,从猫认识老虎,再把它们不一样的部分特别说明
这就是原型体系

所以原型体系就是没有分类的、人类原始认知世界的方式

函数式:functional是什么体系,那个其实是数学体系
functional描述世界的方式和数学家描述世界的方式一致
所以functional的抽象基于数学抽象,它在数学公式、算法的描述上占优势,class的抽象基于类别类系的抽象,prototye的抽象基于形似性的抽象。

 

 

[ 1 条评论 ] 收藏、分享这篇文章!

HTML5doctor

参考:

http://html5doctor.com/avoiding-common-html5-mistakes/

http://html5doctor.com/the-article-element/

http://html5doctor.com/the-section-element/

http://www.brucelawson.co.uk/2010/html5-articles-and-sections-whats-the-difference/

http://boblet.tumblr.com/post/134732913/html5-structure3

http://html5doctor.com/aside-revisited/

http://html5doctor.com/nav-element/

http://html5doctor.com/the-header-element/

http://www.w3.org/TR/html5/sections.html#the-header-element

http://html5doctor.com/html-5-reset-stylesheet/

[ 留下评论 ] 收藏、分享这篇文章!

从网站备案看IDC

域名备案:针对有网站的域名。(没有网站的域名不需要备案),可以看出,要备案必须要有网站,也就是必须要有一个空间(服务器或虚拟主机),但是现在只有cn域名有这个要求。

由于国内主机要求先备案后接入(先获得网站备案号才能使用域名打开网站),让很多个人站长建网站信心受阻,在此种情况下出现了“免备案空间”这一词语,有人把“免备案空间”也叫做“免备案主机”或“免备案虚拟主机”。

这样, 如果用国外的主机,就可以绕过备案程序

好像很久以前CN域名就必须要备案了,于是IDC也有了新的赚钱方式。

对于IDC来说,我注册了一个IDC提供商的cn域名,你要备案吧,好的,我给你提供备案接口,但是你必须通过我的网站来备案,也就是你必须要买我的虚拟主机,要不我就不给你备案,你自己去公安局备吧!也就是说,你买了我的cn域名,好的,那就必须要买我的虚拟主机了。利用政策来做捆绑式销售,这个就是IDC的手段。

[ 留下评论 ] 收藏、分享这篇文章!

SeaJS 和 RequireJS 的异同

1. 遵循的规范不同

RequireJS 遵循的是 Modules/AMD 规范。

SeaJS 遵循的是 Mdoules/Wrappings 规范的 define 形式。

AMD 规范在 CommonJS 社区争议很大,规范里太多 RequireJS 的影子。社区里不少人反感 RequireJS 打着 CommonJS 的口号,甚至建议 AMD 自立门户,比如最近的这篇讨论:Split off AMD?

从这两个规范本身来说,Modules/Wrappings 规范更简洁优雅,不信的话,你读读它们各自的描述就清楚。
2. factory 的执行时机不同

在 RequireJS 里,模块有多种书写格式,推荐的是:

define(["./a", "./b"], function(a, b) {
a.doSomething();
b.doSomething();
});

在 SeaJS 里,模块只有一种书写格式:

define(function(require, exports, module) {
require("./a").doSomething();
require("./b").doSomething();
});

SeaJS 的模块书写格式,RequireJS 也支持。为了便于讨论,我们称呼 define 方法中的 function 参数为模块的 factory. 无论是在 RequireJS 还是 SeaJS 里,在执行 factory 之前,都会确保依赖的模块已经下载好:

/* a.js */
define(factory);

/* b.js */
define(factory);

/* c.js */
define(['./a', './b'], factory);

每个模块都有自己的 factory. 在 AMD 的书写格式下,上面例子中,模块 c 的 factory 在执行时,会接收 a 和 b 两个参数。这意味着,c 依赖的所有模块,都是在一开始就得执行好,即便有可能不需要执行,比如:

define(function(require) {
// BEGIN
 if(some_condition) {
   require('./a').doSomething();
 } else {
   require('./b').soSomething();
  }
  // END
});

在 AMD 规范里,在 BEGIN 处,a 和 b 的 factory 都已经执行好。在 Wrappings 规范里,在 BEGIN 处,a 和 b 的 factory 还没未执行,在 END 处时,根据条件,只会执行其中一个。

可以看出,Wrappings 规范更“懒”,更节省 CPU. 更符合 nodejs 等环境下的使用习惯。

AMD 规范只所以采用提前执行,可以参考作者的说明:Standards and proposals for JavaScript Modules and jQuery, 提到了两点理由,但并不被社区认可。我个人觉得这是一种权衡,但是是一种糟糕的权衡,破坏了与 Modules/1.0 规范的和谐性。有兴趣的可以搜索 Google Groups, 有相当多的讨论。

Wrappings 规范则尽可能的保留了 Modules/1.0 规范中的习惯。权衡点在于,对于条件语句中 require:

if(true) {
  require('./a').doSomething();
} else {
  require('./b').soSomething();
}

在 node 等环境中,能直接同步读取文件,可以做到只加载和执行模块 a, 不加载模块 b. 但在浏览器端,要实现这点,很困难(可以通过类似 Jscex 的方式来实现,但复杂度急增)。面对现实,目前基本所有浏览器端的 loader, 都是把依赖的模块都下载下来。从打包部署的角度考虑,这样做并不会对性能造成影响,反而能让不同条件分支,共享同一缓存。Wrappings 规范的提前下载和延迟执行,是一种合理的权衡。
3. 设计理念不同

如果你用过 RequireJS, 会知道:require 方法极其灵活,比如下面这些:
require(‘a’) — gets exports of module a
require(['a']) — fetch module a according to module name scheme
require(['a.js']) — fetch a.js directly relative to current page
require({…}) — set loader config

稍微有点变化,做的事情就不一样,个人很不喜欢,社区里也有不少人讨厌这种风格。

在 SeaJS 里,API 的设计理念是:

保持简单,职责单一。
遵守规范,但不拘泥。
适度灵活。

SeaJS 的公共 API 只有 8 个:速查手册, 职责很清晰,简单明了。

不拘泥规范,大家可以看到,SeaJS 里并没有采用 Modules/Wrappings 规范里的 module.declare. 这是因为:

module.declare(function(require, exports, module) {
  module.id // 这是参数 module
});

module.declare(function(require, exports) {
  module.id // 这是全局 module
});

显然,module.declare 导致 module 变量和 this 一样,随着环境的变化而变化。对于新手来说,这会带来迷惑。不如直接引入 define 来得简洁明了。随着 RequireJS 的推广,大家对 define 的接受程度也更高,更容易被理解。还有一个好处:使得 SeaJS 的模块,理论上讲,可以直接运行于 RequireJS 上。

适度灵活,举个例子:

seajs.use("./a"); // 加载一个模块
seajs.use(["./a", "./b"]); // 加载多个模块

4. 聚焦点有差异

SeaJS 从一开始,到现在,都是 focus on web, 努力成为浏览器端的模块加载器。sea.js 源码里,只有和浏览器相关的代码,不像 requirejs 一样,牵三挂四,有为了能在 Rhino 和 node 下运行的代码,甚至还有为了与 jQuery 集成的代码。聚焦的好处之一是,能减少文件大小:

SeaJS 目前的大小是:3.2K (gzip)
RequireJS 的大小是:5.4K (gzip)

seajs 的源码,目前是分多个文件开发的,每个文件都很聚焦,有完善的测试用例。requirejs 目前依旧是一个大文件,不利于维护。
5. 最后,还是理念不一样

RequireJS 有一系列插件,功能很强大,但破坏了模块加载器的纯粹性,个人觉得不妥。

SeaJS 则努力保持简单,追求简洁之美。除非必要,勿增实体。在功能上,SeaJS 有个优势是,支持 CSS 模块的加载。RequireJS 因为技术原因,目前版本尚未实现。
最后的最后

根据实际需求选择就好,关键是要养成模块化开发的好习惯。

[ 留下评论 ] 收藏、分享这篇文章!

【翻译】css lint 需要注意的

  • 不要用邻接的class
    给display指定适当的属性
    不要用太多的float
    包含所有gradient定义
    不允许!important
    不要用看上去像正则的选择器
    不要用值为0的单位
  • 注意破坏的盒模型
    避免重复的属性
    不要用太多的font
    不要用IDs
    不要用overqulified 如:element.my-class
    heading应该仅仅被定义一次 (h1-h6)
  • 用前缀来定义一些可能的标签 如: -moz -webkit
    不允许空的规则
    不要用太多的font-size
    避免@import
    不要用qualify headings 如: .head h1
    正确使用厂商的前缀 如: -moz -webkit

reference: http://csslint.net/

[ 留下评论 ] 收藏、分享这篇文章!

Timed array processing in JavaScript

//Copyright 2009 Nicholas C. Zakas. All rights reserved.
//MIT Licensed
function timedChunk(items, process, context, callback){
    var todo = items.concat();   //create a clone of the original

    setTimeout(function(){

        var start = +new Date();

        do {
             process.call(context, todo.shift());
        } while (todo.length > 0 && (+new Date() - start < 50));

        if (todo.length > 0){
            setTimeout(arguments.callee, 25);
        } else {
            callback(items);
        }
    }, 25);
}

来自:http://www.nczonline.net/blog/2009/08/11/timed-array-processing-in-javascript/

[ 留下评论 ] 收藏、分享这篇文章!

微博非官方生存法则 (二)

想走实用路线

多关注团购的官方微博

只要保持足够理智和谨慎,时常看看团购信息还是很有用的,比如买买电影票,吃吃饭。

关注一些航空公司或者旅游局的官方微博

比如亚航和春秋,打折机票的信息总是第一时间发布在他们的官方微博上,如果秒杀到了的确很划算。

多关注一些做菜高手和美食达人的微博

下班前看一看,说不定就有效解决了晚上吃什么的难题。

帮助求职

关注自己感兴趣的领域里的公司,哪天看到他们在招聘,说不定就成了。

选择性关注靠谱的影评

能少看很多烂片,这样不但节省不少时间,还可保持心情愉快。

签到

一般来说签到这件事对观众还挺实用的。在选择困难症普遍存在的今天,给一群不知道自己该去哪里干吗的人指明方向真是一件利人利己的好事。
更多…

[ 留下评论 ] 收藏、分享这篇文章!