浅谈Node新版本13.2.0正式支持ES Modules特性


Posted in Javascript onNovember 25, 2019

在本月 21 日,即2019.11.21,Node.js 发布了 13.2.0 版本,更新了一些特性。其中最令人兴奋的莫过于正式取消了 --experimental-modules 启动参数。这说明Node.js 正式支持 ES modules。我们一起来看看。

Stability Index说明

Stability Index,即 Api 的稳定指数说明。它包括3个值:

  1. Stability: 0 ,不推荐使用。表示该Api官方不推荐使用,该功能可能会发出警告。不能保证向后兼容。
  2. Stability: 1,实验性的。表示该Api已经支持使用性使用。但是在将来的任何发行版中都可能发生非向后兼容的更改或删除。不建议在生产环境中使用该功能。

Stability: 2,稳定版。表示已经试验完成,基本不会再发生改动,可以再生产环境中使用。

Unflag --experimental-modules

在 13.2.0的版本中,node 默认情况下会启用对ECMAScript模块的实验支持,也就是不需要启动参数了。那么nodejs是如何区分 esm 和 commonjs 的呢?这里翻译一下官方文档。
Node.js会将把以下内容视为ES模块:

  • 文件后缀为.mjs
  • 当文件后缀为.js,或者无文件后缀时,看其package.json文件,package.json 中 type 字段值为 "module"
  • 启动参数添加 —-input-type=module
  • 使用传递字符参数给--eval,如$ node --eval 'import("http");

其他情况下,都会被识别为 commonjs。现在node已经支持esm和commonjs了,我们在使用的时候,最好还是指定一下模块。

举个例子?

import './legacy-file.cjs';
// Loaded as CommonJS since .cjs is always loaded as CommonJS.

import 'commonjs-package/src/index.mjs';
// Loaded as ES module since .mjs is always loaded as ES module.

这种情况,根据文件后缀按不同模块处理。

// package.json
{
 "type": "module"
}

当前目录下,或者上级目录中的package.json含有"type": "module"时,该模块会被当作ES Module。

// my-app.js, in an ES module package scope because there is a package.json
// file in the same folder with "type": "module".

import './startup/init.js';
// Loaded as ES module since ./startup contains no package.json file,
// and therefore inherits the ES module package scope from one level up.

import 'commonjs-package';
// Loaded as CommonJS since ./node_modules/commonjs-package/package.json
// lacks a "type" field or contains "type": "commonjs".

import './node_modules/commonjs-package/index.js';
// Loaded as CommonJS since ./node_modules/commonjs-package/package.json
// lacks a "type" field or contains "type": "commonjs".

如上图注释所示,如果当前文件目录不包含package.json,则会看其父级目录的package.json文件,然后判断type类型。

node --input-type=module --eval "import { sep } from 'path'; console.log(sep);"
echo "import { sep } from 'path'; console.log(sep);" | node --input-type=module

这里就是使用传递字符参数给--eval,添加 --input-type启动参数的情况。

快速体验

目前13.2.0版本的官方文档对ES Module的标记是 Stability: 1,你已经可以安装新版本来试验啦。相信在社区的共同努力下,很快就会进入 Stability: 2 正式稳定版了。

本地开发的时候,经常需要快速更新或切换不同的node版本。可以使用 nvm、n 等方案,还有一个跨平台的本地管理方案就是 nvs。都可以选择使用,这里我举的例子,就是使用 nvs:

$ nvs add node/13.2.0
$ nvs use 13.2.0
$ node -v
13.2.0

赶紧尝试一下吧~

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Array.slice()与Array.splice()的返回值类型
Oct 09 Javascript
使用onbeforeunload属性后的副作用
Mar 08 Javascript
jquery中map函数遍历数组用法实例
May 18 Javascript
js实现的二分查找算法实例
Jan 21 Javascript
BOM系列第三篇之定时器应用(时钟、倒计时、秒表和闹钟)
Aug 17 Javascript
AngularJS过滤器filter用法实例分析
Nov 04 Javascript
jQuery实现键盘回车搜索功能
Jul 25 jQuery
Vue中使用的EventBus有生命周期
Jul 12 Javascript
js正则取值的结果数组调试方法
Oct 10 Javascript
详解jQuery获取特殊属性的值以及设置内容
Nov 14 jQuery
js找出5个数中最大的一个数和倒数第二大的数实现方法示例小结
Mar 04 Javascript
Vue router安装及使用方法解析
Dec 02 Vue.js
微信小程序实现按字母排列选择城市功能
Nov 25 #Javascript
JS实现点击下拉列表文本框中出现对应的网址,点击跳转按钮实现跳转
Nov 25 #Javascript
jquery使用echarts实现有向图可视化功能示例
Nov 25 #jQuery
如何优雅地在Node应用中进行错误异常处理
Nov 25 #Javascript
jQuery Raty星级评分插件使用方法实例分析
Nov 25 #jQuery
uni-app实现点赞评论功能
Nov 25 #Javascript
js prototype深入理解及应用实例分析
Nov 25 #Javascript
You might like
php5.2.0内存管理改进
2007/01/22 PHP
PHP伪静态页面函数附使用方法
2008/06/20 PHP
PHP实现自动发送邮件功能代码(qq 邮箱)
2017/08/18 PHP
javascript KeyDown、KeyPress和KeyUp事件的区别与联系
2009/12/03 Javascript
基于jQuery的简单的列表导航菜单
2011/03/02 Javascript
js固定DIV高度,超出部分自动添加滚动条的简单方法
2013/07/10 Javascript
JS中图片缓冲loading技术的实例代码
2013/08/29 Javascript
JavaScript DOM元素尺寸和位置
2015/04/13 Javascript
JavaScript中指定函数名称的相关方法
2015/06/04 Javascript
JS模拟Dialog弹出浮动框效果代码
2015/10/16 Javascript
jquery中取消和绑定hover事件的实现代码
2016/06/02 Javascript
JavaScript必知必会(三) String .的方法来自何方
2016/06/08 Javascript
jQuery操作cookie
2016/08/08 Javascript
jQuery弹出下拉列表插件(实现kindeditor的@功能)
2016/08/16 Javascript
Bootstrap笔记—折叠实例代码
2017/03/13 Javascript
JS正则获取HTML元素的方法
2017/03/31 Javascript
angularJs使用$watch和$filter过滤器制作搜索筛选实例
2017/06/01 Javascript
AngularJs+Bootstrap实现漂亮的计算器
2017/08/10 Javascript
解决vue初始化项目一直停在downloading template的问题
2020/11/09 Javascript
Python利用QQ邮箱发送邮件的实现方法(分享)
2017/06/09 Python
Python if语句知识点用法总结
2018/06/10 Python
python os.path模块常用方法实例详解
2018/09/16 Python
浅谈python函数调用返回两个或多个变量的方法
2019/01/23 Python
python opencv 读取本地视频文件 修改ffmpeg的方法
2019/01/26 Python
Python中使用logging和traceback模块记录日志和跟踪异常
2019/04/09 Python
Jupyter notebook无法导入第三方模块的解决方式
2020/04/15 Python
python中upper是做什么用的
2020/07/20 Python
python3排序的实例方法
2020/10/20 Python
天猫精选:上天猫,就够了
2016/09/21 全球购物
数控专业应届生求职信
2013/11/27 职场文书
新春文艺演出主持词
2014/03/27 职场文书
交通事故私了协议书
2014/04/16 职场文书
伦敦奥运会口号
2014/06/13 职场文书
教师节标语大全
2014/10/07 职场文书
2016中秋晚会开幕词
2016/03/03 职场文书
MongoDB使用profile分析慢查询的步骤
2021/04/30 MongoDB