Edge
  • Introduction
  • 文章
    • 如何将 emoji 当成单色 icon 使用
    • 在 web 使用 JavaScript 模块
    • 从零开始写一个 Promise 库
    • 魔幻语言 JavaScript 系列之类型转换、宽松相等以及原始值
    • React 整洁代码最佳实践
    • 魔幻语言 JavaScript 系列之 call、bind 以及上下文
    • 编写扁平化的代码
    • ES6 Promise:模式与反模式
    • 在 Node.js 中使用原生 ES 模块
    • 在工作中学习
    • JavaScript 中的匿名递归
    • 面向初学者的高阶组件介绍
    • CSS Animations vs Web Animations API
    • JavaScript 异常的防范与监控
    • 喜欢用 Git 做的一些小事
    • 移除在 ESM 模式生成的严格模式
    • 编写现代 JavaScript 代码
    • JavaScript 模块化现状
    • JS/React 开发者的 Atom 终极配置
    • 使用 ES6 的浏览器兼容性问题
    • 为什么是 JSONP
    • 实现不定尺寸图片居中的几种方式
    • Base64 简要笔记及其他
    • 关于内存对齐的一点注解
    • 康威生命游戏的简单实现
    • 使用双端队列模拟动态数组的部分功能
    • 三种变长编码方法的 C 实现
  • 聚沙成塔
    • Node.js
      • 包管理器
    • 基于 OS X 开发指南
    • OS X 小技巧
    • 基于 Windows 开发指南
    • Web Tools
    • Service Worker
    • vim
    • shell
    • 奇技
    • 程序员
    • BFC
    • 事件循环
    • 获取自定义全局变量
    • 颜色格式转换 rgb -> hex
    • 页面间 post 传参
    • 函数重载
    • Tree shaking
    • RequireJS tips
  • 算法
    • 约瑟夫问题
    • 简单排序
    • 快速排序
    • 快速排序优化
    • 三路快排和选择
    • 裴波那契
  • ECMAScript
    • 原型
    • Object.is
  • ES6+
    • ES6 Modules
    • import & export
  • React
    • setState
    • react 与 iscroll 的点击问题
    • pureRender
  • git
    • 重写提交信息
    • http 记住密码
  • 拾遗
    • 拾遗
Powered by GitBook
On this page
  • 1.演示
  • 2.清单:需要注意的事情
  • ES 模块:
  • 与 CJS 模块的互操作性
  • 3.早期版本的 Node.js 上的 ES 模块
  • FAQ
  • 什么时候可以不带命令行选项使用ES 模块?
  • 进一步阅读
  1. 文章

在 Node.js 中使用原生 ES 模块

PreviousES6 Promise:模式与反模式Next在工作中学习

Last updated 6 years ago

原文:

作者:

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

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 模块:

console.log(import.meta.url);
  • 现在所有模块标识符都是 URL(这部分在 Node.js 是新增的):

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

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

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

与 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 模块

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

FAQ

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

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

进一步阅读

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

即将到来的 ECMAScript 提案:

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

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

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

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

“” [using ES modules natively vs. transpiling them via Babel]

“” [Why .mjs? How are module specifiers resolved? Etc.]

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

博客: “”

提案: “”

Using ES modules natively in Node.js
Axel Rauschmayer
Bradley Farias
动态 import()
import.meta
可以来做
@std/esm
Making transpiled ES modules more spec-compliant
Module specifiers: what’s new with ES modules?
Modules
ES proposal: import() – dynamically importing ES modules
import.meta