【NodeJs中CommonJs和es6的区别(实践版本)】

2023-12-28 21:54:47

前言

“喜欢的人眼里总是藏着星星🌟,当她温柔的看我时简直就是一道银河🪐,那是我眼里的星星和银河”

梦…醒醒啦, 今天我们没有星星也没有银河,今天我们有 C o m m o n J s \color{red} {CommonJs} CommonJs E S 6 \color{red} {ES6} ES6。以前看过很多类似标题的文章,发现都停留在理论阶段,发现实践起来并不是那么回事,所以今天从Node开发角度做了一篇总结留给自己,并分享给大家。

大家一起进步, 我从以下几个部分总结

  • 模块机制
  • 应用场景

正文

模块机制

1、模块定义

CommonJs是一种模块规范,起初被用于Nodejs的模块规范。
ES6的出现为了解决前端Module规范

2、区别
模块加载机制
  • require的加载机制

Node.js中模块机制一般会经历3个步骤: 路径分析文件定位编译执行。详细可见大佬文章《五月君-Nodejs技术栈》

通过require机制可知道,require会进行资源的缓存,每次优先从缓存中拿取数据。解决了模块循环引用问题,我们可以通过require.cache查看缓存内容。
commonjs模块是运行时加载: 即在输入时是先加载整个模块,生成一个对象,然后再从这个对象上面读取方法,这种加载称为“运行时加载”

  • import x from 'xxx’的加载机制

import通过加载对象的值引用从而使用。
import模块编译时加载:即在import时可以指定加载某个输出值,而不是加载整个模块,实时加载最新,这种加载称为“编译时加载”

应用场景
  • CommonJs规范通过exportsrequire进行导出导入(在代码执行阶段);
  • ES6规范通过module.exportimport···from进行导出导入(在代码编译阶段)

?提问: 目前我所遇到的Node项目都是基于CommonJs,却会发现却可以使用ES6规范的导入导出关键词,不仅可以使用还全都使用的是原ES6规范下关键词,这是为什么呢?

  • 首先基于node版本v12来说,会发现,CommonJs规范下import * from 'xxx',会触发一个 experimental 警告信息

  • 其次我给node版本升到v14,哗,它居然可以啦🤣,这是什么鬼呢?立即明白是版本的问题啦,当即我查询资料后,发现在node v13.2版本实现了ES6模块语法,可以使用ES6规范的关键词了。

?项目大范围使用ES6模块语法有什么好处呢?为什么要用它?

1、ES6支持死代码检测和排除,我们可以利用静态分析工具检测出哪些模块没有被调用过
2、模块变量类型检查
3、编辑器优化,ES6 Module语法支持直接导入保良,减少引用层次,程序效率更高

所以在Node.js v13.2版本之后的就可以在commonjs规范下使用

?其实当我们node升级到14之后,面临着demo.js文件单独执行将不被识别,执行报错。

如果是基于commonjs规范,我们的代码文件需要为.cjs结尾,如果是基于es6规范,我们的代码文件需要为.mjs结尾。如果想体验es6模块语法使用.js文件格式,那么可以在package.json文件中加上"type": "module"即可

所以随着Node的版本更新,我们也开始慢慢过渡到使用TypeScript进行编码,不仅解决了存在js文件随Node版本更新而不被识别的问题了,还增加了静态类型检测,保证了代码的安全性

那么如果你使用TS编程,可以在ts编译文件中设置编译后为commonjs规范,使用的时候使用es6模块语法,达到预编译的目的。

总结

使用js文件格式进行编码的时候,我们基于commonjs规范,node的版本需要保持在v13版本之下。如果使用ts文件格式进行编程,为了提高程序效率可以考虑将node版本升到v14及以上,方便使用es6模块语法,同时前后端保持一致,有利于全栈开发。🚀🚀🚀

文章来源:https://blog.csdn.net/qq_38360110/article/details/135138749
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。