使用require()方法加載模塊
// 加載內(nèi)置模塊
const fs = require('fs')
// 加載用戶自定義模塊
// const m1 = require('./06.m1.js')
// 使用require()方法加載自定義模塊的時(shí)候瓶盛,后綴名可以省略
const m1 = require('./06.m1')
console.log(m1);
// 加載第三方模塊
const moment = require('moment')
模塊作用域
在自定義模塊中的方法惯疙,變量等,只能在當(dāng)前模塊內(nèi)被訪問荚斯,這種模塊級(jí)別的訪問限制埠居,叫作模塊作用域;
模塊作用域的好處:防止全局變量污染的問題事期;
// 當(dāng)前這個(gè)文件 就是用戶自定義模塊
console.log('加載了06這個(gè)用戶自定義模塊');
const niuniuname = '牛牛'
function sayHello(){
console.log('大家好我是' + niuniuname);
}
sayHello()
//在另外一個(gè)test.js文件中調(diào)用
const m1 = require('./06.m1')
console.log(m1); //{} 返回空對(duì)象
sayHello()//也無(wú)法調(diào)用m1.js里面的函數(shù) sayHello is not defined
module對(duì)象
每個(gè).js自定義模塊都會(huì)有module對(duì)象滥壕,里面存儲(chǔ)了和當(dāng)前相關(guān)的信息;
console.log(module);//返回module對(duì)象
Module {
id: '.',
path: 'F:\\前端\\Node.js基礎(chǔ)\\files\\模塊加載',
exports: {},
filename: 'F:\\前端\\Node.js基礎(chǔ)\\files\\模塊加載\\07.test.js',
loaded: false,
children: [
Module {
id: 'F:\\前端\\Node.js基礎(chǔ)\\files\\模塊加載\\06.m1.js',
path: 'F:\\前端\\Node.js基礎(chǔ)\\files\\模塊加載',
exports: {},
filename: 'F:\\前端\\Node.js基礎(chǔ)\\files\\模塊加載\\06.m1.js',
loaded: true,
children: [],
paths: [Array]
}
],
paths: [
'F:\\前端\\Node.js基礎(chǔ)\\files\\模塊加載\\node_modules',
'F:\\前端\\Node.js基礎(chǔ)\\files\\node_modules',
'F:\\前端\\Node.js基礎(chǔ)\\node_modules',
'F:\\前端\\node_modules',
'F:\\node_modules'
]
}
module對(duì)象中的exports屬性
在自定義模塊中兽泣,可以通過(guò)module.exports對(duì)象绎橘,將模塊內(nèi)的成員共享出去,供外界使用唠倦。外界使用require()方法導(dǎo)入模塊時(shí)称鳞,得到的就是module.exports所指向的對(duì)象;
// 向module.exports 對(duì)象上掛載了nounouname屬性
module.exports.niuniuname = '牛牛'
// 向module.exports 對(duì)象上掛載了sayHello方法
module.exports.sayHello = function(){
console.log('Hello!' );
}
const m1 = require('./06.m1')
console.log(m1);
//返回{ nounouname: '牛牛', sayHello: [Function (anonymous)] }
共享成員時(shí)稠鼻,以module.exports指向的對(duì)象為準(zhǔn);
// 向module.exports 對(duì)象上掛載了nounouname屬性
module.exports.niuniuname = '牛牛'
// 向module.exports 對(duì)象上掛載了sayHello方法
module.exports.sayHello = function(){
console.log('Hello!' + niuniuname);
}
// 讓module.exports指向一個(gè)全新的對(duì)象
module.exports = {
nickname: '小黑',
sayHi() {
console.log('Hi!');
}
}
const m1 = require('./06.m1')
console.log(m1);
//指向了最新的對(duì)象{ nickname: '小黑', sayHi: [Function: sayHi] }
因?yàn)閙odule.exports寫法復(fù)雜冈止,node提供了exports對(duì)象,默認(rèn)情況下module.exports和exports指同一對(duì)象枷餐;
但是最終都以module.exports指向的對(duì)象為準(zhǔn);
const nickname = '小白'
exports.nickname = nickname
exports.age = '1'
exports.sayHello = function(){
console.log('大家好');
}
const m1 = require('./06.m1')
console.log(m1);//{ nickname: '小白', age: '1', sayHello: [Function (anonymous)] }
使用誤區(qū)一:謹(jǐn)記靶瘸,require()模塊時(shí),得到的永遠(yuǎn)是module.exports 指向的對(duì)象毛肋;
const nickname = '小白'
exports.nickname = nickname
module.exports = {
gender: '男',
age: 2
}
const m1 = require('./06.m1')
console.log(mi);//{ gender: '男', age: 2 }
const nickname = '小白'
module.exports.nickname = nickname
exports = {
gender: '男',
age: 2
}
const m1 = require('./06.m1')
console.log(m1);//{ nickname: '小白' }
// 兩個(gè)都是屬性,最后會(huì)輸出{ nickname: '小黑狗', gender: '公' }的對(duì)象
exports.nickname = '小黑狗'
module.exports.gender = '公'
const m1 = require('./06.m1')
console.log(m1);//{ nickname: '小黑狗', gender: '公' }
exports = {
nickname: '肥肥',
gender: '公'
}
// 兩個(gè)都是屬性屋剑,最后會(huì)輸出{ nickname: '小黑狗', gender: '公' }的對(duì)象
module.exports = exports
module.exports.age = '22'
const m1 = require('./06.m1')
console.log(m1);//{ nickname: '肥肥', gender: '公', age: '22' }