由于 Babel,WebPack, React 技术的流行, 小明同学已经开始在前端代码里面用上了 ECMAScript 2015 (以下称 ES6 ) 的众多特性。import
, export
, class
, arrow function
, let const
等等关键词甚至都已经开始变成小明的肌肉记忆。
但是等等,对于小明这样既写 React 又写 Node.js 的的人来说,又有点分裂了。经常性的在 Node.js 里面写 import xxx from 'xxx';
然后被 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") |
『in progress』特性是那些将要支持(但具体时间未知)的特性。
开启模块的 ES6 模式
Babel 是一个插件式的 JavaScript 编译器, 能将一些当前 JS 引擎中不支持的特性和语法, 通过一个个特定插件,转换成当前引擎可以理解的 JS 脚本。 我们可以使用 Babel 来转换我们的 Node.js 脚本。
接下来, 我们就可以去 Babel 插件列表去选择对应的转换插件来为我们的 Node.js 插上隐形的翅膀了。
首先, 我们需要确认我们需要 Babel 添加哪些特性支持。
选择 ES 转换的原则
优先使用原生特性
优先选择那些稳定实现的特性。 由于一些 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'; |
to
; |
转换示例: export
from:
export default class Mod { |
to:
; |
上面这些选择的插件可以根据个人口味以及 Node.js 版本 进行添加或删除。选好模块, 我们就可以安装插件以及创建对应得babel配置文件去处理
-
根据byte[]数组,生成相对应的文件并保存指定路径下
我在做视频ts解密的时候,用到了InputStream流转byte[],解密byte[],解密后的byte[],再通过new ByteArrayInputStream(byt)转回到inputStream,再进行文件保存。
-
Apache Commons IO之IOUtils优雅操作流
在开发过程中,你肯定遇到过从流中解析数据,或者把数据写入流中,或者输入流转换为输出流,而且最后还要进行流的关闭,原始jdk自带的方法写起来太复杂,还要注意各种异常,如果你为此感到烦恼,那IOUtils可以让我们优雅的操作流。
-
百度视频SDK,突然不能播放
开发过程中,不知道什么时候开始视频不能播发了,怎么办都不行,其他项目没问题,线上都也没有问题,这可急躁完蛋我了,整了仨小时,还是那熊样。 哎。
-
AssetManager.finalize() Timed Out 解决办法以及分析
在我们的项目崩溃中,有一个比较常见的bug,就是 java.util.concurrent.TimeoutException android.content.res.AssetManager.finalize() timed out after 10 seconds 意思简单明了,就是说在AssetManager析构的时候发生了超时异常。
-
java.lang.IllegalArgumentException: View=DecorView@4b56afc[] not attached to window manager
使用Dialog的时候,没少出现下面这个报错 出现的原因:因为你的Dialog的生命周期比你的activity的生命周期要长 所以,出现这个bug的时候,请检查创建这个Dialog的context所属的Activity是不是已经结束了,而dialog还在显示。
-
JS数组添加不重复元素
push() 原生数组在末尾添加参数,返回一个新的数组
-
android.os.NetworkOnMainThreadException
在Android 4.0以上,网络连接不能放在主线程上,不然就会报错android.os.NetworkOnMainThreadException。但是4.0下版本可以不会报错。
-
关于Jsoup 伪装请求头
android爬虫工具,Jsoup。如何设置伪请求头部?
-
yarn如何全局安装命令以及和环境变量的关系
使用npm全局安装的yarn,需要配置环境变量,将 yarn bin的地址配置到用户变量内,然后重启命令行工具就可以了
-
You must call removeView() on the child's parent first解决办法
出现这样的情况最多是发生在recyclerView中,holder复用的过程中,多次添加view,第一次添加的时候view有了父类了,可能就是复用引起的。 我是发生在给recyclerView添加广告view的时候发生的。
-
根据byte[]数组,生成相对应的文件并保存指定路径下
我在做视频ts解密的时候,用到了InputStream流转byte[],解密byte[],解密后的byte[],再通过new ByteArrayInputStream(byt)转回到inputStream,再进行文件保存。
-
Apache Commons IO之IOUtils优雅操作流
在开发过程中,你肯定遇到过从流中解析数据,或者把数据写入流中,或者输入流转换为输出流,而且最后还要进行流的关闭,原始jdk自带的方法写起来太复杂,还要注意各种异常,如果你为此感到烦恼,那IOUtils可以让我们优雅的操作流。
-
百度视频SDK,突然不能播放
开发过程中,不知道什么时候开始视频不能播发了,怎么办都不行,其他项目没问题,线上都也没有问题,这可急躁完蛋我了,整了仨小时,还是那熊样。 哎。
-
AssetManager.finalize() Timed Out 解决办法以及分析
在我们的项目崩溃中,有一个比较常见的bug,就是 java.util.concurrent.TimeoutException android.content.res.AssetManager.finalize() timed out after 10 seconds 意思简单明了,就是说在AssetManager析构的时候发生了超时异常。
-
java.lang.IllegalArgumentException: View=DecorView@4b56afc[] not attached to window manager
使用Dialog的时候,没少出现下面这个报错 出现的原因:因为你的Dialog的生命周期比你的activity的生命周期要长 所以,出现这个bug的时候,请检查创建这个Dialog的context所属的Activity是不是已经结束了,而dialog还在显示。
-
JS数组添加不重复元素
push() 原生数组在末尾添加参数,返回一个新的数组
-
android.os.NetworkOnMainThreadException
在Android 4.0以上,网络连接不能放在主线程上,不然就会报错android.os.NetworkOnMainThreadException。但是4.0下版本可以不会报错。
-
关于Jsoup 伪装请求头
android爬虫工具,Jsoup。如何设置伪请求头部?
-
yarn如何全局安装命令以及和环境变量的关系
使用npm全局安装的yarn,需要配置环境变量,将 yarn bin的地址配置到用户变量内,然后重启命令行工具就可以了
-
You must call removeView() on the child's parent first解决办法
出现这样的情况最多是发生在recyclerView中,holder复用的过程中,多次添加view,第一次添加的时候view有了父类了,可能就是复用引起的。 我是发生在给recyclerView添加广告view的时候发生的。