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

最完整的前端模块化解决方案

时间:2023-04-04 00:42:58 Node.js

模块化主要用于提取公共代码,隔离作用域,避免变量冲突。将复杂的系统分解为模块以便于编码。将介绍以下内容:CommonJSAMD及核心原理实现CMD及核心原理实现UMD及源码分析ES6Modulewebpack打包策略CommonJS同步加载CommonJSAPI是一个以构建浏览器环境外的JS生态为目标而产生的项目如果没有后缀写的Node在搜索前会尝试在文件名中加上.js,.json,.node。.js文件将被解析为文本格式的JavaScript脚本文件,.json文件将被解析为JSON格式的文本文件,.node文件将被解析为编译后的二进制文件。AMD异步加载(object)《AsynchronousModuleDefinition》(异步模块定义),是RequireJS提出的AMD核心实现functionrequire(url,callback){//url可以换成List,然后遍历;var$script=文件。创建元素('脚本');$script.src=url;//使用onload回调实现依赖加载$script.onload=function(e){//省略回调检测callback();}document.body.appendChild($脚本);}CMDloadingon-demand(seajs)由Yubo提出,按需解析和加载模块(成本相当高)。需要用模块转成字符串再解析才能知道CMD核心实现依赖哪些模块//Ajax,我怕忘记原生ajax怎么写了。写一个函数myAjax(url,callback){varxhr=newXMLHttpRequest();xhr.open('get',url);xhr.发送();xhr.onreadystatechange=function(){if(request.readyState===4){if(request.status===200){返回回调(request.responseText);}else{//省略...}}else{//省略...}}}//实现函数require(url){myAjax(url,function(res){//此时res对应JS的字符串形式//省略解析//executeeval(res);});UMD兼容AMD、CommonJS模块化语法。UMD源码分析(function(root,factory){//判断是否支持AMD(define是否存在)if(typeofdefine==='function'&&define.amd){define(['b'],factory);//判断是否支持NodeJS模块格式(是否存在exports)}elseif(typeofmodule==='object'&&module.exports){module.exports=factory(require('b'));//前两个是不存在的,然后将模块暴露给全局(窗口或全局)}else{root.returnExports=factory(root.b);}}(this,function(b){//...}));import加载编译时加载的引用(静态执行)。加载的是不能放在代码块中的引用,以实现编译时加载。proposal表示在使用的时候可以使用import()来加载。不能使用表达式和变量。运行时加载的语法同上。webpack打包策略import会被编译成require/exports(CommonJSSpecification)1.直接importimportxxx.js或者importxxx.css会像添加