假设先加载模块 a,在模块 a 加载完成之后,bar 借居性地指向的是模块 b 中的 bar。无论是加载完成的 imports 照样未完成的 imports,imports 和 exports 之间都有一个借居的接洽,所以老是可以正常工作。
Node.js模块不会被反复加载,这是因为Node.js经由过程文件名缓存所有加载过的文件模块,所以今后再拜访到时就不会从新加载了。
留意:Node.js是根据实际文件名缓存的,而不是require()供给的参数缓存的,也就是说即使你分别经由过程require('express')和require('./node_modules/express')加载两次,也不会反复加载,因为尽管两次参数不合,解析到的文件倒是同一个。
Node.js 中的模块在加载之后是以单例化运行,并且遵守值传递原则:如不雅是一个对象,就相当于这个对象的引用。
模块载入过程
加载文件模块的工作,重要由原生模块module来实现和完成,该原生模块在启动时已经被加载,过程直接调用到runMain静态办法。
例如运行: node app.js
- Module.runMain = function () {
- // Load the main module--the command line argument.
- Module._load(process.argv[1], null, true);
- };
- //_load静态办法在分析文件名之后履行
- var module = new Module(id, parent);
- //并根据文件路径缓存当前模块对象,该模块实例对象则根据文件名加载。
- module.load(filename);
具体说一下上文提到了文件模块的三类模块,这三类文件模块今后缀来区分,Node.js会根据后缀名来决定加载办法,具体的加载办法鄙人文 require.extensions中会介绍。
- .js 经由过程fs模块同步攫取js文件并编译履行。
- .node 经由过程C/C++进行编写的Addon。经由过程dlopen办法进行加载。
- .json 攫取文件,调用JSON.parse解析加载。
接下来具体描述js后缀的编译过程。Node.js在编译js文件的过程中实际完成的步调有对js文件内容进行头尾包装。以app.js为例,包装之后的app.js将会变成以下情势:
- //circle.js
- var PI = Math.PI;
- exports.area = function (r) {
- return PI * r * r;
- };
- exports.circumference = function (r) {
- return 2 * PI * r;
- };
- //app.js
- var circle = require('./circle.js');
- console.log( 'The area of a circle of radius 4 is ' + circle.area(4));
- //app包装后
- (function (exports, require, module, __filename, __dirname) {
- var circle = require('./circle.js');
- console.log('The area of a circle of radius 4 is ' + circle.area(4));
- });
推荐阅读
【限时免费】岁尾最强一次云计算大年夜会,看传统、社区、互联网企业若何碰撞? 在上述课程中,我碰到了 Alon Burg——一名经验丰富的 web 开辟人员,我们刚好趣味相投。所认为了>>>详细阅读
本文标题:很全很全的JavaScript模块讲解,看了绝不后悔!
地址:http://www.17bianji.com/lsqh/40215.html
1/2 1

网友点评
精彩导读
科技快报
品牌展示