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
posted @ 2020-12-13 23:47  ---空白---  阅读(113)  评论(0编辑  收藏  举报