特色文章

收集slidershare高质量的ppt

http://www.slideshare.net/rainoxu/javascript-5464018  javascript性能优化

http://www.slideshare.net/fool2fish/js-12953769 js高级技巧 demo在http://fool2fish.aliapp.com/js-senior-skill/index.html

http://www.slideshare.net/iddcn/ss-12153414 高粒度模块化前端开发

http://www.slideshare.net/kejun/ss-9015786 前端开发理论热点面对面

http://www.slideshare.net/firt/mobile-web-high-performance 高性能移动端开发(E文)

http://www.slideshare.net/nzakas/writing-efficient-javascript 高效率书写javascript

 教主的ES5演讲

http://v.youku.com/v_playlist/f15769239o1p4.html

http://v.youku.com/v_playlist/f15769239o1p5.html

http://v.youku.com/v_playlist/f15769239o1p6.html

 

 Real-Time Web实时信息流推送

http://www.docin.com/p-467150624.html

阿里巴巴adc  http://adc.alibabatech.org/  内有大量ppt

 

手把手教你写一个数学表达式解析器(2) parser

上回我们研究了一下词法分析的原理跟简单实现,那么这篇我们来了解下编译器中更加复杂的 语法分析的实现。

简单来讲,这一步就要完整地分析整个编程语言的语法结构,之后生成一个语法树来解释执行。

了解语法分析之前,我们先看看表达式长什么样:
1
1+2
3-4+5
4+5*6
2+(5-1)
这种表达式结构是无法使用正则来描绘的,因为表达式有无限个状态。因此我们要引入一种表现能力更强的语言——上下文无关语言。而讲解上下文无关语言之前,我们先了解一下产生式

假设1是一个表达式,1+2是两个表达式相加的表达式,(1+2)是一个括号表达式。我们用符号E来表示一个表达式,那么这三种表达式分别可以定义为:
E → 1
E → E + E
E → ( E )
那么上面这些鸟语是什么意思呢,这些鸟语就叫作产生式,E叫做非终结符,表示E可以产生新的东西。 而 →右边表示一个E能够产生啥东西。
注意上面 + ( 还有1 这些符号不能产生别的东西,因此这些符号称作 终结符

那说了这么些鸟语是为了干什么呢?我们的目标是将一个表达式推导,把里面所有的E都产生出来,那么这个推导的结果顺便就生成了一个语法分析树

我们现在来推导一下 表达式 (1+2)+3 推导的方式有两种,每次把最左边的E“产生”跟最右边的E“产生”,其实就是两种不同的分析方法。

从左边产生:
E => E + E => (E) + E => (E + E) + E => (1 + E) + E => (1 + 2) + E => (1 + 2) + 3
从右边产生
E => E + E => E + 3 => (E) + 3 => (E + E) + 3 => (E + 2) + 3 => (1 + 2) + 3

如果我们把推导的这个过程变成一棵树,树的每一个节点都是一个非终结符E或者终结符,其中终结符都是树的叶子结点(没有子节点),而非终结符E都是有子节点的,那么我们就得到了语法分析树。 举例来讲,刚才的推导过程我们会得到这么一颗树。

tree

注意一点,两种方法推导都会得到同样一颗树。这说明这是两种不同的分析方法。
但另外一些语法分析的输入,可能存在多种语法分析树, 这称为歧义。

我们再看一个例子:
1*2+3
从左边产生:E => E + E => E * E + E => a * E + E => a * b + E => 1 * 2 + 3

从左边产生:E => E * E => a * E => a * E + E => a * b + E => 1 * 2 + 3

注意了吗,第一步是不一样的,我们可以认为1*2是一个E,同样也可以认为1是一个E,2+3是一个E,而这两步得到的语法分析树显然是不一样的:

tree2

上面两个图的不同其实是体现了运算符优先级的不同。如果按照推导1的语法树,应该先将a和b相乘,再加上c;而如果按照推导2的语法树,则应该先把b和c相加,再和a相乘。我们如果要避免这种情况,就需要人为去规定产生式:

F → id
F → ( E )
T → T * F
T → F
E → E + T
E → T

在以上的产生式中,我们发现,T跟F里面都不能产生出+号,只能出现括号跟id。且如果遇到了多个+或者*,要首先从左侧开始运算。这样的结果是乘法比加法的优先级更高,且运算符符合左结合率。(http://en.wikipedia.org/wiki/Order_of_operations)

说完了这么多后,我们的理论基础也差不多了,可以根据这样的思想进行编码了。我们采用从左到右推导的方式,也就是所谓递归下降(recursive descent)法。(更多可参考http://en.wikipedia.org/wiki/Parsing#Parser)

我们来看看编写递归下降语法分析器的一般步骤:

使用一个索引来记录当前扫描的位置。通常将它做成一个整数字段。
为每个非终结符编写一个方法。
如果一个非终结符有超过一个的产生式,则在这个方法中对采用哪个产生式进行分支预测
处理单一产生式时,遇到正确终结符则将第一步创建的扫描索引位置向前移动;如遇到非终结符则调用第二步中创建的相应方法。
如果需要产生解析的结果,在方法返回之前将它构造出来。

之后开始写代码,我们首先要列一下产生式

上面其实也是运算顺序: 括号>一元操作符>乘法除法>加法减法> =号

另外上面提到了分支预测,分支预测怎么做呢?分支预测的方法是超前查看(look ahead)。就是说我们先“偷窥”当前位置前方的字符,然后判断应该用哪个产生式继续分析。非终结符Multiplicative的三个产生式会产生三种结果,于是我们“观察”产生式右侧所有出现Multiplicative的地方,根据实际情况来处理。反应到代码里就是 token = lexer.peek(); 这一句了。peek跟next的实现是这样的:

我们分别为上面的非终结符编写parser,并带有运算顺序:

最开始 assignment

接下来 Additive,处理加法操作

接下来是 Multiplicative,处理乘除法

接下来是Unary 这里会存在多个+-的情况,剩下的+-继续交到parseUnary中

在我们实际应用中,还有一种表达式是类似 x= sin(3)这种函数的,这样的函数也可以归类到Primary中,因此我们补充产生式

同样在这里我们认为函数调用优先级最高。这时候就可以写Primary的解析了:

下面是functioncall 仍然采用分支预测的方法处理:

最终生成了语法树。完整代码可见:http://jsbin.alif2e.com/jug/1/edit

 

手把手教你写一个数学表达式解析器(1) tokenizer

由于项目中需要解析一些表达式,但这些表达式直接使用eval进行解析的话会遇到不可预知的安全问题。因此最近学习了编译原理相关,给大家讲讲如何写一个数学表达式解析器。

第一部分是 如何进行词法分析(Lexical analysis),也就是如何写一个lexer或scanner或tokenizer(就是经常看到的程序员约架手写tokenizer的tokenizer)。词法分析是什么东西呢?

词法分析阶段是编译过程的第一个阶段,是编译的基础。这个阶段的任务是从左到右一个字符一个字符地读入源程序,即对构成源程序的字符流进行扫描然后根据构词规则识别单词(也称单词符号或符号),按照过程来讲:

输入:一堆字符,即我们写的语法代码,一个文件,也就是一堆字符;
经过lexer处理;
输出:一系列的token,相当于一堆的变量或者说符号;

词法分析生成的token只是第一部,第二部是语法分析,我们接下来的文章再讲。

因此编写词法分析需要两个阶段
单词化,即把输入的字符串分割
评估器 是为了把单词“评估”为固定的值。 举例来讲
x = 6 + 7 进行词法分析后的结果:

类型
Identifier x
Operator =
Number 6
Operator +
Number 7

了解了词法分析的原理,我们就可以开始coding了,我们的目标是解析出identifier,operator以及number三种类型的token。

首先我们写三个工具函数来判断字符类型,这三个工具函数用来判断是否是空白字符、是否是英文字符、是否是数字。

另外我们有一个工具函数来返回每个字符(token)的类型跟值

之前提到我们需要从左到右一个字符一个字符的去读源码,那么这个读取源码的工具也需要写一下

在数学表达式中,空格我们可以直接忽略掉

之后我们就可以写第一个operator的评估器:判断是否为操作符,我们先支持简单的加减乘除括号的解析:

还有一点要提到的是,很多语言中变量都可以以_开头的,且变量也可以由数字或者字母组成。因此我们对于identifier的评估器可以这么写
两个工具函数:

解析一串连续的字符,并判断这一串字符是一个identifier
function scanIdentifier() {
var ch, id;

最后我们要写最复杂的number的解析了。

我们认为数字的开头一定是数字或者小数点。

注意number可能有几种类型以及分别处理:
最简单的纯数字 99及
小数点 0.1415

科学计数法
2.4e-20

然后呢,最终我们需要一个函数来让整个字符都“流过”以上三个解析器。

ok,完成了,demo可以见http://jsbin.alif2e.com/xab/3,我们完成了第一步,词法解析

+

 

应用限流策略(待写)

令牌桶算法及解释

http://www.cnblogs.com/zhengyun_ustc/archive/2012/11/17/topic1.html

nodejs令牌桶实现

https://github.com/jhurliman/node-rate-limiter

走redis的

https://github.com/joshdevins/node-rate-limiter-proxy/blob/master/node-rate-limiter-proxy.js

https://github.com/ivolo/express-rate

https://github.com/ded/express-limiter

https://github.com/tj/node-ratelimiter

基于stream

https://github.com/einaros/ratelimit

强制限流

https://github.com/AdamPflug/express-brute

 

loopback的

http://strongloop.com/strongblog/node-js-loopback-api-gateway-sample-applications/

https://github.com/strongloop/loopback-gateway

基于ip

https://github.com/cloudkick/rate-limiter

nodejs应用安全方案

1.安全相关http头控制

X-XSS-Protection

http://wangye.org/blog/archives/596/

默认开启此头,提供配置关闭这个头,因为这个头可能会对页面内脚本造成影响。

X-Content-Type-Options:nosniff
默认开启 减少 MIME 类型的安全风险,主要防范MIME sniffing功能的跨站点脚本攻击 http://tech.hexun.com/2009-03-02/115137005.html
http://technet.microsoft.com/zh-cn/gg622941(v=vs.85)

X-Download-Options:noopen
默认开启,禁止浏览器打开下载的文件。让浏览器随便打开这些用户上载的文件,非常危险。http://www.cnblogs.com/kaneboy/archive/2011/05/16/2437077.html

X-Powered-By
为了隐藏服务器细节,防止针对性的漏洞攻击,默认设置为null。用户可以自定义。

X-Frame-Options 主要为了防止页面内嵌iframe造成攻击,为了避免影响页面其他需求, 提供三个属性可以让用户配置,DENY,SAMEORIGIN,ALLOW-FROM
https://developer.mozilla.org/en-US/docs/HTTP/X-Frame-Options?redirectlocale=en-US&redirectslug=The_X-FRAME-OPTIONS_response_header

Strict-Transport-Security 主要为了使用户在使用http访问要求用https访问的网页时,自动跳转到http。

Access-Control-Allow-Origin
禁止使用*,限制在白名单内,且跨域请求必须经过审核才可以上线。

2.模板引擎层面控制

模版引擎默认转码。
提供七个工具函数做为输出转码工具:

HTML转义:escapeHtml

XML转义:escapeXml()

文本转义 escapeText

JS转义:escapeJs

URL转义:escapeUrl

URL安全转义:escapeSeUrl 转义时同时检查是否是安全url

JSON转义:escapeJson 对json的value进行html和javascript转义

3.应用层控制

重写redirect

加入白名单,若出现不良跳转(如攻击者构造url)一律block掉。

sla限流策略

对应用限制最大连接数,防止崩坏

禁止trace

关闭应用对trace方法的支持

crossdomain

对于涉及flash的站点,提供corssdomain文件,但是限制其访问的域
http://blog.csdn.net/summerhust/article/details/7721627

4.csrf攻击防御与jsonp安全策略

1、登陆状态下,所有请求默认强制校验cToken。可以绕过但是绕过之后,则强制检查请求Reffer是否在白名单中,也可以额外添加信任的域名。

2、对callback做长度(128字符)和字符([0-9a-zA-Z_])限制,对输出json数据过滤。 防止utf-7攻击,flash,xss。

3、ContentType标准化, json为application/json, jsonp为application/javascript。 应用层面已经实现并且挂载了nosniff

4、对jsonp输出内容前,加了2个\r\n。 配合防止utf-7,flash攻击。

5.CSP(Content Security Policy)

 

cors,postmessage,eventsource相关

http://www.ibm.com/developerworks/cn/web/1301_jiangjj_html5message/

https://developer.mozilla.org/zh-CN/docs/Server-sent_events/Using_server-sent_events

https://github.com/Yaffle/EventSource

 

ajax分段上传

http://www.atatech.org/article/detail/11502/0

 

cors

http://www.atatech.org/article/detail/9010/0

做真正的全栈开发工程师(1)

最近我厂的前后端分离非常火。很多同事也在研究。但事实上给我启发最大的是http://www.zhihu.com/question/23512853  这个问答第一个回答:

 

1,不可忽视的后端技术门槛
不能不提这茬,即便midway很务实的只挑选了视图层作为主攻方向,但不可避免的控制器层还会带进来大量技术问题需要解决,比如配管、部署、日志监控、运维工具、SOA、加解密、事务、缓存策略、消息队列、异步调用、安全问题,总有避不开的暗礁。对阿里目前的后端技术栈来说,这些技术背后是无数的系统和平台,缺一不可,midway目前还是个玩具。更何况nodejs/web framework本身都在飞速演变之中,ES5到ES6,技术特性变化剧烈。即便由前期探路者完成了基础设施建设,后期他人进入的学习成本也非常高。时间长了,前端工程师本身又自然会分化成纯前端和nodejs工程师,如此前后端天然又产生了隔阂,呵呵,分久必合,合久必分。

 

事实上阿里巴巴有非常多非常多的平台,但对于我这个前端工程师来讲,很多东西在我的知识体系内都无法理解。为了让自己真正能“进化”成一个有理想有抱负的工程师,我计划学习后端相关的内容。

1 日志解析  我来公司做的第一个项目就是基于日志解析出的结果来做的,但如何从海量的日志中解析出东西?

2 事务 事务这种东西应用在什么场景上?

3 消息队列,同事务

4 后端安全,如何保证服务器的稳定性?如何保证服务器在出错或者高并发之类不会挂掉?

5 监控 监控一个系统是否稳定,指标是什么?如何通过某种具体场景来检验/测试某系统的稳定性?

6 数据库操作  事务 脏读,不可重复读,幻读都怎样避免?

7 接口设计,如何设计一个优雅的restful接口?

8 多线程,多进程,多核。。

今天的收获 http://www.cnblogs.com/adforce/archive/2011/04/20/2021929.html

脏读、不可重复读 共享锁、悲观锁 和 事务五种隔离级别

浏览器缩放检测

测试代码

http://jsbin.com/dipijeqi/11

 

效果:

 

chrome

window.devicePixelRatio : 2  (准确)
screen.deviceXDPI / screen.logicalXDPI : NaN
window.outerWidth / window.innerWidth : 2
document.documentElement.offsetHeight / window.innerHeight : 0.020618556701030927 (有相关性)
window.top.outerWidth / window.top.innerWidth : 2

ff
window.devicePixelRatio : 1.5 (准确)
screen.deviceXDPI / screen.logicalXDPI : NaN
window.outerWidth / window.innerWidth : 1.0114583333333333
document.documentElement.offsetHeight / window.innerHeight : 0.023391812865497075  (有相关性)
window.top.outerWidth / window.top.innerWidth : 1.0114583333333333
ie 8
window.devicePixelRatio : undefined
screen.deviceXDPI / screen.logicalXDPI : 1.5416666666666667 (大致准确)
window.outerWidth / window.innerWidth : NaN
document.documentElement.offsetHeight / window.innerHeight : NaN
window.top.outerWidth / window.top.innerWidth : NaN

ie11
window.devicePixelRatio : 1.5 (准确)
screen.deviceXDPI / screen.logicalXDPI : 1.5
window.outerWidth / window.innerWidth : 1.0084033613445377
document.documentElement.offsetHeight / window.innerHeight : 0.02203856749311295 (有相关性)
window.top.outerWidth / window.top.innerWidth : 1.0084033613445377
ie10
window.devicePixelRatio : undefined
screen.deviceXDPI / screen.logicalXDPI : 1.5 (准确)
window.outerWidth / window.innerWidth : 1.0084033613445377
document.documentElement.offsetHeight / window.innerHeight : 1
window.top.outerWidth / window.top.innerWidth : 1.0084033613445377
ie9
window.devicePixelRatio : undefined
screen.deviceXDPI / screen.logicalXDPI : 1.5 (准确)
window.outerWidth / window.innerWidth : 1.0084033613445377
document.documentElement.offsetHeight / window.innerHeight : 1
window.top.outerWidth / window.top.innerWidth : 1.0084033613445377

360 6.3(完全没反应)

window.devicePixelRatio : undefined
screen.deviceXDPI / screen.logicalXDPI : 1
window.outerWidth / window.innerWidth : NaN
document.documentElement.offsetHeight / window.innerHeight : NaN
window.top.outerWidth / window.top.innerWidth : NaN

360极速浏览器
window.devicePixelRatio : 1
screen.deviceXDPI / screen.logicalXDPI : NaN
window.outerWidth / window.innerWidth : 1.5
document.documentElement.offsetHeight / window.innerHeight : 0.015267175572519083
window.top.outerWidth / window.top.innerWidth : 1.5(准确)

搜狗高速浏览器 (完全没反应)

window.devicePixelRatio : undefined
screen.deviceXDPI / screen.logicalXDPI : 1
window.outerWidth / window.innerWidth : NaN
document.documentElement.offsetHeight / window.innerHeight : NaN
window.top.outerWidth / window.top.innerWidth : NaN
淘宝浏览器

window.devicePixelRatio : 1
screen.deviceXDPI / screen.logicalXDPI : NaN
window.outerWidth / window.innerWidth : 2.0710059171597632  (大致准确)
document.documentElement.offsetHeight / window.innerHeight : 0.022988505747126436
window.top.outerWidth / window.top.innerWidth : 2.0710059171597632

 

在canvas中插入html(网页截图技术的实现)(翻译稿)

mdn上翻译的文章,里面其实涉及了非常多的知识,值得学习,这个技术也是一些在线截图工具的解决方案吧。

 

https://developer.mozilla.org/zh-CN/docs/HTML/Canvas/Drawing_DOM_objects_into_a_canvas

 

尽管不常见(出于安全考虑), 但是将DOM内容—比如HTML—绘制到画布中是有可能的. 这篇文章源自Robert O’Callahan的博客, 讲到如何有把握地, 安全地实现它, 并且按照规范来.

概览

你不能把HTML画到canvas上。相反,你需要使用一个SVG图像,其中包含你想要呈现的内容。可以使用<foreignobject> 元素包含HTML内容,之后把这个svg绘制到你的canvas中。

步骤

唯一真正棘手的事情——这可能是一个夸张——创建SVG图像。所有你需要做的是创建一个包含XML字符串的SVG,然后按照下面的步骤构造一个 Blob

  1. blob对象的媒体类型mime为 “image/svg+xml”.
  2.  <svg> 元素.
  3. 在svg元素中包含 <foreignobject> 元素.
  4. (格式化好的) HTML ,被包裹到<foreignobject>中.

By using a object URL as described above, we can inline our HTML instead of having to load it from an external source. You can, of course, use an external source if you prefer, as long as the origin is the same as the originating document.

如上所述通过使用一个object URL,我们可以内联HTML而不是从外部源加载它。当然,如果你喜欢你可以使用外部源,只要域与原始文件相同。

Example

 

例子的效果:

example.png

data变量设置了SVG图像的内容(这包括HTML)我们希望绘制到我们的canvas中。

通过调用 new Image()我们建立一个新的html <img> 元素,添加数据进去,指定一个object URL, 之后在图片onload的时候调用 drawImage() 来把图片绘制到画布中.

安全性

您可能想知道这种方式是否安全,担心canvas会读取敏感数据。答案是这样的:这个解决方案的实现依赖的SVG图像是非常严格的。SVG图像不允许加载任何外部资源,即使似乎来自同一个域。资源(如栅格图像(如JPEG图像)或<iframe>s 需要用 data: URIs来内联引入.

此外,你不能在一个SVG图像中引入脚本文件,所以没有从其他脚本访问DOM的风险,而且DOM元素在SVG图像中不能接收事件的输入,所以没有办法通过把隐私信息加载到一个表单控件(如一个文件的完整路径 <input> 元素)然后渲染出来,之后通过读取像素把这些信息取出。

访问过的链接风格并不应用于SVG图像中呈现的链接,所以历史信息也不能被检索,本地的主题也不呈现在SVG图像中,这使得它很难确定用户的平台。(这里的意思应该是windows跟mac风格吧)

生成的canvas元素是纯净的,意味着你可以通过调用 toBlob(function(blob){…})来返回canvas的blob ,或者 toDataURL()来返回 Base64-编码的 data: URI.

Testing origin from their containing documents.

绘制HTML

SVG必须是合法的XML,你需要解析并把HTML转为规范的符合格式的。下面的代码可以很方便的解析HTML

 

See also

git如何处理别人的pull request及解决冲突

出过两次了,每次都查很多资料,太蛋疼,记录在此。

 

当你的项目比较牛逼的时候,有人给你贡献代码,但他修改的地方恰恰你前阵子也修改了,这样在github中就不能够自动merge了。

因此你需要手动去解决冲突。首先要在本机安装好命令行工具gitbash,之后用clone拉下你的项目,之后

按照以下命令输入

这时候命令行会提示你有冲突,冲突文件是啥,那如何解决冲突呢,很简单

在同步代码的过程中,git会自动检查冲突,并尝试进行**自动合并**。最好的情况应该是大家同时修改一个文件,但是大家修改的地方不同了。在这样的情况下,git会进行非冲突合并,这时,在调用 git pull 的时候,git会尝试进行非冲突合并。
而在合并过程中有冲突的时候, git 会把修改记录直接保存在文件中,让开发者判断文件如何解决合并。例如,在一个描述文件中同时修改了一句话,在合并的时候,git会这么做:

即把两个更改都写在文件上,但是用=======来区别发生冲突的位置,在=======以上是 HEAD,即本地的代码;而=======以下则是来自远程的更改了。这个时候,你可以选择保留远程或本地的修改或者都不要(简单地说,把不需要的内容删除即可)。

 

也就是说我们把文件修改好后,把增加的那几行head >>><<<之类删掉就ok啦。之后冲突修改完毕,我们继续输入

 

还要记着一点,本地修改代码前一定要先pull一下看看,记得慎用github的在线编辑功能

 

node-sass的介绍及使用(官方文档)

其实我很少写第三方库的介绍的,主要是node-sass确实蛮好用,而且我对ruby缺乏好感。。

 

 

node-sass

Build Status NPM version Dependency Status devDependency Status Coverage Status

Node-sass is a library that provides binding for Node.js to libsass, the C version of the popular stylesheet preprocessor, Sass.

It allows you to natively compile .scss files to css at incredible speed and automatically via a connect middleware.

node-sass提供了一个nodejs到libsass的桥梁.libsass是广受欢迎的css预处理器sass的c版本.

这个东东提供了难以想象的效率来本地编译sass到css文件,甚至可以通过中间件的方式自动编译。

Find it on npm: https://npmjs.org/package/node-sass

Install 安装

Usage 使用

Options 选项(这里仔细看)

The API for using node-sass has changed, so that now there is only one variable – an options hash. Some of these options are optional, and in some circumstances some are mandatory.

node-sass的api已经变化,只需要一个参数-options对象。有些选项是可选的,有些选项在某种环境下是必须的。

file

file is a String of the path to an scss file for libsass to render. One of this or data options are required, for both render and renderSync.

file表示libsass需要编译的文件,以字符串表示。这个选项或者data选项必须在render或者renderSync中指定

data

data is a String containing the scss to be rendered by libsass. One of this or file options are required, for both render and renderSync. It is recommended that you use the includePaths option in conjunction with this, as otherwise libsass may have trouble finding files imported via the @import directive.

data表示scss字符串.这个选项或file选项必须在在render或者renderSync中指定.我们建议你使用includePaths选项来为@import(sass中的import命令)指定来源,不然有些时候libsass在寻找@import引入的文件时会出错

success

success is a Function to be called upon successful rendering of the scss to css. This option is required but only for the render function. If provided to renderSync it will be ignored.

当scss被编译为css后,success指定的函数被调用.这个选项在render函数中是必须的,但renderSync会忽略

error

error is a Function to be called upon occurance of an error when rendering the scss to css. This option is optional, and only applies to the render function. If provided to renderSync it will be ignored.

当scss被编译为css的过程中出错,error指定的函数被调用.这个选项在render函数中是可选的,但renderSync会忽略

includePaths

includePaths is an Array of path Strings to look for any @imported files. It is recommended that you use this option if you are using the data option and have any @import directives, as otherwise libsass may not find your depended-on files.

includePaths是一个由字符串组成的数组,表示路径,来表明任何@imported所引入的文件在哪。如果你使用了data选项,且包含@import,建议你使用这个选项,否则libsass可能找不到依赖文件。

imagePath

imagePath is a String that represents the public image path. When using the image-url() function in a stylesheet, this path will be prepended to the path you supply. eg. Given an imagePath of /path/to/imagesbackground-image: image-url('image.png') will compile to background-image: url("/path/to/images/image.png")

imagePath 表示图片路径. 当在样式表中使用 image-url() 函数时, 这个函数将会载入你用imagePath指定的图片路径比如说你设置了imagePath为/path/to/images,样式表中写的是background-image: image-url(‘image.png’),将会被编译为 background-image: url("/path/to/images/image.png")

outputStyle

outputStyle is a String to determine how the final CSS should be rendered. Its value should be one of 'nested', 'expanded', 'compact', 'compressed'. [Important: currently the argument outputStyle has some problem which may cause the output css becomes nothing because of the libsass, so you should not use it now!]

outputStyle是一个字符串,表示最终的CSS是什么样的。它的值应该是下列值其中一个:“nested”,“expanded”,“compact”,“compressed”。(重要:目前outputStyle有一些问题,libsass的缘故可能会导致不输出css,所以建议现在不应该使用!)

 

sourceComments

sourceComments is a String to determine what debug information is included in the output file. Its value should be one of 'none', 'normal', 'map'. The default is 'none'. The map option will create the source map file in your CSS destination. [Important: souceComments is only supported when using the file option, and does nothing when using data flag.]

sourceMap

If your sourceComments option is set to mapsourceMap allows setting a new path context for the referenced Sass files. The source map describes a path from your CSS file location, into the the folder where the Sass files are located. In most occasions this will work out-of-the-box but, in some cases, you may need to set a different output.

Examples

Edge-case behaviours

  • In the case that both file and data options are set, node-sass will only attempt to honour the filedirective.
  • 当file跟data选项都设置了,node-sass只会以file选项为准

Connect/Express middleware

connect跟express的中间件

Recompile .scss files automatically for connect and express based http servers

下面的例子可以让node-sass变为express/connect的中间件,来自动编译scss文件

Heavily inspired by https://github.com/LearnBoost/stylus

DocPad Plugin docpad的插件

@jking90 wrote a DocPad plugin that compiles .scss files using node-sass:https://github.com/jking90/docpad-plugin-nodesass

Grunt extension  grunt的插件(grunt的sass插件就是基于这货)

@sindresorhus has created a set of grunt tasks based on node-sass: https://github.com/sindresorhus/grunt-sass

Gulp extension gulp的插件

@dlmanning has created a gulp sass plugin based on node-sass: https://github.com/dlmanning/gulp-sass

Harp

@sintaxi’s Harp web server implicitly compiles .scss files using node-sass: https://github.com/sintaxi/harp

Meteor plugin

@fourseven has created a meteor plugin based on node-sass: https://github.com/fourseven/meteor-scss

Mimosa module

@dbashford has created a Mimosa module for sass which includes node-sass:https://github.com/dbashford/mimosa-sass

Example App

There is also an example connect app here: https://github.com/andrew/node-sass-example

Rebuilding binaries

Node-sass includes pre-compiled binaries for popular platforms, to add a binary for your platform follow these steps:

Check out the project:

Replace the prebuild binary with your newly generated one

Command Line Interface

The interface for command-line usage is fairly simplistic at this stage, as seen in the following usage section.

Output will be saved with the same name as input SASS file into the current working directory if it’s omitted.

使用命令行接口是相当简单的,见以下使用部分。
若不指定输出文件,输出文件名将与输入的SASS文件名相同,且保存到当前工作目录。

 

Usage

node-sass [options] <input.scss> [<output.css>]

Options:

Post-install Build

Install runs a series of Mocha tests to see if your machine can use the pre-built libsass which will save some time during install. If any tests fail it will build from source.

If you know the pre-built version will work and do not want to wait for the tests to run you can skip the tests by setting the environment variable SKIP_NODE_SASS_TESTS to true.

Contributors

Special thanks to the following people for submitting patches:

Dean Mao Brett Wilkins litek gonghao Dylan Greene

Note on Patches/Pull Requests

  • Fork the project.
  • Make your feature addition or bug fix.
  • Add documentation if necessary.
  • Add tests for it. This is important so I don’t break it in a future version unintentionally.
  • Send a pull request. Bonus points for topic branches.

Copyright

Copyright (c) 2013 Andrew Nesbitt. See LICENSE for details.