javascript, es6, nodejs, commonJS的区别和联系

这几个概念如果没有仔细读相应的教程或者文档,很容易混淆。下面是根据我的浅表理解和网络参考整理的文档,不一定准确,有误请指出轻喷
本文条理:

  • 这四者的关系
  • Node.js 的出现要解决什么问题?
  • Node.js(V8)和ES6的关系
  • Babel的作用
    题外知识点:
  • 什么是runtime?
  • 浏览器解析和执行javascript用javascript引擎,那HTML呢?
    ==============================================
    分门别类:
    |语言标准|语言|javascript runtime|模块生态系统项目|
    |----------|---------|----------|---------|
    |ECMAScript6|javascript|Node.js|CommonJS|

看完上面的归类后,就会发现实际上你在写的就是javascript

  • ES6,是javascript语言规范,用于规范javascript, 也就是定义javascript语法标准。
  • Node.js 是javascript运行时环境(javascript runtime),主要作用就是可以让javascript脱离浏览器执行。
  • commonJS是一个在2014年已经被终止的项目,它的规范让javascript可以实现模块化。Node.js最开始就只支持commonJS的模块化标准,即 require/exports, 后来ES6改进了模块化标准为用 import/export, 相对前者有更多灵活的用法。
    所以为了让javascript更好的被使用,这三者才会出现, 当然实现ES6标准的不止javascript,还有其他语言,如JScript,ActionScript等脚本语言都是基于ECMAScript标准实现的。

现在来说说Node.js 和javascript的关系,以及为什么会有Node.js这么个东西出现?
很多人弄不清楚Node.js到底是不是javascript?
--不是。
--javascript是语言,Node.js是javavscript的运行时。
Node.js= chrome浏览器的V8引擎+一些javascript运行时库。

javascript诞生之初的目的是用在web, 由浏览器执行。那么脱离浏览器,javascript就不能执行了吗? nodejs出现之前,确实是这样的。因为只有浏览器里才有javascript解释器!只有它才知道javascript要怎么执行。既然如此,只要把这个解释器拿出来,再添加一些必要的执行库工具不就可以让javascript脱离浏览器执行了嘛,所以nodejs就诞生了。各家浏览器商都有自己的javascript解释器, nodejs用的是chrome的V8 javascript引擎。这个问题就解释完了。

接下来说说Node.js和ES6的关系
我的理解是:Node.js用V8引擎,而V8如果能解析ES6规范的javascript语法,那么Node.js也就能支持相应的语法标准。

ECMA每发布一个标准,各大浏览器的javascript引擎都会尽量跟上,它们现在大部分都支持了ES5,ES6 还没有被完全支持。而V8对ES6已经高度支持了,也就是说Node.js对ES6也高度支持。

接下来说Babel的作用
babel是用于将ES6转成ES5的工具, 因为目前很多浏览器尚未完全支持ES6。
而babel官方对自己的解释是JavaScript compiler:

Babel is a JavaScript compiler.

babel提供在线转码工具,可以在左边编写ES6的代码,右边可以看到转码后的ES5代码,最直观的测试可以用import vs require, 或者箭头函数=>.
如何使用babel
babel在项目中的作用是通过项目根目录下编写.babelrc 文件,配置babel转码规则和所使用的插件来完成。

同时,babel还提供了 babel-node 用于替代命令node以编译执行尚未被Node.js(或者说V8)支持的代码,比如import:

//exportFile.js
export function exfile(){
    console.log("I am an exported file");
}
//importFile.js
import {exfile} from './exportFile';
exfile()
//终端执行,npx是nodejs用于执行当前项目的node_modules/.bin下的命令的快捷命令 #the npm package runner that comes with npm@5.2.0
$ npx babel-node importFile.js 
I am an exported file

如果你在这里用node命令运行importFile.js的话,由于import命令还未被V8支持,你会得到下面的错误信息:

$ node importFile.js
C:\...\src\js\importFile.js:1
import {exfile} from './exportFile';
       ^

SyntaxError: Unexpected token {

babel提供了很多插件用于支持javavscript转码,详细请参考文档
https://babeljs.io/docs/en/

========================================
题外知识点:
什么是runtime?
虽然我在前文放了个连接到stackoverflow上回答# What is “runtime”?
但是在这里我还是想写下我的理解:
runtime正如其名:你的代码要运行起来所需要的东西,比如依赖的代码库,已经被工具编写好的底层指令,承载你代码的框架,可以让你的代码运行起来的平台,其实这些概念都有点重复,比如
可以让你的代码运行起来的平台自然包括它已经为你写好的底层交接指令,框架也是,最简单的例子就是通信模块,各大框架都已经为你封装了HTTP请求的“发”,“收”的复杂处理, 你只需要写业务代码就可以。

这样一来就可以理解Node.js的自我介绍:

Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine

上面是我个人理解,下面贴上stackoverflow的答案:
高赞答案:

Runtime describes software/instructions that are executed while your program is running, especially those instructions that you did not write explicitly, but are necessary for the proper execution of your code.
//Runtime指的是在你的程序运行时被执行的软件或者指令,特别是那些你没有明确写出来的指令,但是确实是你代码执行所必须的指令。
d
Low-level languages like C have very small (if any) runtime. More complex languages like Objective-C, which allows for dynamic message passing, have a much more extensive runtime.
d
You are correct that runtime code is library code, but library code is a more general term, describing the code produced by any library. Runtime code is specifically the code required to implement the features of the language itself.

次高赞答案:

Runtime is a general term that refers to any library, framework, or platform that your code runs on.
d
The C and C++ runtimes are collections of functions.
// 运行时是一个通用术语,指的是您的代码在其上运行的任何库,框架或平台。C和C ++运行时是函数的集合。
d
The .NET runtime contains an intermediate language interpreter, a garbage collector, and more.

接下来说浏览器解析和执行javascript用javascript引擎,那HTML呢?
这是一篇很棒的文章,值得一读
浏览器的工作原理
我摘抄了这段,用于理解浏览器的结构,其中的呈现引擎就是用于解析HTML和CSS,并显示他们:

浏览器的高层结构
浏览器的主要组件为 ([1.1(https://www.html5rocks.com/zh/tutorials/internals/howbrowserswork/#1_1)):
d1. 用户界面 - 包括地址栏、前进/后退按钮、书签菜单等。除了浏览器主窗口显示的您请求的页面外,其他显示的各个部分都属于用户界面。
d2. 浏览器引擎 - 在用户界面和呈现引擎之间传送指令。
d3. 呈现引擎 - 负责显示请求的内容。如果请求的内容是 HTML,它就负责解析 HTML 和 CSS 内容,并将解析后的内容显示在屏幕上。
d4. 网络 - 用于网络调用,比如 HTTP 请求。其接口与平台无关,并为所有平台提供底层实现。
d5. 用户界面后端 - 用于绘制基本的窗口小部件,比如组合框和窗口。其公开了与平台无关的通用接口,而在底层使用操作系统的用户界面方法。
d6. JavaScript 解释器。用于解析和执行 JavaScript 代码。
d7. 数据存储。这是持久层。浏览器需要在硬盘上保存各种数据,例如 Cookie。新的 HTML 规范 (HTML5) 定义了“网络数据库”,这是一个完整(但是轻便)的浏览器内数据库。

======额外参考======

  • 运行下面命令可以查看你当前使用的node已经实现的ES6特性:
    来自阮一峰
// Linux & Mac
$ node --v8-options | grep harmony

// Windows
$ node --v8-options | findstr harmony
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 193,968评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,682评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,254评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,074评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,964评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,055评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,484评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,170评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,433评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,512评论 2 308
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,296评论 1 325
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,184评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,545评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,150评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,437评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,630评论 2 335

推荐阅读更多精彩内容

  • 上一章介绍了模块的语法,本章介绍如何在浏览器和 Node 之中加载 ES6 模块,以及实际开发中经常遇到的一些问题...
    emmet7life阅读 2,672评论 0 1
  • javascript功能插件大集合,写前端的亲们记得收藏 包管理器管理着 javascript 库,并提供读取和打...
    狗狗嗖阅读 777评论 0 1
  • 文/云梦 红白相间, 肥瘦相宜。 你独特的风采 在同类中出类拔萃! 几番沉思, 几番懊悔, 想当年为何对你, 毫不...
    云梦1122阅读 1,213评论 36 51
  • 黎明, 拨开浓雾的外衣, 安睡的高铁, 从泪水中爬起。 7月23, 一个敏感的日期, 一段刻骨铭心的记忆。 质疑漫...
    伊凡时光静好阅读 226评论 0 1
  • 秦朝时候,有个善良美丽的女子,名叫孟姜女。 一天,她正在自家的院子里做家务,突然发现葡萄架下藏了一个人...
    雨雨语阅读 269评论 0 2