什么是模块化?
上模块化开发最终的目的是将程序划分成一个个小的结构
结构中编写属于自己的逻辑代码,有自己的作用域,定义变量名词时不会影响到其他的结构
这个结构可以将自己希望暴露的变量、函数、对象等导出给其结构使用
也可以通过某种方式,导入另外结构中的变量、函数、对象
这些就是提到的结构,就是模块;按照这种结构划分开发程序的过程,就是模块化开发的过程
例
// 假如项目中只有两个开发者 一个模块 一个JUSNYA
// 模块 创建一个js文件 声明变量name赋值为 模块化
// JUSNYA 创建一个js文件 声明变量name赋值为JUSNYAx
// 之后都在首页中引入
// mokuai.js文件本身是没有自己的作用域的 所有 模块化 文件中的name属于全局变量
// JUSNYA.js文件本身是没有自己的作用域的 所有 JUSNYAx 文件中的name属于全变量
// 之后都在首页中引入
// 为了避免全局变量命名冲突 所以我们可以借助立即函数
// 将 模块化 文件中的代码用立即执行函数包裹起来 JUSNYA也是
// 因为函数作用域 立即执行函数也是作用域的
// 现在就是我们给 mokuai 文件中的变量加上一层作用域 给 JUSNYA文件中的变量加上一层作用域
// 现在确实解决了全局变量命名的冲突问题
举例
一、实例
二、实例
解构赋值
exports导出
注:exports是一个对象,我们可以在这个对象中添加很多个属性,添加的属性会导出
文件中可以导入
完成也上操作! 理解这段话!
意味着main中的bar变量等于exports对象;
也就是require通过各种查找方式,最终找到了exports这个对象;
并且将这个exports对象赋值给了bar变量;
bar变量就是exports对象了
module.exports导出
为什么exports也可以导出呢?
因为module对象的exports属性是exports对象的一个引用;
也就是说 module.exports = exports = main中的bar;
第一种变量的导出
第二种变量的导出
第三种变量的导出
require细节
require是一个函数,可以帮助我们引入一个文件(模块)中导出的对象
require的查找规则是
导入格式如下:require(X)
第一种:X是一个Node核心模块,比如path、http 直接返回核心模块,并且停止查找
第二种:X是以 ./ 或 ../ 或 /(根目录)开头的
将X当做一个文件在对应的目录下查找; 有后缀名,按照后缀名的格式查找对应的文件,没有后缀名,会按照顺序:1、直接查找文件X 2、查找X.js文件 3、查找X.json文件 4、查找X.node文件 注:没有找到就会报错:not found
模块的加载过程
一:模块在被第一次引入时,模块中的js代码会被运行一次
二:模块被多次引入时,会缓存,最终只加载(运行)一次
为什么只会加载运行一次呢?
这是因为每个模块对象module都有一个属性:loaded。
为false表示还没有加载,为true表示已经加载;
结论:模块在被第一次引入时。模块中的js代码会被运行一次
结论二:模块被多次引入时,会缓存,最终只加载一次
这是因为每个模块对象module都有一个属性:loaded。
为false表示还没有加载,为true表示已经加载;