【问题标题】:Relative links in Express/JadeExpress/Jade 中的相对链接
【发布时间】:2013-07-11 00:46:05
【问题描述】:

我正在尝试让我的 Jade 模板编写一个相对于当前 URL 的超链接 (<a>)。

例如,我的视图是从http://localhost/cats 调用的,它看起来像这样:

extends layout

block content
  a(href='fluffy') Fluffy

点击链接后,我会转到http://localhost/fluffy,而不是http://localhost/cats/fluffy

我尝试过的事情:

  • a(href='./fluffly')
  • a(href='\\fluffy')
  • a(href='/fluffy')

几乎唯一有效的方法就是写出绝对路径,例如a(href='cats/fluffy')。当然有更好的方法来做到这一点。

【问题讨论】:

  • 我无法复制它,所以你确定你没有打开/cats?默认情况下,Express 不关心尾部斜杠并将 /cats/cats/ 视为相同(因此它们都会触发相同的路由)。
  • 你在使用<base>标签吗?如果是,价值是多少?
  • @robertklep 我敢肯定。 @gustavohenke 我没有使用<base> 标签.. 也许我应该。事实上,我刚刚检查了 HTML 输出,它正确显示为 <a href="fluffy">。不幸的是,当我点击它时,它仍然会转到localhost/fluffy,即使当前页面是localhost/cats
  • @Travis 我希望这是一个错字? localhost/cats(不带斜杠)
  • @robertklep 哎呀.. 你想添加它作为答案吗?我会接受它:-)

标签: express pug


【解决方案1】:

正如您已经注意到的那样,当您打开 /cats 时,可以预期到 fluffy 的相对链接会将您引导至 /fluffy :)

背景知识:Express 的默认行为是将/cats/cats/ 视为相同,并且都会触发相同的路由。

您要么在创建链接(尤其是相对链接)时考虑到这一点,要么告诉 Express 将它们视为两条独立的路线:

app.enable('strict routing');

app.get('/cats/', function(req, res) {
  ...
});

这将匹配/cats/,但不匹配/cats。当然,当你在路由定义中去掉尾部斜杠时,这种行为会被逆转。

【讨论】:

    【解决方案2】:

    如果您使用的是gulp-jade,请将gulp-data 添加到组合中并使用以下代码:

    var jade = require('gulp-jade');
    var data = require('gulp-data');
    
    gulp.src('**/*.jade')
      .pipe(data(function (file) {
        var relativePath = file.history[0].replace(file.base, ''); //e.g. about/index.jade
        var depth = (relativePath.match(/\//g) || []).length; //e.g. 1
        var relativeRoot = new Array(depth + 1).join( '../' ); //e.g. ../
        return {
          relativeRoot: relativeRoot
        };
      }))
      .pipe(jade())
    

    这将在您的jade 模板中为您提供一个relativeRoot,它本质上是:<nothing>../ 重复的次数与其相对于基本文件夹的嵌套目录数一样多。

    然后,在您的模板中:

    link(rel='stylesheet', href= relativeRoot + 'assets/main.css')
    

    我不完全确定 file.history 的生成位置/方式,但在我的情况下,[0] 指向原始文件名(其磁盘上的绝对路径)

    【讨论】:

    • 聪明!对我来说效果很好。不过,我一定要对此发表评论,因为这不是我所期望的方法,而且从模板的角度来看,relativeRoot 变量似乎无处不在。
    • 对于那些希望所有他们的网址是相对的,即使深度 = 0:var relativeRoot = depth === 0 ? './' : new Array(depth + 1).join('../');
    猜你喜欢
    • 1970-01-01
    • 2015-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-01
    • 2014-12-27
    • 2017-01-13
    相关资源
    最近更新 更多