如何在 javascript 文件中访问 Hugo 的模板变量?
how to access Hugo's template variables in a javascript file?
我正在尝试在 Hugo 中使用 react.js。我知道 Go 模板变量可以在 HTML 文件中访问。
我的问题是如何在 javascript 中访问它们。或者有解决方法吗?
提前致谢。
更新:
目前我的解决方法是在 HTML 中使用 meta
标签并像这样加载 Go 模板变量:
<meta name="title" content={{.Title}} />
然后在 javascript、
function getMetaTitle() {
var metas = document.getElementsByTagName('meta');
for (i=0; i<metas.length; i++) {
if (metas[i].getAttribute("name") == "title") {
return metas[i].getAttribute("content");
}
}
return "failed to access...";
}
var metaTitle = getMetaTitle();
但是当meta tag越来越多的时候这种方式会很不方便,有没有更简洁的方式呢?
当然,您可以在布局文件中内联 JS,但这可能不是您想要的。
在 Hugo 讨论站点上已经有一些关于这方面改进的讨论,但还没有具体内容。
我怀疑 Hugo 和 React 是一对好搭档,但这是题外话,我可能是错的。您在问,如何将 Hugo 变量导入网站的 JavaScript。我的回答:
Hugo 是静态网站引擎,因此它只会将模板和标记文档(包含您的内容)转换为 HTML 文件。现在,当您将文件上传到服务器时,您的 JS 看不到任何东西 Hugo — 只有您的 files.
问题就变成了,如何将 Hugo 变量传输到您网站的某些 文件 中。
如您所建议,最好使用Hugo将变量写入您的HTML(或JSON),然后通过JS读取它们。如果数量少,使用属性或标签。如果有很多并且没有区别 per-page,请使用单独的 JSON 文件。
例如,我个人有一个多语言网站,a) 需要通过 JS 动态显示不同语言的标题; b) 使用 JS 以 JSON 格式查询不同的 Lunr.js 搜索索引。
我都使用 data-<name>
属性:
<section class="section-search" data-index="{{ .Site.BaseURL }}searchIndex.json" id="section-search">
<input type="search" id="search-input" placeholder="{{ ( index $.Site.Data.translations $.Site.Params.locale ).dataloading }}" data-loaded="{{ ( index $.Site.Data.translations $.Site.Params.locale ).dataloaded }}">
<!-- search button goes here -->
</section>
例如,在英语模板(呈现为 /public/
)中,data-loaded
属性将是英语,但对于立陶宛语模板(呈现为 /public/lt/
),data-loaded
属性将使用立陶宛语。
我不担心 "growing meta tags",但如果您担心 HTML 膨胀,您可以将变量写入 JSON 文件,然后在 JS 中读取它?
我首先将自定义 JSON 构建为 HTML,然后将其 minifying/renaming 构建为 JSON,同时根据 this 为 Hugo Lunr 搜索构建索引食谱。您可以简单地列出所有变量,而不是 "baking in" 中提到的带有 range
的内容。
顺便说一句,我使用 npm scripts
作为构建运行程序(而不是 Grunt/Gulp),所以我使用 json-minify:
"index:prepare": "json-minify public/json/index.html > public/site-index.json",
您可以通过 Hugo "bake" JSON 包含任何内容(包括 Hugo 模板变量)的文件。希望对你有帮助。
您可以在 config.toml 中为 Javascript 指定自定义输出格式,这样 Hugo 就会像处理内容文件一样处理这些特定格式和文件扩展名,在其中用足够的值替换模板变量。
因此,您 config.toml 中的如下条目会将 javascript 文件视为其自定义输出格式需要考虑的媒体类型之一:
[mediaTypes]
[mediaTypes."application/javascript"]
suffix = "js"
您可以阅读更多相关信息here
我正在尝试在 Hugo 中使用 react.js。我知道 Go 模板变量可以在 HTML 文件中访问。
我的问题是如何在 javascript 中访问它们。或者有解决方法吗?
提前致谢。
更新:
目前我的解决方法是在 HTML 中使用 meta
标签并像这样加载 Go 模板变量:
<meta name="title" content={{.Title}} />
然后在 javascript、
function getMetaTitle() {
var metas = document.getElementsByTagName('meta');
for (i=0; i<metas.length; i++) {
if (metas[i].getAttribute("name") == "title") {
return metas[i].getAttribute("content");
}
}
return "failed to access...";
}
var metaTitle = getMetaTitle();
但是当meta tag越来越多的时候这种方式会很不方便,有没有更简洁的方式呢?
当然,您可以在布局文件中内联 JS,但这可能不是您想要的。
在 Hugo 讨论站点上已经有一些关于这方面改进的讨论,但还没有具体内容。
我怀疑 Hugo 和 React 是一对好搭档,但这是题外话,我可能是错的。您在问,如何将 Hugo 变量导入网站的 JavaScript。我的回答:
Hugo 是静态网站引擎,因此它只会将模板和标记文档(包含您的内容)转换为 HTML 文件。现在,当您将文件上传到服务器时,您的 JS 看不到任何东西 Hugo — 只有您的 files.
问题就变成了,如何将 Hugo 变量传输到您网站的某些 文件 中。
如您所建议,最好使用Hugo将变量写入您的HTML(或JSON),然后通过JS读取它们。如果数量少,使用属性或标签。如果有很多并且没有区别 per-page,请使用单独的 JSON 文件。
例如,我个人有一个多语言网站,a) 需要通过 JS 动态显示不同语言的标题; b) 使用 JS 以 JSON 格式查询不同的 Lunr.js 搜索索引。
我都使用 data-<name>
属性:
<section class="section-search" data-index="{{ .Site.BaseURL }}searchIndex.json" id="section-search">
<input type="search" id="search-input" placeholder="{{ ( index $.Site.Data.translations $.Site.Params.locale ).dataloading }}" data-loaded="{{ ( index $.Site.Data.translations $.Site.Params.locale ).dataloaded }}">
<!-- search button goes here -->
</section>
例如,在英语模板(呈现为 /public/
)中,data-loaded
属性将是英语,但对于立陶宛语模板(呈现为 /public/lt/
),data-loaded
属性将使用立陶宛语。
我不担心 "growing meta tags",但如果您担心 HTML 膨胀,您可以将变量写入 JSON 文件,然后在 JS 中读取它?
我首先将自定义 JSON 构建为 HTML,然后将其 minifying/renaming 构建为 JSON,同时根据 this 为 Hugo Lunr 搜索构建索引食谱。您可以简单地列出所有变量,而不是 "baking in" 中提到的带有 range
的内容。
顺便说一句,我使用 npm scripts
作为构建运行程序(而不是 Grunt/Gulp),所以我使用 json-minify:
"index:prepare": "json-minify public/json/index.html > public/site-index.json",
您可以通过 Hugo "bake" JSON 包含任何内容(包括 Hugo 模板变量)的文件。希望对你有帮助。
您可以在 config.toml 中为 Javascript 指定自定义输出格式,这样 Hugo 就会像处理内容文件一样处理这些特定格式和文件扩展名,在其中用足够的值替换模板变量。
因此,您 config.toml 中的如下条目会将 javascript 文件视为其自定义输出格式需要考虑的媒体类型之一:
[mediaTypes]
[mediaTypes."application/javascript"]
suffix = "js"
您可以阅读更多相关信息here