• 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

  • 相关阅读:
    shell中的for循环
    tty相关
    udev规则
    find中perm参数
    日志级别的选择:Debug、Info、Warn、Error还是Fatal
    云计算、云存储、大数据
    JSON数据解析(python3.4)
    38、友盟统计
    37、iamgeview 图层叠加
    36、imageview的坑
  • 原文地址:https://www.cnblogs.com/lengyuhong/p/3085649.html
Copyright © 2020-2023  润新知