哪能建设网站免备案云服务器租用

张小明 2026/1/10 8:40:07
哪能建设网站,免备案云服务器租用,计算机网络技术就业方向有哪些,双wordpress自动同步文章JavaScript学习笔记#xff1a;16.模块 上一篇用迭代器和生成器搞定了“智能遍历”#xff0c;这一篇咱们来解锁JS大型项目的“核心管理工具”——模块#xff08;Modules#xff09;。你肯定经历过这样的场景#xff1a;写小demo时#xff0c;把所有代码堆在一个script标…JavaScript学习笔记16.模块上一篇用迭代器和生成器搞定了“智能遍历”这一篇咱们来解锁JS大型项目的“核心管理工具”——模块Modules。你肯定经历过这样的场景写小demo时把所有代码堆在一个script标签里清爽又省事但项目一变大几百行代码挤在一起变量重名、函数调用混乱、依赖关系像一团乱麻——这就是传说中的“代码屎山”。模块的出现就像给代码建了一套“公司部门分工系统”把代码按功能拆成独立文件部门比如工具模块、用户模块、订单模块每个模块只干自己的活职责单一通过“导出对外提供服务”和“导入使用其他部门服务”协作既避免了“变量打架”又让代码结构清晰、维护性翻倍。今天咱们就用“公司运营”的生活化比喻把模块的核心特性、导入导出语法、实战场景和避坑指南彻底讲透让你从“堆代码”升级为“管代码”。一、先破案为什么需要模块无模块时代有多坑在ES6模块ES Modules简称ESM出现前JS没有原生模块系统前端开发者只能用“脚本拼接”的方式写代码坑点多到让人崩溃1. 无模块时代的三大痛点变量全局污染所有脚本的变量都在全局作用域不小心重名就会“打架”// script1.jsletname张三;// 全局变量// script2.jsletname李四;// 覆盖全局变量console.log(name);// 李四script1的name被覆盖 Bug诞生依赖关系混乱多个脚本按顺序加载一旦调整顺序就可能报错!-- 依赖顺序必须严格遵守乱序就崩 --scriptsrctool.js/script!-- 提供formatDate函数 --scriptsrcuser.js/script!-- 依赖tool.js的formatDate --scriptsrcorder.js/script!-- 依赖user.js的用户数据 --代码复用困难想复用某个函数只能复制粘贴或通过全局变量暴露无法精准“按需引入”。2. 模块的核心解决方案模块完美解决这些问题核心靠三个特性独立作用域每个模块是单独的作用域变量、函数不会污染全局也不会被外部随意访问按需导入导出模块只暴露需要对外提供的功能导出其他模块只引入需要的功能导入不冗余静态依赖解析导入导出在代码编译时就确定支持“树摇优化”删除未使用的代码减小打包体积。简单说模块让代码从“一锅大杂烩”变成“精致套餐”每个菜品模块独立制作按需组合。二、模块的核心特性理解“部门分工”的底层逻辑要用好模块先搞懂它的三个核心特性这是避免踩坑的关键1. 独立作用域模块是“封闭的部门”每个模块的顶层变量let/const/function都是模块内私有不会挂载到全局外部无法直接访问除非主动导出// tool.js模块letinternalVar我是模块内部变量;// 私有变量外部访问不到exportconstformatDate(date){returndate.toLocaleString();};// main.js模块import{formatDate}from./tool.js;console.log(formatDate(newDate()));// 正常使用导出的函数console.log(internalVar);// ReferenceError: internalVar is not defined私有变量无法访问就像公司部门的内部文件只有对外公开的接口导出外部才能调用。2. 静态导入导出编译时确定“依赖关系”模块的import和export只能写在模块顶层不能写在if、函数里编译时就解析依赖这带来两个好处语法严谨避免动态引入导致的依赖混乱支持树摇打包工具如Webpack、Vite能识别未使用的导出自动删除减小文件体积。// 反面例子import不能写在代码块里if(needFormat){import{formatDate}from./tool.js;// 报错Invalid import declaration}// 正面例子import必须在模块顶层import{formatDate}from./tool.js;if(needFormat){formatDate(newDate());}3. 模块单例模式“部门只成立一次”同一个模块被多次导入只会执行一次后续导入的都是同一个模块实例避免重复执行和内存浪费// counter.js模块letcount0;exportconstincrement(){count;console.log(count);};// main1.js模块import{increment}from./counter.js;increment();// 1模块执行count1// main2.js模块import{increment}from./counter.js;increment();// 2模块未重复执行复用之前的count就像公司部门只成立一次不管多少个其他部门模块调用它都是同一个部门提供服务。三、导入导出语法模块的“对外接口”与“协作方式”导入import和导出export是模块协作的核心分“默认导出”和“命名导出”两种用法不同不能混用。1. 命名导出“部门的多个对外窗口”一个模块可以有多个命名导出导出的是“带名字的功能”导入时必须用相同的名字可重命名。1导出语法// tool.js模块// 方式1直接导出exportconstformatDate(date)date.toLocaleString();exportconstadd(a,b)ab;// 方式2先定义再集中导出推荐清晰constmultiply(a,b)a*b;constsubtract(a,b)a-b;export{multiply,subtract};// 方式3导出时重命名避免名字冲突export{multiplyasmultiplyNum};// 对外暴露的名字是multiplyNum2导入语法// main.js模块// 方式1导入指定命名导出import{formatDate,add}from./tool.js;console.log(formatDate(newDate()),add(2,3));// 正常使用// 方式2导入时重命名解决名字冲突import{multiplyasmul}from./tool.js;console.log(mul(2,3));// 6// 方式3导入所有命名导出用*import*astoolfrom./tool.js;console.log(tool.formatDate(newDate()),tool.add(2,3));// 通过tool对象访问// 方式4导入默认导出命名导出混合导入importtoolDefault,{add}from./tool.js;2. 默认导出“部门的主窗口”一个模块只能有一个默认导出导出的是“默认功能”导入时可以自定义名字不用和导出名一致。1导出语法// user.js模块// 方式1直接默认导出exportdefaultclassUser{constructor(name){this.namename;}}// 方式2先定义再默认导出constgetUserInfo(){return{name:张三,age:25};};exportdefaultgetUserInfo;2导入语法// main.js模块// 导入默认导出自定义名字不用和导出名一致importMyUserfrom./user.js;// 导入默认导出的User类命名为MyUserconstusernewMyUser(李四);// 导入默认导出时名字可以任意改importgetInfofrom./user.js;// 导入默认导出的getUserInfo命名为getInfoconsole.log(getInfo());// { name: 张三, age: 25 }3. 关键区别默认导出 vs 命名导出特性默认导出命名导出数量限制一个模块只能有一个一个模块可以有多个导入名字可自定义无需和导出名一致必须和导出名一致可重命名适用场景模块核心功能如单个类、函数模块多个辅助功能如工具函数集合导入语法import 自定义名 from 模块import { 导出名 } from 模块避坑不要在一个模块中同时默认导出和命名导出同一个功能容易混淆。四、实战场景模块的“正确打开方式”模块的用法分“浏览器环境”和“Node.js环境”核心语法一致但配置略有不同。1. 浏览器环境直接使用ESM浏览器原生支持ESM只需给script标签加typemodule就能使用模块1目录结构project/ ├── tool.js模块 ├── user.js模块 └── index.html入口2代码实现// tool.jsexportconstformatDate(date)date.toLocaleString();// user.jsimport{formatDate}from./tool.js;exportdefaultclassUser{constructor(name,birthDate){this.namename;this.birthDateformatDate(birthDate);}}// index.html!DOCTYPEhtmlhtmlbody!--必须加typemodule声明这是模块脚本--script typemoduleimportUserfrom./user.js;constusernewUser(张三,newDate(2000-01-01));console.log(user);// User { name: 张三, birthDate: 2000/1/1 00:00:00 }/script/body/html3浏览器模块的注意事项必须通过HTTP/HTTPS协议打开不能直接双击本地文件会报CORS错误导入路径必须是完整路径相对路径./、绝对路径或URL不能省略./模块脚本会延迟执行相当于defer确保DOM加载完成后执行。2. Node.js环境支持ESM和CommonJSNode.js默认支持CommonJS模块require/module.exports但从v14.13开始支持ESM只需满足以下条件之一文件名后缀为.mjs在package.json中添加type: module。1配置package.json{type:module// 声明项目使用ESM}2代码实现// tool.mjs或tool.js因package.json配置exportconstadd(a,b)ab;// main.mjsimport{add}from./tool.js;console.log(add(2,3));// 53CommonJS与ESM的互操作如果需要在ESM中导入CommonJS模块如旧版npm包直接导入即可在CommonJS中导入ESM模块需用动态import// CommonJS模块commonjs.jsexports.multiply(a,b)a*b;// ESM模块esm.jsimport{multiply}from./commonjs.js;// 直接导入CommonJS模块console.log(multiply(2,3));// 6// CommonJS模块main.cjs// 需用动态import导入ESM模块import(./esm.js).then(({add}){console.log(add(2,3));// 5});3. 动态导入按需加载“部门服务”静态import必须在模块顶层无法按需加载如点击按钮后再导入。动态import()是函数返回Promise支持在任意位置按需导入模块适合懒加载场景如路由切换、按需加载组件// main.js模块// 点击按钮后动态导入tool.jsdocument.querySelector(button).addEventListener(click,async(){const{formatDate}awaitimport(./tool.js);console.log(formatDate(newDate()));// 按需加载并使用});4. 循环依赖模块的“双向协作”两个模块互相导入A导入BB导入A称为循环依赖ESM能自动处理只要确保导入时模块已暴露部分功能即可// a.jsimport{bFunc}from./b.js;exportconstaFunc(){console.log(aFunc执行);bFunc();};// b.jsimport{aFunc}from./a.js;exportconstbFunc(){console.log(bFunc执行);};// main.jsimport{aFunc}from./a.js;aFunc();// 输出aFunc执行 → bFunc执行正常运行ESM通过“部分导出”机制处理循环依赖模块在执行过程中会逐步暴露已定义的导出后续导入能访问到已暴露的部分。五、避坑指南模块的“常见陷阱”1. 陷阱1忘记加typemodule浏览器中使用模块时script标签没加typemodule会把模块脚本当成普通脚本import/export报错!-- 反面例子没加typemodule --scriptsrcmain.js/script!-- 报错Unexpected token export --!-- 正面例子加typemodule --scripttypemodulesrcmain.js/script2. 陷阱2导入路径错误ESM导入路径必须是完整路径不能省略./也不能像CommonJS那样省略文件后缀// 反面例子1省略./报错import{formatDate}fromtool.js;// 浏览器会当成npm包找不到// 反面例子2省略文件后缀Node.js ESM不支持import{formatDate}from./tool;// 报错Cannot find module ./tool// 正面例子import{formatDate}from./tool.js;// 正确3. 陷阱3默认导出和命名导出混用导入时混淆默认导出和命名导出导致报错// 模块导出默认导出exportdefaultclassUser{}// 反面例子用命名导入方式导入默认导出import{User}from./user.js;// 报错Cannot destructure property User of ...// 正面例子用默认导入方式importUserfrom./user.js;// 正确4. 陷阱4模块顶层this不是全局对象普通脚本的顶层this是window浏览器/globalNode.js但模块顶层this是undefined不要依赖this// 普通脚本console.log(thiswindow);// true// 模块脚本console.log(this);// undefined5. 陷阱5循环依赖导致“未定义”循环依赖时若导入的功能在模块执行后期才定义会导致暂时的undefined// a.jsimport{bFunc}from./b.js;exportconstaFunc()bFunc();console.log(bFunc);// undefinedbFunc还没定义// b.jsimport{aFunc}from./a.js;exportconstbFunc()console.log(b);避坑循环依赖时避免在模块顶层执行依赖的函数把执行逻辑放在函数内部延迟执行。六、总结模块的核心价值与最佳实践模块是JS大型项目的“基石”核心价值是“结构化组织代码”让代码从“混乱堆砌”变成“有序协作”。掌握模块的最佳实践能让你的项目维护性翻倍1. 最佳实践按功能拆分模块一个模块只做一件事如工具模块、用户模块、API请求模块优先使用命名导出多个功能用命名导出单个核心功能用默认导出避免混淆按需导入只导入需要的功能不导入整个模块减少冗余用动态导入实现懒加载路由、弹窗等场景按需加载模块提升首屏加载速度。2. 核心价值总结解决全局污染模块独立作用域变量不冲突简化依赖管理静态导入导出依赖关系清晰提升代码复用精准导入导出无需复制粘贴支持工程化配合打包工具实现树摇、压缩优化项目性能。从ES6模块开始JS终于有了原生的“代码组织方案”这也是现代前端工程化Webpack、Vite、Rollup的基础。掌握模块你就能轻松应对大型项目的代码管理告别“代码屎山”。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

网站开发费属于什么费用网站平台之间的关系

Miniconda创建环境指定Python版本的操作 在数据科学、机器学习和现代软件开发中,你是否遇到过这样的问题:一个项目依赖 Python 3.9 和 PyTorch 1.12,而另一个新项目却要求 Python 3.10 才能运行最新的 Hugging Face 库?当你试图在…

张小明 2026/1/10 8:40:10 网站建设

郴州网站制作公司在哪里网站开发合同知识产权

网络服务器相关知识详解 在网络环境中,服务器的管理和维护涉及多个方面,包括FTP服务、邮件服务以及域名服务等。下面将详细介绍这些服务的相关内容。 1. FTP服务管理 在使用FTP服务时,有两个重要的方面需要关注:数据传输和磁盘空间。 - 数据传输 :所有的FTP下载都会…

张小明 2026/1/10 8:40:11 网站建设

网站代运营要多少费用吗网店运营基础知识

PyTorch Miniconda-Python3.9 完美AI开发组合 在人工智能项目日益复杂的今天,一个常见的痛点是:昨天还能跑通的代码,今天却因为某个库更新而报错;或者团队成员之间反复争论“为什么在我机器上没问题”——这类问题背后&#xff0…

张小明 2026/1/10 8:40:12 网站建设

苏州市住房和城乡建设部网站wordpress会员可见

Bili2text:深度解析视频内容智能提取技术 【免费下载链接】bili2text Bilibili视频转文字,一步到位,输入链接即可使用 项目地址: https://gitcode.com/gh_mirrors/bi/bili2text 在当前信息爆炸的时代,视频内容已成为知识传…

张小明 2026/1/10 8:40:15 网站建设

网站备案在哪里审批wordpress内容页插件

Wan2.2-T2V-A14B在政府公益宣传片中的合规性使用指南引言 你有没有想过,一条关于“节约用水”的公益短片,从文案到成片只需几分钟?不是剪辑老素材,也不是套模板——而是AI直接生成画面:阳光洒在小区阳台上,…

张小明 2026/1/10 8:40:13 网站建设

合肥企业网站建设公司越来越多大学生喜欢虚拟空间

B站音频下载神器BiliFM:一键保存UP主所有音频内容 【免费下载链接】BiliFM 下载指定 B 站 UP 主全部或指定范围的音频,支持多种合集。A script to download all audios of the Bilibili uploader you love. 项目地址: https://gitcode.com/jingfelix/B…

张小明 2026/1/8 22:46:23 网站建设