我是靠谱客的博主 整齐芝麻,最近开发中收集的这篇文章主要介绍node获取图片路径_node模块机制-一,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

本内容分为

一、模块规范

二、模块的引入

三、核心模块编写

四、C++扩展模块的编写

一、模块规范

js较常用的模块规范有cmd、amd、commonjs、UMD、es6模块,node中一般采用commonjs、es6模块规范(UMD也用,但较少)。

二、在node中引用模块的方法有:

  1. require: commonj
  2. import: es6
  3. process.binding: 引入C++模块
  4. internalBinding: 原生模块中js引入C++模块(不对用户开发)

三、模块引入的步骤-require、import

  1. 路径分析
  2. 文件定位
  3. 编译执行

在具体讲模块怎么引入的过程之前,我们需要将两个概念

核心模块:node提供的模块即原生模块如:fs、os、path。图一展示node提供的所有核心模块

文件模块:用户自己编写的模块(包括node_modules中)

核心模块在node的源代码的编译过程中,编译进了二进制执行文件。在node进程启动时,部分核心模块就被直接加载进内存中,所以引入核心模块时,文件定位和编译执行都省略了,并且在路径分析中优先判断,所以他的加载速度是最快的

f9c4c42e809128ce65eb0dba3ef43d02.png
图一: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中查找是否有该文件--文件定位
}

b846c2b5bdfe25136a3fcb9774756241.png
图二:获取路径的流程

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模块机制-一所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(43)

评论列表共有 0 条评论

立即
投稿
返回
顶部