浅谈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代码小结
Aug 01 Javascript
在javascript中对于DOM的加强
Apr 11 Javascript
JS中FRAME的操作问题实例分析
Oct 21 Javascript
JQuery跳出each循环的方法
Apr 16 Javascript
AngularJS入门教程之AngularJS指令
Apr 18 Javascript
jQuery模仿阿里云购买服务器选择购买时间长度的代码
Apr 29 Javascript
JavaScript脚本语言是什么_动力节点Java学院整理
Jun 26 Javascript
使用Webpack提高Vue.js应用的方式汇总(四种)
Jul 10 Javascript
如何实现一个webpack模块解析器
Oct 24 Javascript
React如何解决fetch跨域请求时session失效问题
Nov 02 Javascript
JavaScript实现的3D旋转魔方动画效果实例代码
Jul 31 Javascript
微信小程序实现语音识别转文字功能及遇到的坑
Aug 02 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
php开发工具之vs2005图解
2008/01/12 PHP
Php header()函数语法及使用代码
2013/11/04 PHP
zf框架db类的分页示例分享
2014/03/14 PHP
ThinkPHP V2.2说明文档没有说明的那些事实例小结
2015/07/01 PHP
PHP不使用递归的无限级分类简单实例
2016/11/05 PHP
Yii2结合Workerman的websocket示例详解
2018/09/10 PHP
PHP+jQuery实现双击修改table表格功能示例
2019/02/21 PHP
jquery中邮箱地址 URL网站地址正则验证实例代码
2013/09/15 Javascript
今天抽时间给大家整理jquery和ajax的相关知识
2015/11/17 Javascript
jqGrid表格应用之新增与删除数据附源码下载
2015/12/02 Javascript
jQuery实现模仿微博下拉滚动条加载数据效果
2015/12/25 Javascript
AngularJS之依赖注入模拟实现
2016/08/19 Javascript
微信小程序getPhoneNumber获取用户手机号
2017/09/29 Javascript
vue引用js文件的多种方式(推荐)
2018/05/17 Javascript
vue this.reload 方法 配置
2018/09/12 Javascript
浅谈vue获得后台数据无法显示到table上面的坑
2020/08/13 Javascript
vant时间控件使用方法详解
2020/12/24 Javascript
[03:01]DOTA2英雄基础教程 露娜
2014/01/07 DOTA
python实现TCP服务器端与客户端的方法详解
2015/04/30 Python
python简单实现计算过期时间的方法
2015/06/09 Python
基于Python socket的端口扫描程序实例代码
2018/02/09 Python
Windows10下Tensorflow2.0 安装及环境配置教程(图文)
2019/11/21 Python
Python实现栈和队列的简单操作方法示例
2019/11/29 Python
Tensorflow之梯度裁剪的实现示例
2020/03/08 Python
Python接口自动化测试框架运行原理及流程
2020/11/30 Python
使用CSS3制作响应式导航菜单的方法
2015/07/12 HTML / CSS
来自全球大都市的高级街头服饰:Pegador
2018/01/03 全球购物
在印度上传处方,在线订购药品:Medlife
2019/03/28 全球购物
Java如何获得ResultSet的总行数
2016/09/03 面试题
消防安全承诺书
2014/05/22 职场文书
2015年新学期寄语
2015/02/26 职场文书
从事会计工作年限证明
2015/06/23 职场文书
个人落户申请书怎么写?
2019/06/28 职场文书
python将图片转为矢量图的方法步骤
2021/03/30 Python
超外差式晶体管收音机的组装与统调
2021/04/22 无线电
vue3.0 数字翻牌组件的使用方法详解
2022/04/20 Vue.js