将绝对路径转换为相对路径

27

在Node中工作时,我需要将请求路径转换为相对路径,以便将其放入一些具有不同文件夹结构的模板中。

例如,如果我从路径“/foo/bar”开始,并希望将相对路径设置为“/foo”,则应为“..”,对于“/foo/bar/baz”,它应为“../..”

我编写了一对函数来完成此操作:

function splitPath(path) {
    return path.split('/').map(dots).slice(2).join('/');
}

function dots() {
    return '..';
}

不确定这是否是最佳方法,或者是否可能通过String.replace的正则表达式来实现?

编辑

我应该指出,这样做是为了将所有内容呈现为静态HTML,压缩整个项目,并将其发送给没有访问Web服务器的人。请参见我的第一条评论。


你能使用根相对路径吗? - David Thomas
喜欢以“/”开头吗?不是的,我正在将页面呈现为静态HTML,使用fs.write将它们全部放入一个文件夹中,然后将该文件夹交给某人,以便他们可以查看所有html/css的外观。他们将无法访问Web服务器,因此我希望他们能够双击Finder中的文件并使其正常工作。根相对路径在文件系统中不起作用。至少我不知道。例如:file:///css/foo.css无法加载。 - robdodson
3个回答

48
如果我理解你的问题正确,你可以使用 path.relative(from, to)文档 示例:
var path = require('path');
console.log(path.relative('/foo/bar/baz', '/foo'));

2
嗯,这很接近了...但还不太对。请重新阅读我发布的要求。如果路径是/foo/bar,我需要'..'。当我执行path.relative('/foo/bar', '/')时,我得到的是'../..'。一般来说,我认为这是正确的方法。我可能需要更深入地研究它。 - robdodson
将其标记为最佳答案,因为它确实是最好的,我应该仅修订我的文件夹结构。 - robdodson
1
如果你执行 path.relative('/foo/bar', '/'),你应该得到 ../..,因为它是两级向上的。如果你只想将其与 /foo 进行比较,请将 to(变量) 设置为 /foo(如示例中所示)。 - Mattias

4

0

这可能需要一些调整,但应该可以工作:

function getPathRelation(position, basePath, input) {
    var basePathR = basePath.split("/");
    var inputR = input.split("/");
    var output = "";
    for(c=0; c < inputR.length; c++) {
       if(c < position) continue;
       if(basePathR.length <= c) output = "../" + output;
       if(inputR[c] == basePathR[c]) output += inputR[c] + "/";
    }

    return output;
}

var basePath ="/foo"
var position = 2;
var input = "/foo";
console.log(getPathRelation(position,basePath,input));
var input = "/foo/bar";
console.log(getPathRelation(position,basePath,input));
var input = "/foo/bar/baz";
console.log(getPathRelation(position,basePath,input));

结果:

(an empty string)    
../    
../../

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接