javascript - 在服务器端渲染动态修改 <base> 标签

标签 javascript html node.js express

我一直在寻找如何获取 HTML 页面的基本 URL,以便来自浏览器的相对 URL 请求使用该基本 URL。

答案在这里 Defining root of HTML in a folder within the site root folder

从服务器呈现 HTML 时 - 是否有可靠的方法来添加 <base>元素到 HTML?

HTML 文件是自动生成的,我不想手动添加 <base>标记到文件,如果我能避免的话。当页面呈现时,以某种方式动态添加它会很好。

下面是 HTML 的原样:

<head>
    <title>Code coverage report for All files</title>
    <meta charset="utf-8" />
    <link rel="stylesheet" href="prettify.css" />
    <link rel="stylesheet" href="base.css" />
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <style type='text/css'>
        .coverage-summary .sorter {
            background-image: url(sort-arrow-sprite.png);
        }
    </style>
</head>

我想在使用服务器渲染时添加一个基本标签,所以它看起来像:

<head>
    <title>Code coverage report for All files</title>
    <meta charset="utf-8" />
    <base href="http://localhost:3050/coverage/lcov-report/cdt-now/index.html">  // <<<<
    <link rel="stylesheet" href="prettify.css" />
    <link rel="stylesheet" href="base.css" />
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <style type='text/css'>
        .coverage-summary .sorter {
            background-image: url(sort-arrow-sprite.png);
        }
    </style>
</head>

我想问题是 index.html 文件不在我的项目的根目录中:

enter image description here

但是 index.html 文件发出相对路径请求,正如您在 <link> 中看到的那样<head> 中的标签以上。

我目前正在呈现这样的页面:

router.get('/', ac.allow('Admin'), function (req, res, next) {

  let html = path.resolve(__dirname + '/../coverage/lcov-report/cdt-now/index.html');

  res.setHeader('content-type', 'text/html');
  fs.createReadStream(html).pipe(res);

});

最佳答案

因此,使用我当前将响应流式传输到浏览器的代码的方法是:

    const replacestream = require('replacestream');

    router.get('/', ac.allow('Admin'), function (req, res, next) {

      let html, val = 'coverage/lcov-report/cdt-now/index.html';

      try {
        html = path.resolve(__dirname + `/../${val}`);
        fs.existsSync(html)
      }
      catch (err) {
        return next(err);
      }

      res.setHeader('content-type', 'text/html');
      let replacement = `</title><base href="http://localhost:3050/${val}">`;

      fs.createReadStream(html).pipe(replacestream('</title>', replacement)).pipe(res);

    });

这是基本思想。

关于javascript - 在服务器端渲染动态修改 <base> 标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44575568/

相关文章:

javascript - GetStream.io - 删除 feed Nodejs

javascript - 如何取消选择 Monaco Editor 中的所有内容

javascript - 使用 Javascript 通过 ID 查找元素的最佳性能。数组还是对象?

java - 百里香 + Spring : Neither BindingResult nor plain target object for bean name 'User' available as request attribute

node.js - 使用 express 发送修改后的文件

javascript - Nodejs,需要函数内或脚本顶部的模块。哪个更适合自定义模块?

javascript - 使用 z-index 切换 div

php - 如何为 mysql 创建一个函数

html - 通过 CSS 增加垂直导航栏宽度的问题

javascript - 开 Jest 模拟 aws-sdk ReferenceError : Cannot access before initialization