前阵子,在nodejs版本更新到v0.10.6(stable),isaacs 宣布不赞成再使用require.extensions,这必然严重影响今后CoffeeScript的发展。所以这个版本一发布,大家就进行了激烈的讨论,有兴趣的读者可以看以下的几篇文章,比较典型,也是现在争论的焦点。
- nodejs更新说明
- what are the merits / demerits of require.extensions?
- module name resolution order insufficiently specified
针对这个问题,我觉得是仁者见仁智者见智,大家都有点道理。而我写这篇文章的本意,就是重新梳理下原理,好让大家能有自己的判断。
发展历史
根据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) { .... return module._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