Usestd/esmtouseESModulesinNode.jsdevelopment整理自ESModulesinNodeToday!,属于作者现代JavaScript开发:语法基础与实践技巧系列中的模块化和构建章节。本文主要介绍如何通过std/esm第三方库在Node.js应用中流畅的使用ESModules语法。使用std/esm在Node.js开发中使用ESModules随着主流浏览器逐渐开始支持ESModules标准,Node.js对ESM支持的实现也越来越受到重视;目前Node.js使用CommonJS作为官方的模块方案,虽然内置模块方案促进了Node.js的普及,但也对新的ESModules的引入造成了一定的阻碍。CommonJS和ESModules模块标准对比如下://CJSconsta=require("./a")module.exports={a,b:2}//ESMimportafrom"./a"exportdefault{a,b:2}由于CommonJS不兼容ESModules,Node.js打算引入.mjs(ModularJavaScript)文件扩展名来指定模块解析规则;格式文件,Node.js会自动调用JSON.parse方法。Node.js计划在2020年发布的9.x版本中引入内置的ESM支持,详细的Node.js中的ESM实现规范请参考Node.js官方文档ESModuleInteroperability;而目前主流的方式是使用Rollup,Webpack之类的构建工具或者Babel之类的转译器来转译代码。最近正式发布的@std/esm为我们提供了Node.js中CommonJS和ESModules的高性能调用,可以工作在Node.js4.x及以上版本;可以顺利集成到现有的Webpack和Babel环境中,支持不同的模块使用不同的依赖版本。不同于目前需要以CommonJS格式发布编译文件的方案,[@std/esm]可以以最小的成本转换源码,按需转换,动态缓存。它的基本命令行用法如下:>require('@std/esm')@std/esmenabled>importpathfrom'path';undefined>path.join("Hello","World");'Hello/World'[@std/esm]除了自动识别扩展名为.mjs的文件外,它还支持任何包含导入/导出、动态导入、文件URI方案等的文件。典型用法示例如下://首先安装并依赖npmi--save@std/esm//index.jsimporthellofrom"./main.js";hello();//main.jsimportthingfrom"./constants.js";exportdefaultfunction你好(){控制台。log(thing);}//constants.jsexportdefault"HelloWorld!";//运行文件node-r@std/esmindex.js//HelloWorld!试了一下发现@std/esm还是存在一些bug,对缓存代码的处理也不是很完善。目前不建议直接在生产环境中使用,但了解一些东西还是不错的。官方@std/esm对比Node.js9和CommonJS模块的加载时间如下。可以发现它仍然非常接近内置解决方案的性能:加载CJSequivs为每个模块约0.28毫秒加载内置ESM为每个模块约0.51毫秒首先@std/esm无缓存运行为约1.56毫秒permoduleSecondary@std/esmcachedrunswere~0.54millisecondspermodule扩展到这里阅读更多Node.js相关信息以提高Node.js应用程序吞吐量小优化技巧介绍JavaScript语法树和代码转换
