Node.js 里面那些遗失的 ES6 特性

2017-08-03 21:16:46

找回 Node.js 里面那些遗失的 ES6 特性

由于 Babel,WebPack, React 技术的流行, 小明同学已经开始在前端代码里面用上了 ECMAScript 2015 (以下称 ES6 ) 的众多特性。importexportclassarrow functionlet const 等等关键词甚至都已经开始变成小明的肌肉记忆。

但是等等,对于小明这样既写 React 又写 Node.js 的的人来说,又有点分裂了。经常性的在 Node.js 里面写 import xxx from 'xxx'; 然后被 Node.js 的解析器无情的拒绝;
另外对于一致性有点追求的人肯定受不了同一个仓库, 同一类脚本, 同一个人维护却有两种风格。

Node.js 对不支持的语法的报错信息

恩, 不能忍!

Node.js 对 ES6 的支持

其实 Node.js 对 ES6 的很多特性都已经开始支持了。 在 Node.js 使用的 JS 引擎 V8 里面将不同状态 ES6 特性分成了 3 个等级:

  • shipping (已经分发并默认开启的特性)

  • staged (已经分发, 但需要使用 –harmony 参数开启的特性)

  • in progress (开发中, 还不稳定或者未实现的特性, 不推荐使用)

『shipping』 已经开启的 ES6 特性

本文使用的 Node.js 版本号:
稳定版本:4.2.4
对应 V8 引擎的版本:4.5.103.35
最新版本:5.3.0
对应 V8 引擎版本:4.6.85.31

目前默认开启的 ES6 特性如下:

  • Block scoping

  • let (strict mode only)

  • const

  • function-in-blocks (strict mode only [1])

  • Classes (strict mode only)

  • Collections

  • Map

  • WeakMap

  • Set

  • WeakSet

  • Typed arrays

  • Generators

  • Binary and Octal literals

  • Object literal extensions (shorthand properties and methods)

  • Promises

  • New String methods

  • Symbols

  • Template strings

  • Arrow Functions

  • new.target [2]

  • Object.assign

  • Spread operator [2]

对于这些官方引擎的特性,由于在底层实现,在性能与稳定性都有更高保障,在任何时候我们都应该优先使用。

『staged』 需要使用 --harmony 参数开启的 ES6 特性

  • Symbol.toStringTag

  • Array.prototype.includes (可以直接使用 polyfill 支持, 5.x 版本)

  • Rest Parameters (可以直接用 transform-es2015-parameters 转换,支持更全面, 5.x 版本)

『in progress』 开发中的 ES 特性


--harmony_modules (enable "harmony modules")
--harmony_array_includes (enable "harmony Array.prototype.includes")
--harmony_regexps (enable "harmony regular expression extensions")
--harmony_proxies (enable "harmony proxies")
--harmony_sloppy (enable "harmony features in sloppy mode")
--harmony_unicode_regexps (enable "harmony unicode regexps")
--harmony_reflect (enable "harmony Reflect API")
--harmony_destructuring (enable "harmony destructuring")
--harmony_sharedarraybuffer (enable "harmony sharedarraybuffer")
--harmony_atomics (enable "harmony atomics")
--harmony_new_target (enable "harmony new.target")

『in progress』特性是那些将要支持(但具体时间未知)的特性。

开启模块的 ES6 模式

Babel 是一个插件式的 JavaScript 编译器, 能将一些当前 JS 引擎中不支持的特性和语法, 通过一个个特定插件,转换成当前引擎可以理解的 JS 脚本。 我们可以使用 Babel 来转换我们的 Node.js 脚本。

接下来, 我们就可以去 Babel 插件列表去选择对应的转换插件来为我们的 Node.js 插上隐形的翅膀了。

首先, 我们需要确认我们需要 Babel 添加哪些特性支持。

选择 ES 转换的原则

  1. 优先使用原生特性

  2. 优先选择那些稳定实现的特性。 由于一些 ES 特性需要引擎的底层支持才能完美支持, 通过代码转换可能很难完美支持, 对于这种特性只能不用或少用

基于这个原则, 小明筛选出如下插件。

  • transform-strict-mode (由于很多 ES 特性需要 严格模式才能打开, 添加这个插件就会自动在所有文件上添加 'use strict';

  • transform-es2015-modules-commonjs (将 ES6 模块标准 转换成 Node.js 用的 CMD 模块标准)

  • transform-es2015-spread (支持 ES6 的 spread 操作符

  • transform-es2015-destructuring (支持 赋值解构

  • transform-es2015-parameters (支持默认参数, 参数解构, 以及其他参数)

转换示例: import

from


import Mod from './mod';
new Mod();


to


'use strict';

var _mod = require('./mod');
var _mod2 = _interopRequireDefault(_mod);

function _interopRequireDefault(obj) {
 return obj && obj.__esModule ? obj : { default: obj };
}

new _mod2.default();


转换示例: export

from:


export default class Mod {

}

to:


"use strict";

Object.defineProperty(exports, "__esModule", {
 value: true
});
class Mod {}
exports.default = Mod;

上面这些选择的插件可以根据个人口味以及 Node.js 版本 进行添加或删除。选好模块, 我们就可以安装插件以及创建对应得babel配置文件去处理

  • 2019-08-07 09:09:19

    windows系统下定时关闭程序

    其中xxx.exe是你要关闭的进程中运行的exe,可以ctrl+alt+del打开任务管理器,进到详细信息查看 然后把.txt文件后缀改成.bat(此时要在查看一栏勾上文件拓展名,要不还是txt文档)

  • 2019-08-07 09:16:43

    一个比较完美的PWA例子

    但就目前来讲,PWA是Google主推的一项技术标准,FireFox,Chrome以及一些基于Blink的浏览器已经支持渐进式Web应用了,Edge上对渐进式Web应用的支持还在开发。Apple公司也表示会考虑在自己Safari支持PWA。然而这项功能已经进入了WebKit内核的五年计划中。长期来看,对浏览器兼容性的支持方面应该已经不算太大问题了。况且在现阶段,在不支持渐进式Web应用的浏览器中,你的应用也只是无法使用渐进式Web应用的离线功能而已,除此之外的功能均可以正常使用。

  • 2019-08-07 09:57:48

    spring data jpa 实体类中字段不与数据库表映射

    当我们使用spring data jpa开发的时候,会将实体类中的成员变量与表中的字段一一对应,当我们在实体类中加上一个不与数据库表一一对应的成员变量的时候,此时我们只要在这个成员变量上加上注解@Transient @

  • 2019-08-07 17:16:53

    如何在 Node.js 中使用 import / export 的三种方法

    因为一些历史原因,虽然 Node.js 已经实现了 99% 的 ES6 新特性,不过截止 2018.8.10,How To Enable ES6 Imports in Node.JS 仍然是老大难问题,下面我来介绍三种方法可以让我们在 Node.js 中使用 import/export 。

  • 2019-08-13 08:56:46

    nuxtjs组合element

    添加elementUI 插件,plugins->ele.js,代码如下

  • 2019-08-13 20:06:42

    修改 Nginx 进程最大可打开文件数(worker_processes和worker_connections)

    worker_processes:操作系统启动多少个工作进程运行Nginx。注意是工作进程,不是有多少个nginx工程。在Nginx运行的时候,会启动两种进程,一种是主进程master process;一种是工作进程worker process。例如我在配置文件中将worker_processes设置为4,启动Nginx后,使用进程查看命令观察名字叫做nginx的进程信息,我会看到如下结果:

  • 2019-08-14 09:01:18

    linux下高并发服务器实现

    在做网络服务的时候tcp并发服务端程序的编写必不可少。tcp并发通常有几种固定的设计模式套路,他们各有优点,也各有应用之处。下面就简单的讨论下这几种模式的差异: