Lau*_*rbe 3 javascript node.js sharp
我有一个关于 Nodejs 路径处理的问题。我知道他们在文档中有一个关于此内容的页面,但它不包含我需要的内容。
基本上,我有一个文件,其中包含引用文件的相对路径(在本例中为 png)。
现在,根据我调用文件的位置,图片要么找到,要么找不到(因为文件系统中被调用的点发生变化)。
我使用的是 'sharp' 框架,'sharp('./picture.png')' 与 require 类似。
Example:
File 'render.js' :
const pic = sharp('./picture.png')
Calling:
cmd\examplePath> node render.js //picture is found
cmd> node ./examplePath/render.js //picture is not found
Run Code Online (Sandbox Code Playgroud)
The location of the picture relative to the file stays the same at all times!
Run Code Online (Sandbox Code Playgroud)
我现在的问题是我所描述的内容是否符合 Nodejs 的预期,或者是否有问题。我需要做什么才能从任何地方调用该文件并使其仍然有效?
任何提示表示赞赏。谢谢 :)
通常,nodejs 中的文件处理只是fs.open()解析相对于 nodejs 中当前工作目录的相对路径。当前工作目录将是启动 Nodejs 应用程序时操作系统工作目录。
当前工作目录不一定与脚本所在目录相同,因为当前工作目录可能与 Nodejs 程序启动时脚本所在目录不同。
因此,在您的两个命令行示例中,每个示例都从不同的当前工作目录开始,因此一个可以工作,一个则不能。
一般来说,在 Nodejs 中,不建议依赖当前工作目录,因为这会降低在可能从不同目录加载代码的其他项目中重用代码的能力。因此,如果您尝试引用的文件位于相对于脚本文件系统位置的已知位置,那么您通常会使用__dirname(在 CommonJS 模块中)或import.meta.url或import.meta.resolve()(在 ESM 模块中)构建完整路径。
例如,如果图像与脚本位于同一目录中,那么您可以在 CommonJS 模块中执行此操作:
const path = require('path');
const fullPath = path.join(__dirname, "picture.png");
const pic = sharp(fullPath);
Run Code Online (Sandbox Code Playgroud)
在 ESM 模块中,您可以执行以下操作:
import path from 'path';
const __dirname = new URL('.', import.meta.url).pathname;
const fullPath = path.join(__dirname, "picture.png");
const pic = sharp(fullPath);
Run Code Online (Sandbox Code Playgroud)
我现在的问题是我所描述的内容是否符合 Nodejs 的预期,或者是否有问题。
是的,这是可以预料的。您正在使用不同的当前工作目录启动程序,并且具有依赖于当前工作目录为某个值的代码(因为您使用了相对路径)。
我需要做什么才能从任何地方调用该文件并使其仍然有效?
使用脚本的目录作为锚位置构建绝对路径,如上所示。
请注意,require()或import使用完全不同的文件搜索逻辑,并具有一些与运行它们的模块位置相关的内置行为。但是,它们是例外,而不是规则。fs如果您提供相对路径,则模块(或使用该模块的其他模块)中的操作fs将使用当前工作目录作为基本路径。
| 归档时间: |
|
| 查看次数: |
2506 次 |
| 最近记录: |