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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 Node.js 中爬取图片,你可以使用各种库和模块来帮助你完成这个任务。以下是一种常见的做法: 1. 首先,你需要安装并引入 `axios` 库,这是一个非常流行的用于发送 HTTP 请求的库。你可以使用以下命令安装它: ``` npm install axios ``` 在代码中引入 `axios`: ```javascript const axios = require('axios'); ``` 2. 接下来,你需要确定要爬取图片的 URL 地址。可以通过发送 HTTP 请求并使用 `axios.get` 方法获取图片的二进制数据。 ```javascript const imageUrl = 'https://example.com/image.jpg'; axios .get(imageUrl, { responseType: 'arraybuffer' }) .then((response) => { const imageData = Buffer.from(response.data, 'binary'); // 在这里做一些处理,比如将图片保存到本地或者进行其他操作 }) .catch((error) => { console.error('无法获取图片:', error); }); ``` 3. 一旦你获得了图片的二进制数据,你可以根据需要将其保存到本地文件或进行其他处理。以下是将图片保存到本地文件的示例代码: ```javascript const fs = require('fs'); // 保存文件的路径和名称 const savePath = './path/to/save/image.jpg'; fs.writeFile(savePath, imageData, (err) => { if (err) { console.error('无法保存图片:', err); } else { console.log('图片保存成功!'); } }); ``` 请确保你遵守网站的使用规则和法律法规,尊重他人的版权和隐私。在爬取图片之前,请确保你有合法的授权或许可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值