这就是为什么require并没有定义在app.js 文件中,然则这个办法却存在的原因。大年夜Node.js的API文档中可以看到还有 __filename、 __dirname、 module、 exports几个没有定义然则却存在的变量。个中 __filename和 __dirname在查找文件路径的过程平分析获得后传入的。 module变量是这个模块对象自身, exports是在module的构造函数中初始化的一个空对象({},而不是null)。
load办法在载入、编译、缓存了module后,返回module的exports对象。这就是circle.js文件中只有定义在exports对象上的办法才能被外部调用的原因。
以上所描述的模块载入机制均定义在lib/module.js中。
require 惹人的对象主如果函数。当 Node 调用 require() 函数,并且传递一个文件路径给它的时刻,Node 会经历如下几个步调:
- Resolving:找到文件的绝对路径;
- Loading:断定文件内容类型;
- Wrapping:打包,给这个文件付与一个私有感化范围。这是使 require 和 module 模块在本地引用的一种办法;
- Evaluating:VM 对加载的代码进行处理的处所;
- Caching:当再次须要用这个文件的时刻,不须要反复一遍膳绫擎步调。
require.extensions 来查看对三种文件的支撑情况:
sea.js 核心特点:
- 遵守CMD规范,与NodeJS般的书写模块代码。
- 依附主动加载,设备清楚简洁。

文件查找策略
大年夜文件模块缓存中加载
尽管原生模块与文件模块的优先级不合,然则优先级最高的是大年夜文件模块的缓存中加载已经存在的模块。
作为一个办事器端的解决筹划,CommonJS 须要一个兼容的脚本加载器作为前提前提。该脚本加载器必须支撑名为 require 和 module.exports 的函数,它们将模块互相导入导出。
大年夜原生模块加载
在这个主文件中,可以经由过程require办法去惹人其余的模块。而其拭魅这个require办法实际调用的就是module._load办法。
原生模块的优先级仅次于文件模块缓存的优先级。require办法在解析文件名之后,优先检查模块是否在原生模块列表中。以http模块为例,尽管在目次下存在一个 http、 http.js、 http.node、 http.json文件, require(“http”)都不会大年夜这些文件中加载,而是大年夜原生模块中加载。
原生模块也有一个缓存区,同样也是优先大年夜缓存区加载。如不雅缓存区没有被加载过,则调用原生模块的加载方法进行加载和履行。
大年夜文件加载
当文件模块缓存中不存在,并且不是原生模块的时刻,Node.js会解析require办法传入的参数,并大年夜文件体系中加载实际的文件,加载过程中的包装和编译细节在前面说过是调用load办法。
当 Node 碰到 require(X) 时,按下面的次序处理。
- // file lib/sayModule.js
- define(function (){
- return {
- sayHello: function () {
- console.log('hello');
- }
- };
- });
- //file main.js
- define(['./lib/sayModule'], function (say){
- say.sayHello(); //hello
- })
2、如不雅 X 以 "./" 或者 "/" 或者 "../" 开首
- a. 根据 X 地点的父模块,肯定 X 的绝对路径。
- b. 将 X 当成文件,依次查找下面文件,只要个中有一个存在,就返回该文件,不再持续履行。
- X
- X.js
- X.json
- X.node
- c. 将 X 当成目次,依次查找下面文件,只要个中有一个存在,就返回该文件,不再持续履行。
- X/package.json(main字段)
推荐阅读
【限时免费】岁尾最强一次云计算大年夜会,看传统、社区、互联网企业若何碰撞? 在上述课程中,我碰到了 Alon Burg——一名经验丰富的 web 开辟人员,我们刚好趣味相投。所认为了>>>详细阅读
本文标题:很全很全的JavaScript模块讲解,看了绝不后悔!
地址:http://www.17bianji.com/lsqh/40215.html
1/2 1

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