浅谈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 相关文章推荐
基于jQuery的可以控制左右滚动及自动滚动效果的代码
Jul 25 Javascript
js弹出框轻量级插件jquery.boxy使用介绍
Jan 15 Javascript
用JQuery实现全选与取消的两种简单方法
Feb 22 Javascript
JS实现鼠标单击与双击事件共存
Mar 08 Javascript
Ext修改GridPanel数据和字体颜色、css属性等
Jun 13 Javascript
js对字符的验证方法汇总
Feb 04 Javascript
CSS图片响应式 垂直水平居中
Aug 14 Javascript
基于JavaScript实现图片点击弹出窗口而不是保存
Feb 06 Javascript
使用JavaScript为Kindeditor自定义按钮增加Audio标签
Mar 18 Javascript
bootstrap+jquery项目引入文件报错的解决方法
Jan 22 jQuery
layer.alert自定义关闭回调事件的方法
Sep 27 Javascript
Vue项目移动端滚动穿透问题的实现
May 19 Javascript
微信小程序实现按字母排列选择城市功能
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
杏林同学录(四)
2006/10/09 PHP
组合算法的PHP解答方法
2012/02/04 PHP
PHP生成验证码时“图像因其本身有错无法显示”的解决方法
2013/08/07 PHP
php启用sphinx全文搜索的实现方法
2014/12/24 PHP
Codeigniter中集成smarty和adodb的方法
2016/03/04 PHP
Laravel5.1 框架Middleware中间件基本用法实例分析
2020/01/04 PHP
PHP7创建销毁session的实例方法
2020/02/03 PHP
JavaScript 联动的无限级封装类,数据采用非Ajax方式,随意添加联动
2010/06/29 Javascript
调试Node.JS的辅助工具(NodeWatcher)
2012/01/04 Javascript
jQuery setTimeout()函数使用方法
2013/04/07 Javascript
js之onload事件的一点使用心得
2013/08/14 Javascript
JS事件在IE与FF中的区别详细解析
2013/11/20 Javascript
javascript根据像素点取位置示例
2014/01/27 Javascript
jQuery中hide()方法用法实例
2014/12/24 Javascript
jQuery实现的登录浮动框效果代码
2015/09/26 Javascript
jQuery多级手风琴菜单实例讲解
2015/10/22 Javascript
基于JavaScript怎么实现让歌词滚动播放
2015/11/03 Javascript
JS实现按比例缩放图片的方法(附C#版代码)
2015/12/08 Javascript
JQuery 在文档中查找指定name的元素并移除的实现方法
2016/05/19 Javascript
JS实现点击表头表格自动排序(含数字、字符串、日期)
2017/01/22 Javascript
利用node.js搭建简单web服务器的方法教程
2017/02/20 Javascript
微信小程序 页面跳转如何实现传值
2017/04/05 Javascript
AngularJS修改model值时,显示内容不变的实例
2018/09/13 Javascript
Vue项目引发的「过滤器」使用教程
2019/03/12 Javascript
JS async 函数的含义和用法实例总结
2020/04/08 Javascript
Python获取文件ssdeep值的方法
2014/10/05 Python
python实现的简单抽奖系统实例
2015/05/22 Python
对Pandas DataFrame缺失值的查找与填充示例讲解
2018/11/06 Python
讲解Python3中NumPy数组寻找特定元素下标的两种方法
2019/08/04 Python
如何使用PyCharm将代码上传到GitHub上(图文详解)
2020/04/27 Python
Pycharm快捷键配置详细整理
2020/10/13 Python
python处理写入数据代码讲解
2020/10/22 Python
公司员工培训管理制度
2015/08/04 职场文书
2019生态环境保护倡议书!
2019/07/03 职场文书
详解如何使用Node.js实现热重载页面
2021/05/06 Javascript
GO语言异常处理分析 err接口及defer延迟
2022/04/14 Golang