这篇文章给大家分享的是有关节点。js的模块有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。
节点。js的模块
JavaScript做为一门为网页添加交互功能的简单脚本语言问世,在开始并不包含模块系统,随着JavaScript解决问题越来越复杂,把所有代码写在一个文件内,用函数区分功能单元已经不能支撑复杂应用开发了,ES6带来了大部分高级语言都有的类和模块,方便开发者组织代码
进口_ & # 39;lodash& # 39;; 类有趣的{} 出口默认乐趣;
上面三行代码展示了一个模块系统最重要的两个要素导入和导出
- <李>
<代码> 代码>出口用于规定模块的对外接口
李> <李><代码> 代码>用进口于输入其他模块提供的功能
李>而在ES6之前,社区出现了很多模块加载方案,最主要的有CommonJS和AMD两种,节点。js诞生早于ES6,模块系统使用的是类似CommonJS的实现,遵从几个原则
- <李>
一个文件是一个模块,文件内的变量作用域都在模块内
李> <李>使用<代码>模块。出口> 代码对象导出模块对外接口
李> <李>使用<代码> 代码>需要引入其它模块
李><代码>循环。js代码>
const{π}=数学; 模块。出口=功能区域(r) { π* r * * 2; };
上面代码就实现了节点。js的一个模块,模块没有依赖其它模块、导出了方法<代码> 代码>区域计算圆的面积
<代码>测试。js代码>
const面积=要求(& # 39;。/circle.js& # 39;); 控制台。日志(“半径为4的圆的面积是${区域(4)}');
模块依赖了圆。js,使用其对外暴露面积的方法,计算圆的面积
模块。出口
模块对外暴露接口使用module.exports,常见的有两种用法:为其添加属性或赋值到新对象
<代码>测试。js代码>
//添加属性 module.exports。prop1=xxx; module.exports。funA=xxx; module.exports。funB=xxx;//赋值到全新对象 模块。出口={ prop1, funA, funB, };
两种写法是等价的,使用时候没区别
const mod=要求(& # 39;。/. js # 39;); console.log (mod.prop1); console.log (mod.funA ());
还有另外一种直接使用<代码> 代码>出口对象的方法,但是只能对其添加属性,不能赋值到新对象,后面会介绍原因
//正确的写法:添加属性 出口。prop1=xxx; 出口。funA=xxx; 出口。funB=xxx;//赋值到全新对象 模块。出口={ prop1, funA, funB, };
要求(& # 39;id # 39;)
需要用法比较简单,id支持模块名和文件路径两种类型
const fs=要求(& # 39;fs # 39;);
const _=要求(& # 39;lodash& # 39;);
示例中的fs, lodash都是模块名,fs是节点。js内置的核心模块,lodash是通过npm安装到<代码> node_modules> 代码下的第三方模块,如果出现重名,优先使用系统内置模块
因为一个项目内可能会包含多个node_modules文件夹(节点。js比较失败的设计),第三方模块查找过程会遵循就近原则逐层上溯(可以在程序中打印<代码>模块。路径> 代码查看具体查找路径),直到根据<代码> NODE_PATH 代码>环境变量查找到文件系统根目录,具体过程可以参考官方文档
此外,节点。js还会搜索以下的全局目录列表:
- <李> $ HOME/.node_modules李> <李> $ HOME/@罾頽ode_libraries > <> $前缀/lib/节点李>
其中<代码> $ HOME> 代码是用户的主目录,<代码> $前缀> 代码是节点。js里配置的<代码> node_prefix> 代码。强烈建议将所有的依赖放在本地的node_modules目录,这样将会更快地加载,且更可靠
模块还可以可以使用文件路径加载,这是项目内自定义模块的通用加载方式,路径可以省略拓展名,会按照. js, . json。节点顺序尝试
- <李>以<代码> & # 39;/& # 39;代码>为前缀的模块是文件的绝对路径,按照系统路径查找模块李> <李>以<代码> & # 39;。/& # 39;代码>为前缀的模块是相对于当前调用要求方法的文件,不受后续模块在哪里被使用到影响李>