EJS包含相对于项目根目录的文件

Fat*_*oke 8 ejs node.js express

我使用Express和EJS来构建一个站点,我有一个目录结构,如:

+--www/
  |
  +--partials/
  | |
  | +--header.ejs
  | +--(a bunch of ejs files)
  |
  +--guide
  | |
  | +--index.html
  | +--(other files)
  |
  +--index.html
Run Code Online (Sandbox Code Playgroud)

index.html我的示例中显示的两个文件中<% include ... %>,即使引用相同的包含文件,命令也会不同.

此外,如果我说include header.ejs,然后header.ejs有另一个部分包含,整个系统崩溃,因为他们都在不同位置寻找文件.

为了简化管理,我试图找到一个字符串,以便能够引用相同的包含文件,而不管文件可能位于哪个子目录中.

理想情况下,<% include /partials/header.ejs %>完美的东西.但这不起作用.

有没有人有任何可以在这里得到预期结果的技巧或建议?

kar*_*ivi 6

看起来 EJS 不支持此功能,但是我找到了解决此问题的方法。在上面的设置中,痛点是对于所有部分文件,您需要提及相对路径,并且如果您重构代码会变得更加痛苦。因此,宁可在每个包含时提及相对路径,我都会声明一个变量rootPath一次,然后在那里给出到达家的路径。这样在每次包含时,我都可以简单地提及相对路径,就像从 root 开始的路径一样。

例如,guide/index.ejs我在 ejs 文件的顶部提到了以下内容

<% var rootPath = '../'; %>

和 ejs 文件中的代码如下所示

<%- include(rootPath + 'partials/header'); %>

你的 HTML 代码

<%- include(rootPath + 'partials/footer'); %>

因此,如果我将 index.ejs 重构到其他文件夹,我需要做的就是更改 rootPath


bab*_*kfp 6

(其他解决方案看起来有点复杂,所以我决定也发送我的解决方案)。我在 Heroku 上测试过,效果很好。

  1. 创建app-locals.js并在其中写入:
module.exports = {
  layouts:  process.cwd() + '/views/layouts/',
  partials: process.cwd() + '/views/partials/',
}
Run Code Online (Sandbox Code Playgroud)
  1. app.js
// const express = require('express')
// const appLocals = require('./app-locals.js')

// const app = express()
app.locals = appLocals
Run Code Online (Sandbox Code Playgroud)
  1. 像这样使用它:
<%- include(partials + 'header.ejs') %>
Run Code Online (Sandbox Code Playgroud)

或者你可以这样做:

// app-locals.js
module.exports = {
    // Remove the last /
  layouts:  process.cwd() + '/views/layouts',
  partials: process.cwd() + '/views/partials',
}

// app.js
// Add / after the path
<%- include(`${partials}/header.ejs`) %>
Run Code Online (Sandbox Code Playgroud)
  • 如果您在 Heroku 上使用此功能,请确保您的文件和文件夹名称均为小写,并且在包含文件时使用相同的大小写。