typescript - Typescript 将 html 文件作为字符串导入 (Express)
问题描述
我正在尝试将 html 文件import template as "./template.html"
作为字符串导入,以便通过 Express 的res.end(template);
功能将其提供给用户。
我index.d.ts
在项目的根目录中创建了一个文件,其中包含以下内容:
declare module '*.html' {
const value: string;
export default value;
}
template.html
它让我可以毫无问题地导入,但是当我运行程序时它说
/home/koen/Workspace/xyz/src/template.html:1
<!DOCTYPE html>
^
SyntaxError: Unexpected token <
at Module._compile (internal/modules/cjs/loader.js:723:23)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)
at Module.load (internal/modules/cjs/loader.js:653:32)
at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
at Function.Module._load (internal/modules/cjs/loader.js:585:3)
at Module.require (internal/modules/cjs/loader.js:692:17)
at require (internal/modules/cjs/helpers.js:25:18)
at Object.<anonymous> (/home/koen/Workspace/xyz/out/index.js:11:41)
at Module._compile (internal/modules/cjs/loader.js:778:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)
几乎就像它试图将 html 作为 Javascript 或其他东西运行一样。任何想法为什么会发生这种情况?我被困住了...
解决方案
通过安装 Babel 修复它。感谢index.d.ts
typescript 知道内容将是什么类型(字符串)。但它不知道如何解析它。
如果其他人有同样的问题:
1.安装babel core和cli
运行以下命令:npm install --save-dev @babel/cli @babel/core
2.安装Typescript预设
Babel 将接管 Typescript 到 Javascript 的转换。为此,我们必须安装preset-typescript
预设。
运行以下命令:npm install --save-dev @babel/preset-typescript
现在babel.config.json
在项目的根目录中打开(如果不存在,请创建它)并添加以下内容:
{
"presets": [
"@babel/preset-typescript"
]
}
3.防止tsc转译
我们并没有完全摆脱tsc
这里。我们仍将使用它来检查类型。但如前所述,Babel 正在接管编译过程,我们不希望发生冲突。内部tsconfig.json
,设置compilerOptions.noEmit
为true
。
4.可选:安装@babel/preset-env
预设
如果您计划使用 ES2015+ 语法,则必须安装此语法。该过程与步骤 2 中的相同。
5.安装 babel-plugin-transform-html-import-to-string
哦,男孩……是的。我知道这是一个很长的名字。这是一个 Babel 插件,可以让我们导入 html 文件。
运行命令:npm install --save-dev babel-plugin-transform-html-import-to-string
在项目的根目录中打开.babelrc
文件(再一次,如果它不存在,请创建它)并添加以下内容:
{
"plugins": [
"transform-html-import-to-string"
]
}
6.在 package.json 中添加脚本来构建和运行应用程序
"scripts": {
"start": "tsc && babel src --out-dir lib --extensions '.ts,.tsx' && node lib/index.js"
}
tsc 会确保所有的输入都是正确的,babel 会接管转译部分。
推荐阅读
- pointers - Golang指针值比较
- java - 二维数组 - java.lang.NullPointerException
- excel - Range.Replace 在 Office 365 版本上无法正常工作
- css - 如何将 ngx 数据表中的 css 添加到仅某些列?
- node.js - 环境变量在嵌套的 JS 文件中不起作用(React)
- python - 如何在 django 框架中使用 pg_trgm 操作符(例如 %>)?
- javascript - 如何通过 NAT 流式传输 WebRTC 音频?
- c - 有没有随机遍历数组的方法?
- java - 无法在 Spring Boot mvc 中解析视图名称
- c - 如何获得C中数组中两个索引的总和?