浅谈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在IE下使用未闭合的xml代码创建元素时的Bug介绍
Jan 10 Javascript
js使用eval解析json(js中使用json)
Jan 17 Javascript
JavaScript中setUTCFullYear()方法的使用简介
Jun 12 Javascript
Bootstrap布局之栅格系统详解
Jun 13 Javascript
jQuery实现元素的插入
Feb 27 Javascript
jQuery实现新闻播报滚动及淡入淡出效果示例
Mar 23 jQuery
详解Node使用Puppeteer完成一次复杂的爬虫
Apr 18 Javascript
Vuex入门到上手教程
Jun 20 Javascript
node获取客户端ip功能简单示例
Aug 24 Javascript
如何利用 JS 脚本实现网页全自动秒杀抢购功能
Oct 12 Javascript
Nuxt.js nuxt-link与router-link的区别说明
Nov 06 Javascript
WebRTC记录音视频流(web技术分享)
Feb 24 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删除与复制文件夹及其文件夹下所有文件的实现代码
2013/01/23 PHP
php表单敏感字符过滤类
2014/12/08 PHP
php获取远程文件的内容和大小
2015/11/03 PHP
Laravel 错误提示本地化的实现
2019/10/22 PHP
prototype class详解
2006/09/07 Javascript
Javascript Global对象
2009/08/13 Javascript
window.onbeforeunload方法在IE下无法正常工作的解决办法
2010/01/23 Javascript
Jquery:ajax实现翻页无刷新功能代码
2013/08/05 Javascript
jquery实现metro效果示例代码
2013/09/06 Javascript
高效的获取当前元素是父元素的第几个子元素
2013/10/15 Javascript
JavaScript实现的圆形浮动标签云效果实例
2015/08/06 Javascript
Javascript获取随机数的实现方法
2016/06/22 Javascript
最佳的JavaScript错误处理实践
2016/07/16 Javascript
jquery validation验证表单插件
2017/01/07 Javascript
jQuery中 DOM节点操作方法大全
2017/10/12 jQuery
基于ajax和jsonp的原生封装(实例)
2017/10/16 Javascript
Vue实战之vue登录验证的实现代码
2017/10/31 Javascript
vue如何将v-for中的表格导出来
2018/05/07 Javascript
Element-ui之ElScrollBar组件滚动条的使用方法
2018/09/14 Javascript
微信小程序中遇到的iOS兼容性问题小结
2018/11/14 Javascript
vue实现的仿淘宝购物车功能详解
2019/01/27 Javascript
微信小程序实现的自定义分享功能示例
2019/02/12 Javascript
jQuery cookie的公共方法封装和使用示例
2020/06/01 jQuery
微信小游戏中three.js离屏画布的示例代码
2020/10/12 Javascript
[02:36]DOTA2亚洲邀请赛小组赛精彩集锦:EE凭借法力虚空拿下4杀
2017/03/30 DOTA
Python实现带百分比的进度条
2016/06/28 Python
python使用turtle库与random库绘制雪花
2018/06/22 Python
python爬取指定微信公众号文章
2018/12/20 Python
Python装饰器限制函数运行时间超时则退出执行
2019/04/09 Python
python绘制规则网络图形实例
2019/12/09 Python
Django import export实现数据库导入导出方式
2020/04/03 Python
Sperry官网:帆船鞋创始品牌
2016/09/07 全球购物
自我评价正确写法范文
2013/12/10 职场文书
个人函授自我鉴定
2014/03/25 职场文书
行政后勤人员工作计划应该怎么写?
2019/08/16 职场文书
CSS作用域(样式分割)的使用汇总
2021/11/07 HTML / CSS