Javascript 如何引用我的站点的根目录?为什么赢了';杰基尔不会渲染一些页面吗?

Javascript 如何引用我的站点的根目录?为什么赢了';杰基尔不会渲染一些页面吗?,javascript,github,jekyll,github-pages,Javascript,Github,Jekyll,Github Pages,我有一个相当复杂的javascript项目,直到最近我一直在本地工作。它将作为项目页面部署在我的github pages站点上 问题是,在代码中的几个位置,url从根目录开始(例如,/js/script.js)。这是有必要的,因为这些文件分散在子目录中,我不想尝试和思考“.”-沿着目录树向上移动。这种方法在局部效果非常好。但一旦它被推送到github,一切都会中断,因为url中插入了项目名称,将根目录推离了我想要获取文件的地方一步 我尝试了中概述的内容,但出于某种原因,杰基尔拒绝实际替换这些模板

我有一个相当复杂的javascript项目,直到最近我一直在本地工作。它将作为项目页面部署在我的github pages站点上

问题是,在代码中的几个位置,url从根目录开始(例如,
/js/script.js
)。这是有必要的,因为这些文件分散在子目录中,我不想尝试和思考“.”-沿着目录树向上移动。这种方法在局部效果非常好。但一旦它被推送到github,一切都会中断,因为url中插入了项目名称,将根目录推离了我想要获取文件的地方一步

我尝试了中概述的内容,但出于某种原因,杰基尔拒绝实际替换这些模板!url都被
{{site.baseurl}}
搞得乱七八糟,url中有转义字符等等。我拒绝安装ruby只是为了在本地运行它,只是为了调试github自己的混乱;如果我能帮上忙的话,除了解决这个问题之外,我不想使用杰基尔

让事情复杂化的是,我实际上有两个回购协议,这是同样的代码;由于这个项目相当复杂,我有一个repo的“测试”版本(因为只有“gh pages”分支最终可以远程访问github.io上的页面,所以解决方案是创建两个repo并从一个推送到另一个)。因此,静态定义
baseurl
无论如何都是令人讨厌的,但如果它能让事情顺利进行,我会接受它

我做错了什么??

(我花了几个小时才解决这个问题,这就是为什么我想我会提交这个预先回答的问题,以帮助其他与我问题有类似方面的人。)

让我们把答案分成几个独立使用的小块:

为什么Jekyll拒绝替换大家一直建议的模板 虽然有几个地方告诉您液体模板系统的
{{output}}
{%tags%}
的奇妙之处,但很少有地方告诉您为了让Jekyll实际处理这些模板,文件必须包含。也就是说,要处理的文件必须至少从以下内容开始:

---
---
是的,三条破折号,在两行上。不,你不能把它们压缩成一行。这对于希望Jekyll实际处理其模板语法的每个文件都是必需的,而不仅仅是按原样复制

如何在github页面上动态访问项目路径 正如我上面提到的,我有两个不同的存储库,相同的代码最终会出现在其中,因此如果我可以避免硬编码我的项目名称,那将是非常好的

幸运的是,github以
site.github
的形式提供了一个非标准的jekyll站点变量,它是关于github页面如何操作的隐藏信息

幸运的是,许多元数据属性中有一个是
site.github.project\u title
,它为您提供了项目的标题,恰好是页面运行的路径。当然我可以把它分配到
site.baseurl
,一切都会好起来的

杰基尔是多么的不灵活啊 可惜没有。_config.yml文件实际上是非常严格的:您可能不会从这里引用其他变量,它只用于静态文本和对象定义。令我沮丧的是,同样的事情也发生在每个要处理的文件的顶部

模板系统使用的格式也很不传统:没有传统的操作符。不能用“=”赋值,也不能用“+”或“.”或任何其他字符连接字符串。要将文字和变量的串联字符串分配给变量,需要使用“捕获标记”

那么,如何将github提供的非常方便的变量的内容输入到我的URL中呢?那么,我可以使用以下方法:

{% capture baseurl %}{{ site.github.project_title | prepend:'/' }}{% endcapture %}
---
---
{% capture baseurl %}{{ site.github.project_title | prepend:'/' }}{% endcapture %}
标记和输出的组合在前面提到的项目标题前加上斜杠,然后将其分配给一个名为“baseurl”的变量。(也可以简单地在输出前加一个斜杠,但我就是这么做的。)不,这个变量与“site.baseurl”不同。此变量仅在该行运行的页面上可用,并由输出
{{baseurl}}
引用。因此:

<script src="{{ baseurl }}/js/jquery-2.1.1.min.js"></script>
(然后在head标记中,因为我不想把它也放在js文件的顶部,所以我有
window.BASEURL=“{{BASEURL}}”;

幸运的是,我已经设置了一个构建过程(涉及browserify),所以我只需通过构建步骤将这些行添加到任何.html文件的开头。那些没有这样的东西将不得不记住手动添加它

这可能会让那些真正使用杰基尔的人崩溃 我不使用Jekyll,我只是想让我的程序在github页面上运行。我前面提到的构建过程在完成后采取了另一个步骤来简单地复制Jekyll,因为它去掉了所有模板语法,所以我可以在本地测试它。那些使用Jekyll进行本地测试的人可能会发现,将
site.github.project\u title
设置为命令行参数或在_config.yml中,将导致路径中有一个无关的斜杠


我希望这有助于某人节省几个小时,至少在试图弄清楚为什么jekyll不处理模板(如果不是其他部分的话)时是这样。

这可能会帮我节省几天时间。我正在保存对这篇文章的引用是的,如果我三天前读到这篇文章,我会花三分钟去做我花了三天时间做的事情。我不知道你是怎么想出来的。你真是太好了!!