概述
本内容分为
一、模块规范
二、模块的引入
三、核心模块编写
四、C++扩展模块的编写
一、模块规范
js较常用的模块规范有cmd、amd、commonjs、UMD、es6模块,node中一般采用commonjs、es6模块规范(UMD也用,但较少)。
二、在node中引用模块的方法有:
- require: commonj
- import: es6
- process.binding: 引入C++模块
- internalBinding: 原生模块中js引入C++模块(不对用户开发)
三、模块引入的步骤-require、import
- 路径分析
- 文件定位
- 编译执行
在具体讲模块怎么引入的过程之前,我们需要将两个概念
核心模块:node提供的模块即原生模块如:fs、os、path。图一展示node提供的所有核心模块
文件模块:用户自己编写的模块(包括node_modules中)
核心模块在node的源代码的编译过程中,编译进了二进制执行文件。在node进程启动时,部分核心模块就被直接加载进内存中,所以引入核心模块时,文件定位和编译执行都省略了,并且在路径分析中优先判断,所以他的加载速度是最快的
3.1.1路径分析-模块标识符,引入模块的参数
node通过传入模块引入方法中的参数进行路径分析。 require('fs')
- 核心模块 如fs,path,http等
- 以. 或 .. 开头的相对路径的文件模块
- 以/开头的绝对路径的文件模块
- 自定义模块 (node_modules)如Vue
3.1.2路径分析-通过标识符request获取真实路径
以下是根据标识符获取真实路径的伪代码,在这个过程从我们需要了解一个概念
模块路径:模块路径是node定位文件模块的具体文件时制定的查找策略,表现为一个数据数据,生成规则:[当前文件目录下的node_modules,父目录下的node_modules,父目录的父目录下的node_modules,当沿路径向上逐级递归,直到根目录下的node_modules目录]
注:在获取真实路径时,如果文件没有表示
const relativeResolveCache = {} // 路径缓存路径
const vue = require('vue');
const request = 'vue';
let filename;
const relResolveCacheIdentifier = `${module.path}x00${request}`; // 路径缓存标识符
if (relativeResolveCache[relResolveCacheIdentifier]) { // 获取缓存的真实路径
filename = relativeResolveCache[relResolveCacheIdentifier]; // 返回缓存路径
}
if (!filename) {
if (isNativeModule) { // 没有缓存路径,核心模块将在路径分析中优先判断
filename = request;
}
}
if (!filename) {
const paths = _resolveLookupPaths() // 如果不是相对或绝对路径根据模块路径获取文件的查找路径,否则根据当前文件路径返回查找路径
const filename = getTheRealPath(paths, request); // 在paths中查找是否有该文件--文件定位
}
3.2文件地位-const filename = getTheRealPath(paths, request); // 在paths中查找是否有该文件--文件定位
对于没有没有扩展名的标识符,getTheRealPath会根据paths, request,node会依次尝试是否有js、json、node的文件;如果沒有node会尝试path+request是否有对应的npm包;如果没有会尝试path+request+index+js、json、node;
获取文件真实路径后将对文件进行加载
if (filename) { // 根据3.1.2获取到的文件路径进行文件地位
if (Module._cache[filename]) return Module._cache[filename];
if (NativeModule.map.get(filename)) {
const mod = NativeModule.map.get(filename);
if (mod.exports) {
return mod.exports;
}
compile(mod);
return mod.exports;
}
const mod = new Module(filename, module);
mod.load(); // 模块编译
Module._cache[filename] = mod;
relativeResolveCache[relResolveCacheIdentifier] = filename;
} else {
new Error(`Cannot find module '${request}'`);
}
3.3模块的编译
在模块执行mod.load()时会对模块进行编译执行,node会根据文件的后对分别调用对应的方法进行进行编译执行
- js:进行头尾包装返回 compiledWrapper.call(thisValue, exports, require, module,
- filename, dirname);
- json: module.exports = JSONParse(stripBOM(content));
- node:process.dlopen(module, path.toNamespacedPath(filename));
- 其他文件默认js
最后
以上就是整齐芝麻为你收集整理的node获取图片路径_node模块机制-一的全部内容,希望文章能够帮你解决node获取图片路径_node模块机制-一所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复