前阵子,在nodejs版本更新到v0.10.6(stable),isaacs 宣布不赞成再使用require.extensions,这必然严重影响今后CoffeeScript的发展。所以这个版本一发布,大家就进行了激烈的讨论,有兴趣的读者可以看以下的几篇文章,比较典型,也是现在争论的焦点。
针对这个问题,我觉得是仁者见仁智者见智,大家都有点道理。而我写这篇文章的本意,就是重新梳理下原理,好让大家能有自己的判断。
发展历史
根据wiki的介绍,CoffeeScript的发展如下
“2009年12月3日,Jeremy Ashkenas 在 Git 上对 CoffeeScript 做出了第一笔提交“这是这个神秘语言最初的提交。(initial commit of the mystery language.)”当时的编译器由 Ruby 语言所写成。在同年12月24日,Ashkenas 做出了第一个上标签与归档的版本-0.1.0。2010年2月21日,他释出了 0.5 版,此版本将原先由 Ruby 撰写的编译器改写为纯 CoffeeScript 撰写。当时吸引了 GitHub 上的许多贡献者,每日约有 300 人次造访该专案的页面。2010年12月24日,Askenas 释出了 1.0.0 稳定版本,并在 Hacker News 上发表。Hacker News 也是当时此专案第一次发表的网站”
原理
在CoffeeScript的主页上就已经清楚地告诉了大家:
“CoffeeScript is a little language that compiles into JavaScript.”
它是种构建在JavaScript上的新型语言,优点就是增强了 JavaScript 的简洁性与可读性,也新增了更复杂的功能; 缺点也很明显,它的代码最终还是会被编译成JavaScript,所有常给人种“多余”,“还不如直接写javascript来得痛快”的感觉。
现在来具体讲讲, CoffeeScript的代码是如何在Nodejs环境中运行的。
在安装好CoffeeScript之后,安装方法可以参考:http://coffeescript.org/#installation
我写了helloworld.coffee,代码如下
console.log 'hello world jifeng'
将该文件转化为.js文件的指令
coffee -c helloworld.coffee
通过以上指令,就可以生成helloworld.js,代码如下
//Generated by CoffeeScript 1.4.0
(function() {
console.log('hello world jifeng');
}).call(this);
通过上面的例子,我们可以看到CoffeeScript就是将.coffee 文件如何快速的编译成.js文件的过程。
Nodejs调用CoffeeScript代码
还是用上面的例子,如果我用nodejs代码,想要调用上面的helloworld.coffee的代码,只需要写index.js
require('coffee-script');var hello = require('./helloworld.coffee');
它所依赖的就是nodejs的require.extensions的功能,具体代码可以看 coffee-script.js,主要代码就是这块
loadFile = function(module, filename) {
....returnmodule._compile(compile(stripped, {
filename: filename,
literate: helpers.isLiterate(filename)
}), filename);
};if(require.extensions) {
_ref= ['.coffee', '.litcoffee', '.coffee.md'];for (_i = 0, _len = _ref.length; _i < _len; _i++) {
ext=_ref[_i];
require.extensions[ext]=loadFile;
}
}
CoffeeScript就是的做法,就是通过nodejs自带的require.extensions扩展功能, 在require '.coffee' 文件时,先将改文件编译成JavaScript代码之后再被加载。
这也就是为什么取消require.extensions会对coffeescript产生这么重大影响的原因。
希望对大家有所帮助。
参考文章:http://zh.wikipedia.org/wiki/CoffeeScript#cite_note-changelog-1