模块化
模块化规范:
-
AMD: requirejs
-
CMD: seajs 玉伯 浏览器端的模块
-
commonJS: nodejs 服务端的模块
基本概念
在nodejs中,应用由模块组成,nodejs中采用commonJS模块规范。
-
一个js文件就是一个模块
-
每个模块都是一个独立的作用域,在这个而文件中定义的变量、函数、对象都是私有的,对其他文件不可见。
-
01-模块化的概念
用于演示每一个模块都有自己单独的作用域
node中模块分类
-
1 核心模块
-
由 node 本身提供,不需要单独安装(npm),可直接引入使用
-
-
2 第三方模块
-
由社区或个人提供,需要通过npm安装后使用
-
-
3 自定义模块
-
由我们自己创建,比如:tool.js 、 user.js
-
核心模块
-
fs:文件操作模块
-
http:网络操作模块
-
path:路径操作模块
-
url: 解析地址的模块
-
querystring: 解析参数字符串的模块
-
基本使用:1 先引入 2 再使用
// 引入模块 var fs = require('fs');
第三方模块
-
第三方模块是由 社区或个人 提供的
-
比如:mime模块/art-template/jquery...
-
基本使用:1 先通过npm下载 2 再引入 3 最后使用
用户自定义模块
-
由开发人员创建的模块(JS文件)
-
基本使用:1 创建模块 2 引入模块
-
注意:自定义模块的路径必须以
./
获取../
开头
// 加载模块 require('./a') // 推荐使用,省略.js后缀! require('./a.js')
模块的导入与导出
模块导入
-
通过
require("fs")
来加载模块 -
如果是第三方模块,需要先使用npm进行下载
-
如果是自定义模块,需要加上相对路径
./
或者../
,可以省略.js
后缀,如果文件名是index.js
那么index.js也可以省略。 -
模块可以被多次导入,但是只会在第一次加载
模块导出
-
在模块的内部,
module
变量代表的就是当前模块,它的exports
属性就是对外的接口,加载某个模块,加载的就是module.exports
属性,这个属性指向一个空的对象。
//module.exports指向的是一个对象,我们给对象增加属性即可。 //module.exports.num = 123; //module.exports.age = 18; //通过module.exports也可以导出一个值,但是多次导出会覆盖 module.exports = '123'; module.exports = "abc";
module.exports与exports
-
exports
是module.exports
的引用 -
注意:给
module.exports
赋值会切断与exports
之间的联系-
1 直接添加属性两者皆可
-
2 赋值操作时,只能使用
module.exports
-
console.log( module.exports === exports ) // ==> true // 等价操作 module.exports.num = 123 exports.num = 123 // 赋值操作:不要使用 exports = {} module.exports = {}
第三方模块(以mime包为例)
-
先基于当前文件模块所属目录找 node_modules 目录
-
如果找到,则去该目录中找 mime 目录
-
如果找到 mime 目录,则找该目录中的 package.json 文件
-
如果找到 package.json 文件,则找该文件中的 main 属性
-
如果找到 main 属性,则拿到该属性对应的文件路径
-
如果找到 mime 目录之后
-
发现没有 package.json
-
或者 有 package.json 没有 main 属性
-
或者 有 main 属性,但是指向的路径不存在
-
则 node 会默认去看一下 mime 目录中有没有 index.js index.node index.json 文件
-
-
如果找不到 index 或者找不到 mime 或者找不到 node_modules
-
则进入上一级目录找 node_moudles 查找规则同上
-
如果上一级还找不到,继续向上,一直到当前文件所属磁盘根目录
-
如果最后到磁盘根目录还找不到,最后报错:
can not find module xxx