node之module

在前端,在浏览器中运行的 js 是没有模块的概念的,但如果把 js 放在服务器上运行,若只是简单的代码还好说,如果在大型项目中就会显得非常复杂加难以迭代维护,所以 node 引入了模块的概念。

那模块是如何实现互不影响,各自分离的呢?

我们知道在 js 中想要实现代码之间的互不影响,可以使用函数来加以分隔,使函数内部的变量待在自己的作用域范围内.

那 node 是不是这样实现的呢?问题来了,如何验证是在函数内部?

在函数中有个特殊的变量 arguments

新建 index.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
console.log(arguments);

// {
// '0': {},
// '1': [Function: require] {
// resolve: [Function: resolve] { paths: [Function: paths] },
// main: Module {
// id: '.',
// path: 'c:\\Users\\Administrator\\Desktop\\node',
// exports: {},
// parent: null,
// filename: 'c:\\Users\\Administrator\\Desktop\\node\\index.js',
// loaded: false,
// children: [],
// paths: [Array]
// },
// extensions: [Object: null prototype] {
// '.js': [Function],
// '.json': [Function],
// '.node': [Function]
// },
// cache: [Object: null prototype] {
// 'c:\\Users\\Administrator\\Desktop\\node\\index.js': [Module]
// }
// },
// '2': Module {
// id: '.',
// path: 'c:\\Users\\Administrator\\Desktop\\node',
// exports: {},
// parent: null,
// filename: 'c:\\Users\\Administrator\\Desktop\\node\\index.js',
// loaded: false,
// children: [],
// paths: [
// 'c:\\Users\\Administrator\\Desktop\\node\\node_modules',
// 'c:\\Users\\Administrator\\Desktop\\node_modules',
// 'c:\\Users\\Administrator\\node_modules',
// 'c:\\Users\\node_modules',
// 'c:\\node_modules'
// ]
// },
// '3': 'c:\\Users\\Administrator\\Desktop\\node\\index.js',
// '4': 'c:\\Users\\Administrator\\Desktop\\node'
// }

现在可以知道确实是在函数内部,但这个函数是什么样子呢?

使用 arguments 对象的 callee 属性

1
2
3
4
5
console.log(arguments.callee);

// function (exports, require, module, __filename, __dirname) {
// console.log(arguments.callee.toString())
// }

可以看到常用的 exports, require, module, **filename, **dirname 是以参数形式传进来的

那么 exports 和 module.exports 有什么区别呢?

1
2
console.log(exports === module.exports);
// true

即它们指向同一个对象

所有我们在操作 exports 时 只能通过属性来赋值。而 module.exports 却可以赋值一个对象

个人理解,如有失误,请指正

-------------本文结束感谢您的阅读-------------
坚持原创技术分享,您的支持将鼓励我继续创作!
0%