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

发布时间 - 2026-01-11 03:18:52    点击率:

从版本 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 模块方法解析的全部内容,希望对大家有所帮助。如果您有什么问题,可以给我留言。感谢大家对本站的支持。


# nodejs  # 模块  # 原生模块  # node.JS的crypto加密模块使用方法详解(MD5  # AES  # Hmac  # Diffie-Hellman加密)  # NodeJS模块与ES6模块系统语法及注意点详解  # 详解CommonJS和ES6模块循环加载处理的区别  # Python3爬虫爬取百姓网列表并保存为json功能示例【基于request、lxml和json模块  # 详解Node.js中path模块的resolve()和join()方法的区别  # Node.js 使用request模块下载文件的实例  # ES6与CommonJS中的模块处理的区别  # Node.js笔记之process模块解读  # 详谈commonjs模块与es6模块的区别  # 详解node.js平台下Express的session与cookie模块包的配置  # 详解从Node.js的child_process模块来学习父子进程之间的通信  # Node.js中process模块常用的属性和方法  # JavaScript ES 模块的使用  # 加载  # 命令行  # 都是  # 器中  # 文件扩展名  # 有什么  # 是在  # 如果您  # 也会  # 你可以  # 就能  # 将在  # 是这样  # 什么时候  # 要在  # 也可  # 能在  # 你能  # 这部  # 可以通过 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: html如何与html链接_实现多个HTML页面互相链接【互相】  极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?  动图在线制作网站有哪些,滑动动图图集怎么做?  Python文件异常处理策略_健壮性说明【指导】  HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】  北京专业网站制作设计师招聘,北京白云观官方网站?  使用Dockerfile构建java web环境  Laravel事件监听器怎么写_Laravel Event和Listener使用教程  详解jQuery中基本的动画方法  Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法  HTML 中动态设置元素 name 属性的正确语法详解  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  JS实现鼠标移上去显示图片或微信二维码  个人摄影网站制作流程,摄影爱好者都去什么网站?  Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程  iOS正则表达式验证手机号、邮箱、身份证号等  厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  微信小程序 HTTPS报错整理常见问题及解决方案  常州企业网站制作公司,全国继续教育网怎么登录?  中国移动官方网站首页入口 中国移动官网网页登录  Laravel数据库迁移怎么用_Laravel Migration管理数据库结构的正确姿势  昵图网官方站入口 昵图网素材图库官网入口  Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】  Laravel如何安装Breeze扩展包_Laravel用户注册登录功能快速实现【流程】  高防服务器租用首荐平台,企业级优惠套餐快速部署  如何在不使用负向后查找的情况下匹配特定条件前的换行符  香港服务器WordPress建站指南:SEO优化与高效部署策略  小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像  iOS UIView常见属性方法小结  Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤  Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程  网站制作免费,什么网站能看正片电影?  Laravel如何实现用户注册和登录?(Auth脚手架指南)  Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境  微信小程序 wx.uploadFile无法上传解决办法  Javascript中的事件循环是如何工作的_如何利用Javascript事件循环优化异步代码?  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  JS中对数组元素进行增删改移的方法总结  如何在万网开始建站?分步指南解析  如何在万网利用已有域名快速建站?  Laravel如何使用Eloquent进行子查询  Laravel如何与Docker(Sail)协同开发?(环境搭建教程)  HTML透明颜色代码在Angular里怎么设置_Angular透明颜色使用指南【详解】  WordPress 子目录安装中正确处理脚本路径的完整指南  ,南京靠谱的征婚网站?  Laravel怎么使用Blade模板引擎_Laravel模板继承与Component组件复用【手册】  Claude怎样写结构化提示词_Claude结构化提示词写法【教程】  软银砸40亿美元收购DigitalBridge 强化AI资料中心布局  JavaScript模板引擎Template.js使用详解  百度输入法ai面板怎么关 百度输入法ai面板隐藏技巧