// 引入文件名为m1的模块
const file = require("./m1.js")
console.log(file)
通过exports一个一个的导出值
m1.js文件
// 通过exports向外界暴露a b c 三个变量
exports.a = "孙悟空"
exports.b = "猪八戒"
exports.c = "沙和尚"
01_模块化.js文件
// 引入文件名为m1的模块
const file = require("./m1.js")
// 打印输出
console.log(file)
打印结果
{a: '孙悟空', b: '猪八戒', c: '沙和尚'}
通过module.exports同时导出多个值
m1.js文件
// 通过module.exports同时导出多个值
module.exports = {
a: "哈哈",
b: [1, 1],
c: () => {
console.log(111)
}
}
01_模块化.js文件
// 引入文件名为m1的模块
const file = require("./m1.js")
// 打印输出
console.log(file)
打印结果
{a: '哈哈', b: Array(2), c: ƒ}
// 引入内置的核心模块"path"
const path = require("path")
// 引入内置的核心模块"path"
// 加 node: 是为了指明是核心模块
const path = require("node:path")
默认情况下,Node.js会将以下的内容视为CommonJS模块:
require() 是同步加载模块的方法,所以无法用来加载ES6的模块,当我们需要在CommonJS中加载ES模块时
每一个CommonJS模块在执行时,外层都会被套上一个函数
(function(exports,require,module, _filename, _dirname) {
// 模块代码会被放到这里
});
模块都是包含在函数当中的
// 所写的模块
let a = 20
let b = 10
// 在执行时是套在模块里面的
(function(exports,require,module, _filename, _dirname) {
// 模块代码会被放到这里
let a = 20
let b = 10
});
证明模块确实运行到了函数里面,使用函数专有的arguments, 所有的实参都会封装到 arguments 中
// 所写的模块
let a = 20
let b = 10
// 打印arguments 观测模块是否运行到了函数里面
console.log(arguments)
控制台打印
Arguments(5) [{…}, ƒ, Module, 'D:\前端\NodeJs\02_模块化\m1.js', 'D:\前端\NodeJs\02_模块化', callee: ƒ, Symbol(Symbol.iterator): ƒ]
所以我们之所以能在CommonJS中模块中使用exports、require并不是因为他们是全局变量,他们实际上以为参数的形式传递模块
exports: 用来设置模块向外暴露的内容
require: 用来引入模块的方法
module: 当前模块的引用
__filename: 模块的路径
__dirname: 模块所在目录的路径