NodeJS模块与ES6模块系统语法及注意点详解
社区模块规范:
1.CommonJS规范
规范实现者:
NodeJS服务端
Browserify浏览器
2.AMD规范全称异步模块定义
规范实现者:
RequireJS浏览器
3.CMD规范通用模块定义
规范实现者:
seaJS服务端和浏览器通用
官方模块规范
1.ESM规范就是ES6Module
各浏览器和服务端
目前常用的就是浏览器端的RequireJS、NodeJS、以及ESM
CommonJS语法分析
module.export
关键
1.module.exports实质上是一个对象,最后模块导出的对象就是这个引用指向的对象
module.export.key=value //eg: module.export.a=1; //整体管理导出,此时exports与module.exports指向断开,导致exports上的属性被忽略 module.export={ a:1, b:1 }
2.exports是一个module.export的助手变量,用于就地导出,两者默认指向同一对象,即module.exports===exportstrue
//像比较长的程序,写完所有之后,再去找到需要导出的变量再移到低端的export.module上逐个添加,是相当麻烦,一般在变量下决定是否导出 //eg letfA=function(){ } module.exports.fA=fA letfB=function(){ } module.exports.fB=fB //exports简洁很多 letfA=function(){ } module.fA=fA letfB=function(){ } module.fB=fB
3.在逐个导出时使用exports,而在导出一个对象时,使用module.exports,不建议混用,如果需要,可以作一下处理:
//在最后导出时将exports对象和module.exports对象合并 exports.a=1 module.exports=Object.assign({ b:1 },exports)
require
关键:
1.模块区分,知道即可
letf=require('url')
//核心模块,第三方模块(npm安装),指定模块名即可 letf=require('modulename') //自定义模块,需指定相对或者绝对路径 letf=require('absolutePATH/relativeAPTH')
2.查找时,没有后缀名的会尝试添加.js、.json、.node,这里可以稍微偷个懒
letf=require('./circle') //等同于 letf=require('./circle.js')
ESM语法分析:
exportvar/function/class
关键:
1.导出值和内部值要有对于关系,即
//error export1 //error letm=1 exportm //correct exportletm=1 //correct letm=1; export{m}
直接在声明时导出或者用一个{}包裹导出
2.exportdefault用于导出一个默认值,使得用户可以不需要知道内部导出变量名称即可使用
PS:一个模块只能有一个默认导出
exportdefault等同export{addasdefault} //不能接变量声明语句 exportdefaultleta=1
普通导出与默认导出使用的区别
//普通导出的导入使用 export{f} import{f}from'fmod' //默认导出的导入使用,可以无需知道导出模块的内部变量名,任意重命名 exportdefaultf importcfrom'fmod'
3.导出值与模块值是动态绑定的
exportletfoo='bar'; //500毫秒后,其他模块拿到的foo值会变成bar setTimeout(()=>foo='baz',500);
import用法
关键:
1.导入非默认变量时需要使用{}语法,并且变量要与导出时变量一致
//普通导出的导入使用 export{f} import{f}from'fmod'
2.导入默认变量时,省略{},并且可以重命名导出变量
//默认导出的导入使用,可以无需知道导出模块的内部变量名,任意重命名 exportdefaultf importcfrom'fmod'
3.可以使用*导出整体模块
//circle.js exportletradius=1 exportletarea=2*PI*radius //main.js import*ascirclefrom'./circle.js' circle.radius circle.area
4.可以使用,同时导出默认导出和常规导出
import_,{each,forEach}from'lodash'
5.多次import同一模块,只会执行一次
6.import可以与require混用,但是其在静态分析阶段执行,也就是会先于require加载,这在要求一定的导入顺序时要注意
export{foo,bar}from'my_module'; //可以简单理解为,但是合并写法等同于没有在当前模块中导入my_module,即无法使用 import{foo,bar}from'my_module'; export{foo,bar};
ESM加载CommmonJS
关键:
1.CommonJS模块输出对象module.exports将会被Node转换成默认导出
//导出 exportdefaultmodule.exports //导入,类似导入默认 importmfrom'./m'
2.此时CommonJS模块变量遵循其规则,不会动态绑定
module.exports=123; setTimeout(()=>module.exports=null,500) //500毫秒后,module.exports仍然是123
3.由于CommonJS模块运行时,才会确定输出的module.exports对象,而ESM在编译时就要确定接口,导入时,不允许解构语法
import{readFile}from'fs'
解决方案:
//整体导入 import*asexpressfrom'express' constapp=express.default() //默认导入,更优 importexpressfrom'express' constapp=express()
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。