浅谈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 最佳实践
Oct 30 Javascript
javascript仿php的print_r函数输出json数据
Sep 13 Javascript
Extjs实现进度条的两种便捷方式
Sep 26 Javascript
JS实现div居中示例
Apr 17 Javascript
node.js中的fs.realpathSync方法使用说明
Dec 16 Javascript
jQuery中wrapAll()方法用法实例
Jan 16 Javascript
JavaScript多线程详解
Aug 12 Javascript
浅谈JS运算符&&和|| 及其优先级
Aug 10 Javascript
vue中的event bus非父子组件通信解析
Oct 27 Javascript
Node解决简单重复问题系列之Excel内容的获取
Jan 02 Javascript
JS面向对象编程基础篇(二) 封装操作实例详解
Mar 03 Javascript
Vue实现图书管理小案例
Dec 03 Vue.js
微信小程序实现按字母排列选择城市功能
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
Search Engine Friendly的URL设计
2006/10/09 PHP
php 下载保存文件保存到本地的两种实现方法
2013/08/12 PHP
ThinkPHP3.1新特性之查询条件预处理简介
2014/06/19 PHP
详解php的socket通信
2015/08/11 PHP
PHP实现递归目录的5种方法
2016/10/27 PHP
PHP实现求两个字符串最长公共子串的方法示例
2017/11/17 PHP
php测试kafka项目示例
2020/02/06 PHP
Javascript - HTML的request类
2007/01/09 Javascript
浅谈document.write()输出样式
2015/05/07 Javascript
bootstrap-treeview自定义双击事件实现方法
2016/01/09 Javascript
前端性能优化及技巧
2016/05/06 Javascript
jQuery插件制作的实例教程
2016/05/16 Javascript
jQuery插件cxSelect多级联动下拉菜单实例解析
2016/06/24 Javascript
JSONP和批量操作功能的实现方法
2016/08/21 Javascript
仿iframe效果Aajx文件上传实例
2016/11/18 Javascript
关于angular js_$watch监控属性和对象详解
2017/04/24 Javascript
详解require.js配置路径的用法和css的引入
2017/09/06 Javascript
基于js粘贴事件paste简单解析以及遇到的坑
2017/09/07 Javascript
JavaScript对象字面量和构造函数原理与用法详解
2020/04/18 Javascript
[04:49]期待西雅图之战 2016国际邀请赛中国区预选赛WINGS战队赛后采访
2016/06/29 DOTA
python获取豆瓣电影简介代码分享
2014/01/16 Python
简单介绍Python中的try和finally和with方法
2015/05/05 Python
python里使用正则的findall函数的实例详解
2017/10/19 Python
Python3.6实现根据电影名称(支持电视剧名称),获取下载链接的方法
2019/08/26 Python
使用PyCharm进行远程开发和调试的实现
2019/11/04 Python
Idea安装python显示无SDK问题解决方案
2020/08/12 Python
浅谈CSS3中的变形功能-transform功能
2017/12/27 HTML / CSS
HTML5+CSS3绘制锯齿状的矩形
2016/03/01 HTML / CSS
斐乐美国官方网站:FILA美国
2019/03/01 全球购物
美德少年事迹材料
2014/01/23 职场文书
旅游管理专业大学生职业规划书
2014/02/27 职场文书
英文请假条
2014/04/11 职场文书
学校三八妇女节活动总结
2015/02/06 职场文书
2016年教师节感恩寄语
2015/12/04 职场文书
MySql开发之自动同步表结构
2021/05/28 MySQL
python3 字符串str和bytes相互转换
2022/03/23 Python