浅谈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 - 如何引入js代码
Mar 09 Javascript
javascript 动态加载 css 方法总结
Jul 11 Javascript
页面加载完毕后滚动条自动滚动一定位置
Feb 20 Javascript
开启Javascript中apply、call、bind的用法之旅模式
Oct 28 Javascript
jQuery轻松实现无缝轮播效果
Mar 22 jQuery
浅谈js基础数据类型和引用类型,深浅拷贝问题,以及内存分配问题
Sep 02 Javascript
前端把html表格生成为excel表格的实例
Sep 19 Javascript
vue-lazyload使用总结(推荐)
Nov 01 Javascript
微信小程序云开发之云函数详解
May 16 Javascript
webpack 处理CSS资源的实现
Sep 27 Javascript
js实现消灭星星(web简易版)
Mar 24 Javascript
JavaScript Window浏览器对象模型原理解析
May 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
用mysql内存表来代替php session的类
2009/02/01 PHP
php开启安全模式后禁用的函数集合
2011/06/26 PHP
zf框架的zend_cache缓存使用方法(zend框架)
2014/03/14 PHP
php 购物车完整实现代码
2014/06/05 PHP
php的GD库imagettftext函数解决中文乱码问题
2015/01/24 PHP
PHP使用ffmpeg给视频增加字幕显示的方法
2015/03/12 PHP
PHP封装curl的调用接口及常用函数详解
2018/05/31 PHP
PHP通过文件保存和更新信息的方法分析
2019/09/12 PHP
JavaScript的eval JSON object问题
2009/11/15 Javascript
合并table相同单元格的jquery插件分享(很精简)
2011/06/20 Javascript
jquery中get,post和ajax方法的使用小结
2014/02/04 Javascript
JavaScript数组对象赋值用法实例
2015/08/04 Javascript
js获取对象、数组的实际长度,元素实际个数的实现代码
2016/06/08 Javascript
JS生成不重复的随机数组的简单实例
2016/07/10 Javascript
Nodejs进阶:如何将图片转成datauri嵌入到网页中去实例
2016/11/21 NodeJs
VUE 使用中踩过的坑
2018/02/08 Javascript
Vue.js 实现微信公众号菜单编辑器功能(一)
2018/05/08 Javascript
js实现图片上传并预览功能
2018/08/06 Javascript
Vue源码解析之数据响应系统的使用
2019/04/24 Javascript
vue如何自动化打包测试环境和正式环境的dist/test文件
2019/06/06 Javascript
微信小程序indexOf的替换方法(推荐)
2020/01/14 Javascript
[03:02]2020完美世界城市挑战赛(秋季赛)总决赛回顾
2021/03/11 DOTA
Python内置函数的用法实例教程
2014/09/08 Python
Python引用类型和值类型的区别与使用解析
2017/10/17 Python
Python Flask框架扩展操作示例
2019/05/03 Python
使用jupyter notebook直接打开.md格式的文件
2020/04/10 Python
俞敏洪励志演讲稿
2014/04/29 职场文书
社区班子个人对照检查材料思想汇报
2014/10/07 职场文书
教师正风肃纪剖析材料
2014/10/20 职场文书
护士年终个人总结
2015/02/13 职场文书
什么是执行力?9个故事告诉您:成功绝非偶然!
2019/07/05 职场文书
matplotlib如何设置坐标轴刻度的个数及标签的方法总结
2021/06/11 Python
使用nginx配置访问wgcloud的方法
2021/06/26 Servers
Mybatis-plus在项目中的简单应用
2021/07/01 Java/Android
MongoDB支持的索引类型
2022/04/11 MongoDB
使用python绘制分组对比柱状图
2022/04/21 Python