coffeescript 运行原理

前阵子,在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) {
    ....
    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

原文地址:https://www.cnblogs.com/lengyuhong/p/3085649.html