浅谈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 相关文章推荐
javascript new一个对象的实质
Jan 07 Javascript
基于Jquery插件开发之图片放大镜效果(仿淘宝)
Nov 19 Javascript
Get中文乱码IE浏览器Get中文乱码解决方案
Dec 26 Javascript
jQuery提示插件alertify使用指南
Apr 21 Javascript
AngularJS基础 ng-cut 指令介绍及简单示例
Aug 01 Javascript
json的结构与遍历方法实例分析
Apr 25 Javascript
Vuex利用state保存新闻数据实例
Jun 28 Javascript
基于vue.js的分页插件详解
Nov 27 Javascript
VUE 配置vue-devtools调试工具及安装方法
Sep 30 Javascript
微信小程序实现文字从右向左无限滚动
Nov 18 Javascript
VUE DEMO之模拟登录个人中心页面之间数据传值实例
Oct 31 Javascript
vue 公共列表选择组件,引用Vant-UI的样式方式
Nov 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显示MySQL数据的三种方法
2008/06/05 PHP
用Simple Excel导出xls实现方法
2012/12/06 PHP
php 启动报错如何解决
2014/01/17 PHP
php使用正则过滤js脚本代码实例
2014/05/10 PHP
PHP实现获取FLV文件的时间
2015/02/10 PHP
php实现购物车功能(上)
2020/07/23 PHP
Thinkphp 空操作、空控制器、命名空间(详解)
2017/05/05 PHP
php实现微信企业号支付个人的方法详解
2017/07/26 PHP
Jquery知识点二 jquery下对数组的操作
2011/01/15 Javascript
JavaScript中调用函数的4种方式代码实例
2015/07/08 Javascript
JavaScript中利用Array和Object实现Map的方法
2015/07/27 Javascript
javascript控制图片播放的实现代码
2020/07/29 Javascript
简介AngularJS中$http服务的用法
2016/02/06 Javascript
JavaScript中 ES6 generator数据类型详解
2016/08/11 Javascript
Node.js设置CORS跨域请求中多域名白名单的方法
2017/03/28 Javascript
Thinkjs3新手入门之添加一个新的页面
2017/12/06 Javascript
ES6使用export和import实现模块化的方法
2018/09/10 Javascript
node.js监听文件变化的实现方法
2019/04/17 Javascript
浅述python中argsort()函数的实例用法
2017/03/30 Python
利用python爬取斗鱼app中照片方法实例
2017/12/03 Python
python方向键控制上下左右代码
2018/01/20 Python
儿童编程python入门
2018/05/08 Python
python变量赋值方法(可变与不可变)
2019/01/12 Python
Pycharm之快速定位到某行快捷键的方法
2019/01/20 Python
python使用 zip 同时迭代多个序列示例
2019/07/06 Python
Python3 chardet模块查看编码格式的例子
2019/08/14 Python
Python 中 -m 的典型用法、原理解析与发展演变
2019/11/11 Python
HTML5新增的表单元素和属性实例解析
2014/07/07 HTML / CSS
哈萨克斯坦移动和数字技术在线商店:SatelOnline.kz
2020/09/04 全球购物
文秘专业大学生求职信
2013/11/10 职场文书
深入开展党的群众路线教育实践活动方案
2014/02/04 职场文书
文明家庭先进事迹材料
2014/05/14 职场文书
干部考核工作总结2015
2015/07/24 职场文书
上级领导检查欢迎词
2015/09/30 职场文书
人民调解协议书
2016/03/21 职场文书
如何使用PostgreSQL进行中文全文检索
2021/05/27 PostgreSQL