“喜欢的人眼里总是藏着星星🌟,当她温柔的看我时简直就是一道银河🪐,那是我眼里的星星和银河”
梦…醒醒啦, 今天我们没有星星也没有银河,今天我们有 C o m m o n J s \color{red} {CommonJs} CommonJs和 E S 6 \color{red} {ES6} ES6。以前看过很多类似标题的文章,发现都停留在理论阶段,发现实践起来并不是那么回事,所以今天从Node开发角度做了一篇总结留给自己,并分享给大家。
大家一起进步, 我从以下几个部分总结
CommonJs
是一种模块规范,起初被用于Nodejs的模块规范。
ES6
的出现为了解决前端Module规范
Node.js中模块机制一般会经历3个步骤:
路径分析
、文件定位
、编译执行
。详细可见大佬文章《五月君-Nodejs技术栈》
通过require机制可知道,require会进行资源的缓存,每次优先从缓存中拿取数据。解决了模块循环引用问题,我们可以通过
require.cache
查看缓存内容。
commonjs模块是运行时加载
: 即在输入时是先加载整个模块,生成一个对象,然后再从这个对象上面读取方法,这种加载称为“运行时加载”
import通过加载对象的值引用从而使用。
import模块编译时加载
:即在import时可以指定加载某个输出值,而不是加载整个模块,实时加载最新,这种加载称为“编译时加载”
CommonJs
规范通过exports
和require
进行导出导入(在代码执行阶段);ES6
规范通过module.export
和import···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模块语法,同时前后端保持一致,有利于全栈开发。🚀🚀🚀