浅谈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入门—选择器实现隔行变色实例代码
Jan 04 Javascript
JavaScript 函数replace深入了解
Mar 14 Javascript
jQuery Validate插件实现表单强大的验证功能
Dec 18 Javascript
AngularJS使用带属性值的ng-app指令实现自定义模块自动加载的方法
Jan 04 Javascript
BootStrap select2 动态改变值的方法
Feb 10 Javascript
$.browser.msie 为空或不是对象问题的多种解决方法
Mar 19 Javascript
jQuery:unbind方法的使用详解
Aug 14 jQuery
jQuery实现的事件绑定功能基本示例
Oct 11 jQuery
Angular实现的自定义模糊查询、排序及三角箭头标注功能示例
Dec 28 Javascript
JS实现监控微信小程序的原理
Jun 15 Javascript
JavaScript设计模式之责任链模式实例分析
Jan 16 Javascript
js中对象与对象创建方法的各种方法
Feb 27 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计算百度地图两个GPS坐标之间距离的方法
2015/01/09 PHP
php实现背景图上添加圆形logo图标的方法
2016/11/17 PHP
利用PHP访问MySql数据库的逻辑操作以及增删改查的实例讲解
2017/08/30 PHP
jqgrid 表格数据导出实例
2013/11/21 Javascript
javascript获取元素离文档各边距离的方法
2015/02/13 Javascript
浅谈JS运算符&&和|| 及其优先级
2016/08/10 Javascript
Vue.js开发环境搭建
2016/11/10 Javascript
AngularJs中 ng-repeat指令中实现含有自定义指令的动态html的方法
2017/01/19 Javascript
js事件冒泡与事件捕获详解
2017/02/20 Javascript
Bootstrap导航中表单简单实现代码
2017/03/06 Javascript
Angular.js组件之input mask对input输入进行格式化详解
2017/07/10 Javascript
JavaScript实现离开页面前提示功能【附jQuery实现方法】
2017/09/26 jQuery
vue实现直播间点赞飘心效果的示例代码
2019/09/20 Javascript
在SSM框架下用laypage和ajax实现分页和数据交互的方法
2019/09/27 Javascript
详解微信小程序工程化探索之webpack实战
2020/04/20 Javascript
微信小程序国际化探索实现(附源码地址)
2020/05/20 Javascript
Vue 样式切换及三元判断样式关联操作
2020/08/09 Javascript
javascript实现贪吃蛇游戏(娱乐版)
2020/08/17 Javascript
[01:13]2014DOTA2西雅图邀请赛 舌尖上的TI4
2014/07/08 DOTA
python复制文件的方法实例详解
2015/05/22 Python
简单了解Python生成器是什么
2019/07/02 Python
关于pandas的离散化,面元划分详解
2019/11/22 Python
python实现将一维列表转换为多维列表(numpy+reshape)
2019/11/29 Python
Python GUI编程学习笔记之tkinter中messagebox、filedialog控件用法详解
2020/03/30 Python
关于jupyter打开之后不能直接跳转到浏览器的解决方式
2020/04/13 Python
解决pycharm中的run和debug失效无法点击运行
2020/06/09 Python
Casetify官网:自制专属手机壳、iPad护壳和Apple Watch手表带
2018/05/09 全球购物
Java中实现多态的机制
2015/08/09 面试题
小区门卫工作职责
2013/12/14 职场文书
护理目标管理责任书
2014/07/25 职场文书
离婚协议书范文2015
2015/01/26 职场文书
小学运动会开幕词
2015/01/28 职场文书
大学学生会主席竞选稿怎么写?
2019/08/19 职场文书
用Python写一个简易版弹球游戏
2021/04/13 Python
「月刊Comic Alive」2022年5月号封面公开
2022/03/21 日漫
httpclient调用远程接口的方法
2022/08/14 Java/Android