Node.js 模块化
1.前言
node.js的模块系统,就是参照CommonJS规范实现的,模块化的使用过程中包含两个操作:定义和引入
2.模块定义
- 通俗的说,一个js文件就是一个模块,每个模块默认暴露的是一个空对象
//引入一个空白的js文件
const empty = require('./empty.js')
console.log(empty) //打印 {}
- 默认暴露的空对象就是exports本身,给他添加属性其实就是给暴漏出去的对象添加属性
//person.js 使用exports添加2个属性
exports.name = 'zs'
exports.age = 23
//引入person.js
const person = require('./person.js')
console.log(person) //打印 {name:'zs',age:23}
- 如果当前模块其实是一个function,或者说是一个已有的对象,这时可以使用module.exports,来重新指定当前模块暴漏出去的数据,此时exports将失效
function sayHello(){
console.log('hello')
}
//module.exports用法
module.exports = sayHello
3.模块的引入
- 模块使用require()方法进行引入,参数可以是模块名称,也可以是本地js文件的路径,被引入文件内的代码会被执行一遍
- require()方法如果传入的参数是路径,例如:'./some.js',则直接读取对应路径的文件
- require()方法如果传入的参数是不是路径,则视为引入的是模块,先判断该模块是否是node.js 核心包(http,fs,path等),如果是,则直接引入。如果不是核心模块,则视为通过npm下载的模块
- 对于 npm 包,require 的规则是这样的:
(1)查找该npm 包目录下 package.json 下是否定义了 main 字段,是则读取 main 字段下定义的入口。
(2)如果没有 package.json 文件,则读取文件夹下的 index.js 或者 index.node。
(3)如果都 package.json、index.js、index.node 都找不到,抛出错误 Error: Cannot find module 'some-library'。
//引入内置模块 http模块
const http = require('http')
//引入npm包模块
const http = require('vue')
//引入本地自定义模块 根据路径读取
const http = require('./some.js')
注意:如果模块定义成一个对象,则可以使用ES6的解构赋值,筛选其中的某几个字段进行保存。但是要明白的是,在模块的过程中,实质是整体加载person.js模块,只是抽取了name,age进行缓存,这种加载称为“运行时加载”
const {name,age} = require('./person.js')
console.log(name,age) // zs 23
4.全局变量
- 在运行某个js文件时,Node.js将js文件的代码放入某个自执行函数中(沙箱),这个自执行函数有一些参数,所以这些参数在js文件中是可以作为全局变量直接访问
- 查阅文档,这5个参数分别是:require/module/exports/当前js文件路径/当前目录路径
变量名称 | 说明 |
---|---|
require | 用来引入其他模块 |
module | 用来暴漏当前模块 |
exports | 用来暴漏当前模块 |
__filename | 当前js文件路径 |
__dirname | 当前目录路径 |
console.log('typeof require = ',typeof require)
console.log('typeof module = ',typeof module)
console.log('typeof exports = ',typeof exports)
//输出
typeof require = function
typeof module = object
typeof exports = object