浅谈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 相关文章推荐
ExtJS 2.0 实用简明教程之布局概述
Apr 29 Javascript
用js代码改变单选框选中状态的简单实例
Dec 18 Javascript
基于jQuery的判断iPad、iPhone、Android是横屏还是竖屏的代码
May 11 Javascript
jQuery中has()方法用法实例
Jan 06 Javascript
JS实现一个按钮的方法
Feb 05 Javascript
js面向对象的写法
Feb 19 Javascript
详解Backbone.js框架中的模型Model与其集合collection
May 05 Javascript
你不需要jQuery(三) 新AJAX方法fetch()
Jun 14 Javascript
jq实现左滑显示删除按钮,点击删除实现删除数据功能(推荐)
Aug 23 Javascript
微信小程序 基础组件与导航组件详细介绍
Feb 21 Javascript
vue中v-for加载本地静态图片方法
Mar 03 Javascript
react quill中图片上传由默认转成base64改成上传到服务器的方法
Oct 30 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
C#静态方法与非静态方法实例分析
2014/09/22 PHP
php处理静态页面:页面设置缓存时间实例
2017/06/22 PHP
Laravel框架运行出错提示RuntimeException No application encryption key has been specified.解决方法
2019/04/02 PHP
关于js中alert弹出窗口文本换行问题简单详细说明
2012/12/11 Javascript
原生js ActiveXObject获取execl里面的值
2013/11/01 Javascript
Jquery easyui开启行编辑模式增删改操作
2016/01/14 Javascript
Bootstrap源码学习笔记之bootstrap进度条
2016/12/24 Javascript
jQuery插件artDialog.js使用与关闭方法示例
2017/10/09 jQuery
js正则匹配多个全部数据问题
2019/12/20 Javascript
微信小程序以ssm做后台开发的实现示例
2020/04/08 Javascript
基于Vue CSR的微前端实现方案实践
2020/05/27 Javascript
解决vue动态路由异步加载import组件,加载不到module的问题
2020/07/26 Javascript
初学Python实用技巧两则
2014/08/29 Python
python编码最佳实践之总结
2016/02/14 Python
python运行时间的几种方法
2016/06/17 Python
Python的CGIHTTPServer交互实现详解
2018/02/08 Python
python实现决策树、随机森林的简单原理
2018/03/26 Python
Django实现学生管理系统
2019/02/26 Python
Python 图像处理: 生成二维高斯分布蒙版的实例
2019/07/04 Python
解决python中用matplotlib画多幅图时出现图形部分重叠的问题
2019/07/07 Python
python编程进阶之类和对象用法实例分析
2020/02/21 Python
keras 获取某层输出 获取复用层的多次输出实例
2020/05/23 Python
Python pip 常用命令汇总
2020/10/19 Python
美国知名的家庭连锁百货商店:Boscov’s
2017/07/27 全球购物
POP文化和音乐灵感的时尚:Hot Topic
2019/06/19 全球购物
个人简历自我评价八例
2013/10/31 职场文书
竞聘副主任科员演讲稿
2014/01/11 职场文书
优秀毕业生自我鉴定
2014/01/19 职场文书
产品包装策划方案
2014/05/18 职场文书
巾帼文明岗事迹材料
2014/12/24 职场文书
刑事上诉状(无罪)
2015/05/23 职场文书
惊涛骇浪观后感
2015/06/05 职场文书
关于军训的感想
2015/08/07 职场文书
python 遍历磁盘目录的三种方法
2021/04/02 Python
Python爬虫:从m3u8文件里提取小视频的正确操作
2021/05/14 Python
基于Android10渲染Surface的创建过程
2022/08/14 Java/Android