在 Node.js 中使用原生 ES 模块方法解析


Posted in Javascript onSeptember 19, 2017

从版本 8.5.0 开始,Node.js 开始支持原生 ES 模块,可以通过命令行选项打开该功能。新功能很大程度上得归功于 Bradley Farias。

1.演示

这个示例的代码目录结构如下:

esm-demo/
 lib.mjs
 main.mjs

lib.mjs:

export function add(x, y) {
 return x + y;
}

main.mjs:

import {add} from './lib.mjs';
console.log('Result: '+add(2, 3));

运行演示:

$ node --experimental-modules main.mjs
Result: 5

2.清单:需要注意的事情

ES 模块:

·不能动态导入模块。但是 动态import() 的相关工作正在进行中,应该很快就能提供支持。

·没有元变量,如 __dirname 和 __filename。但是,有一个的类似功能的提案:“import.meta”。看起来可能是这样:

console.log(import.meta.url);

·现在所有模块标识符都是 URL(这部分在 Node.js 是新增的):

·文件 - 带文件扩展名的相对路径: ../util/tools.mjs

·库 - 没有文件扩展名,也没有路径 lodash

·如何更好地使 npm 库在浏览器中也可用(不使用 bundler)仍有待观察。一种可能性是引入 RequireJS 风格的配置数据,将路径映射到实际路径。目前,在浏览器中使用 bare path 的模块标识符是非法的。

与 CJS 模块的互操作性

你可以导入 CJS 模块,但它们总是只有默认的导出 - 即 module.exports 的值。让 CJS 模块支持命名导出已经在做了,但可能需要一段时间。如果你能帮忙,可以来做。

import fs1 from 'fs';
console.log(Object.keys(fs1).length); // 86
import * as fs2 from 'fs';
console.log(Object.keys(fs2)); // ['default']

 · 不能在 ES 模块中使用 require()。主要原因是:

 · 路径解析工作稍有不同:ESM 不支持 NODE_PATH 和 require.extensions。而且,它的标识符始终是 URL 也会导致一些细微差异。

 · ES 模块始终以异步方式加载,这确保了与 Web 的最大兼容性。这种加载风格并不能通过 require() 混合使用同步加载 CJS 模块。

 · 禁止同步模块加载也可以为 Top-level await 导入 ES 模块保留后路(一个当前正在考虑的功能)。

3.早期版本的 Node.js 上的 ES 模块

如果要在 8.5.0 之前的 Node.js 版本上使用 ES 模块,请参阅 John-David Dalton 的 @std/esm。

提示:如果不启用任何可解锁的额外功能,将在 Node.js 保持 100% 兼容原生 ES 模块.

FAQ

什么时候可以不带命令行选项使用ES 模块?

目前的计划是在 Node.js 10 LTS 中默认可使用 ES 模块。

进一步阅读

有关 Node.js 和浏览器中 ES 模块的更多信息:

 · “Making transpiled ES modules more spec-compliant” [using ES modules natively vs. transpiling them via Babel]

 · “Module specifiers: what's new with ES modules?” [Why .mjs? How are module specifiers resolved? Etc.]

 · “Modules” [in-depth chapter on ES modules in “Exploring ES6”]

即将到来的 ECMAScript 提案:

 · 博客: “ES proposal: import() ? dynamically importing ES modules”

 · 提案: “import.meta”

总结

以上就是小编给大家带来的在 Node.js 中使用原生 ES 模块方法解析的全部内容,希望对大家有所帮助。如果您有什么问题,可以给我留言。感谢大家对本站的支持。

Javascript 相关文章推荐
js移除事件 js绑定事件实例应用
Nov 28 Javascript
详解javascript new的运行机制
Jan 26 Javascript
javascript每日必学之多态
Feb 23 Javascript
jQuery获取某天的农历日期并判断是否除夕或新年的方法
Mar 01 Javascript
JavaScript基础语法之js表达式
Jun 07 Javascript
浅谈JS之tagNaem和nodeName
Sep 13 Javascript
jQuery中DOM节点的删除方法总结(超全面)
Jan 22 Javascript
bootstrap插件treeview实现全选父节点下所有子节点和反选功能
Jul 21 Javascript
JavaScript中Object值合并方法详解
Dec 22 Javascript
Vue keepAlive 数据缓存工具实现返回上一个页面浏览的位置
May 10 Javascript
学习LayUI时自研的表单参数校验框架案例分析
Jul 29 Javascript
微信小程序wx.getUserInfo授权获取用户信息(头像、昵称)的实现
Aug 19 Javascript
Webpack 服务器端代码打包的示例代码
Sep 19 #Javascript
原生js中ajax访问的实例详解
Sep 19 #Javascript
angularjs实现过滤并替换关键字小功能
Sep 19 #Javascript
详解vue-cli与webpack结合如何处理静态资源
Sep 19 #Javascript
前端常见跨域解决方案(全)
Sep 19 #Javascript
详解.vue文件中监听input输入事件(oninput)
Sep 19 #Javascript
JavaScript数组去重的多种方法(四种)
Sep 19 #Javascript
You might like
PHP 5昨天隆重推出--PHP 5/Zend Engine 2.0新特性
2006/10/09 PHP
PHP读取PDF内容配合Xpdf的使用
2012/11/24 PHP
php+ajax 实现输入读取数据库显示匹配信息
2015/10/08 PHP
浅谈PHP面向对象之访问者模式+组合模式
2017/05/22 PHP
Yii实现微信公众号场景二维码的方法实例
2020/08/30 PHP
Yii中特殊行为ActionFilter的使用方法示例
2020/10/18 PHP
拖动一个HTML元素
2006/12/22 Javascript
JavaScript 程序编码规范
2010/11/23 Javascript
js 实现图片预加载(js操作 Image对象属性complete ,事件onload 异步加载图片)
2011/03/25 Javascript
JavaScript的this关键字的理解
2016/06/18 Javascript
深入理解Javascript中的观察者模式
2017/02/20 Javascript
简单实现jQuery弹窗效果
2017/10/30 jQuery
web前端vue之vuex单独一文件使用方式实例详解
2018/01/11 Javascript
vue获取当前激活路由的方法
2018/03/17 Javascript
微信小程序引用iconfont图标的方法
2018/10/22 Javascript
laydate如何根据开始时间或者结束时间限制范围
2018/11/15 Javascript
解决vue 子组件修改父组件传来的props值报错问题
2019/11/09 Javascript
JavaScript面试中常考的字符串操作方法大全(包含ES6)
2020/05/10 Javascript
[03:17]2014DOTA2 国际邀请赛中国区预选赛 四强专访
2014/05/23 DOTA
Python中请使用isinstance()判断变量类型
2014/08/25 Python
Python批量修改文本文件内容的方法
2016/04/29 Python
python打包压缩、读取指定目录下的指定类型文件
2018/04/12 Python
深入理解Python中的 __new__ 和 __init__及区别介绍
2018/09/17 Python
python提取具有某种特定字符串的行数据方法
2018/12/11 Python
Python文件操作方法详解
2020/02/09 Python
Django Xadmin多对多字段过滤实例
2020/04/07 Python
谈谈python垃圾回收机制
2020/09/27 Python
CSS3动画和HTML5新特性详解
2020/08/31 HTML / CSS
高中军训感想300字
2014/03/04 职场文书
信用社竞聘演讲稿
2014/05/16 职场文书
女生节标语
2014/06/26 职场文书
2016小学新学期寄语
2015/12/04 职场文书
Nginx反向代理多个服务器的实现方法
2021/03/31 Servers
Python基础知识之变量的详解
2021/04/14 Python
postgres之jsonb属性的使用操作
2021/06/23 PostgreSQL
ICOM R71E和R72E图文对比解说
2022/04/07 无线电