什么是模块
(1).模块是啥?
在js中的模块化开发中,模块其实就是文件。模块和文件是一一对应的。一个模块就是一个文件。反之,一个文件对应于一个模块。模块是Node.js应用程序的基本组成部分。
(2).为什么需要模块
以前,我们的js都是在浏览器端来运行的。但是,现在不是在浏览中来运行js,而是在node环境中来运行js。我们的代码都是js代码,根本就没有html。如果编写如下代码,只会出错。实际上,以前,在浏览器端,js文件也不能相互引用。之所以不影响最终的开发,只是因为它借助了html文件来引入。在服务端情况就完全不一样。如果我们不能在js文件中引入js文件,开发将无法开展。
为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统。
(3).js模块化发展简史
在node.js中,一般都使用commonjs的模块化
在浏览器端,一般都使用es6的模块化方案
基于此,我们必须要掌握两种模块化方案:
- CommonJS
- Es6的模块化
模块化在服务端就是必须的,在js文件中引入js文件的唯一方式。
在浏览器端,模块化主要解决如下两大问题:
- 避免全局变量污染
- 更好的实现文件依赖
(4).具体表现为哪些文件?
在node中,如下三种文件都可以作为模块来引入
- js文件,以.js作为后缀的
- Json文件,以.json为后缀的
- 基于C/C++的json扩展文件,以.node为后缀的。
在浏览器端,哪些文件可以作为模块引入?
- js文件
- css文件
- 图片文件
- vue文件
…
载入模块
核心模块
这是最简单的,因为核心模块是node自带。只需要传入模块的名称即可。
const http = require('http');
const fs = require('fs');
注意,常量的名称可以是随意的,但是为了语义,尽量和模块名称保持一致。不能再加任何和路径相关的写法,否则就出错了.
第三方模块
属于用户模块,是非核心。所以,必须要分两步完成:
- 先下载 npm install
- 然后使用require引入
下载
引入
第三方模块和核心模块的引入写法是一模一样的,但是其原理是有区别的。
核心模块是已经被编译好了,本身就存在于内存中。
第三方模块,其实是放在当前的node_modules文件夹中的。
自定义模块
需要分成两步:
- 第一步,需要定义一个模块
- 第二步,引入自定义模块
第一步,定义一个模块,使用一个空文件作为模块
第二步,使用require引入
对于自定义模块,必须要使用相对路径来引入,必须是使用./或者…/开头。否则报错
最好加上后置
如果require的是文件夹名称,默认会引入该文件夹下的index.js文件
针对核心模块和第三方模块,千万不要画蛇添足加上.js后缀
自定义模块的实现
使用module.exports导出模块
module.exports 是一个全局变量。可以直接在js文件中对其赋值。
在使用require方法引入一个模块的时候,返回的就是module.exports。
module.exports默认是空对象。所以,针对一个空js文件,引入之后的结果是{}。
var title= "wangcai";
function NBAPlayer(name,age,sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
exports.title= title; //这种使用的时候需要打点使用
module.exports = NBAPlayer;//相当于把NBAPlayer直接导出去,这种可以直接使用
exports对象
在CommonJS中,导出模块是通过module.exports来实现的。
在CommonJS中,使用requrie方法,得到的结果就是module.exports。
在CommonJS中,给module.exports起了一个别名exports。
这种写法是错误的。所谓的起别名,就是 相当于,定义了exports对象,然后将module.exports的值赋给它。
这么写为什么可以?
因为,此时只是给exports对象添加了新的属性,和module.exports还是指向同一个对象,相当于给module.exports添加了属性。
自己在导出模块的时候,尽量使用module.exports