You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript+Node.js+ts-node环境下如何导入.hbs文件为字符串

问题根源

你配置的.d.ts仅解决了TypeScript类型校验阶段的报错,没有修改运行时的模块加载逻辑,Node.js默认会将未知后缀的导入文件作为JavaScript模块解析执行,因此会触发模板内部import语句的语法错误。


可选解决方案

方案1:运行时注册自定义模块处理器(适合你当前的CommonJS环境,实现成本最低)

操作步骤:

  1. 保留你已经写好的.d.ts类型声明,确保类型校验正常
  2. 在项目入口文件index.ts最顶部添加.hbs后缀的加载逻辑,优先级高于所有.hbs导入语句:
import * as fs from 'fs';
declare interface NodeRequire {
  extensions: Record<string, (module: NodeModule, filename: string) => void>;
}

require.extensions['.hbs'] = function (module: NodeModule, filename: string) {
  const fileContent = fs.readFileSync(filename, 'utf-8');
  module.exports = fileContent;
};

// 后面再写你原来的导入逻辑
import test from "./templates/test.hbs";
console.log(test);

不需要额外安装依赖,完全符合导入语法要求,同时保留.hbs文件独立的语法高亮、格式化能力。


方案2:编译阶段替换为字符串常量(完全无运行时IO,符合编译阶段导入的要求)

如果你需要在编译阶段就把模板内容嵌入编译产物,不需要运行时读取文件,可以用自定义转换器实现,和前端raw-loader效果完全一致:

  1. 安装依赖:
npm install ttypescript typescript-plugin-text --save-dev
  1. 修改tsconfig.json,新增插件配置、指定ts-node的编译器为ttypescript:
{
  "compilerOptions": {
    // 原有其他配置保持不变
    "plugins": [
      {
        "transform": "typescript-plugin-text",
        "extensions": [".hbs"]
      }
    ]
  },
  "ts-node": {
    "files": true,
    "compiler": "ttypescript"
  }
}
  1. 保留原有.d.ts的类型声明,不需要修改业务代码,直接运行ts-node即可正常使用。

内容的提问来源于stack exchange,提问作者user16633067

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 11:27:00