当前位置: 首页 > 后端技术 > Node.js

js模块化和手撕commonjs代码

时间:2023-04-03 13:01:52 Node.js

js语言模块化模块就是把一个复杂的程序按照一定的规则(标准)封装成若干块(文件),并将它们组合在一起,块的内部数据和实现是private,只对外暴露一些接口(方法)与其他外部模块进行通信。模块化的好处避免命名冲突(减少命名空间污染)更好的分离,按需加载更高的复用性高可维护性模块化规范commonjsCommonJS规范主要用于服务端编程,加载模块是同步的,不适合浏览器环境Example://module1.jsmodule.exports={msg:'module1',foo(){console.log(this.msg)}}//app.js文件//importmodule1moduleletmodule1=require('./modules/module1')module1.foo()//module1AMD规范AMD规范在浏览器环境中异步加载模块,可以并行加载多个模块。但AMD规范开发成本高,代码读写困难,模块定义方法语义不流畅。例子//定义一个有依赖的模块define(['module1','module2'],function(m1,m2){returnmodule})//引入和使用模块require(['module1','module2'],function(m1,m2){usem1/m2})CMD规范CMD规范与AMD规范非常相似,都是用于浏览器编程,依赖接近,延迟执行,可以很方便的在Node.js中运行。但是依赖SPM封装,模块的加载逻辑有偏差)//引入依赖模块(异步)require.async('./module3',function(m3){})//暴露模块exports.xxx=value})define(function(require){varm1=require('./module1')varm4=require('./module4')m1.show()m4.show()})ES6模块ES6在语言标准层面实现了模块功能,实现起来相当简单,可以完全取代CommonJS和AMD规范,成为浏览器和服务器通用的模块化解决方案**。/**定义模块math.js**/varbasicNum=0;varadd=function(a,b){returna+b;};export{basicNum,add};/**引用模块**/import{basicNum,从'./math'添加};functiontest(ele){ele.textContent=add(99+basicNum);}与commonJS的区别在于CommonJS模块输出的是value的拷贝,而ES6模块的输出是对value的引用.CommonJS模块在运行时加载,而ES6模块是编译时输出接口。umd规范umd模块规范与ES6模块和adm规范兼容。如果以上两个都不满足,则会挂载到全局对象上实现commonjsconstvm=require('vm')constfs=require('fs')constpath=require('path')functionModule(id){this.id=idthis.exports={}}Module.wrap=function(script){letwrapper=['(function(exports,require,module,dirname,filename){','})'];returnwrapper[0]+script+wrapper[1]}Module._resolveFilename=function(filename){//1.首先检查你传入的文件是否正常,如果存在则加载文件//2.如果文件不存在,尝试添加.js.json后缀letfilePath=path.resolve(__dirname,filename);让exists=fs.existsSync(filePath);如果(存在)返回文件路径;letkeys=Object.keys(Module._extensions)for(leti=0;i