Можно ли импортировать HTML файл в виде строки с помощью TypeScript?
Интересно, можно ли сделать так, как сказано в названии.
Например, скажем, мы работаем над проектом Angular2, и мы хотим избежать установки шаблона в качестве внешнего URL-адреса, чтобы иметь меньше HTTP-запросов. Тем не менее мы не хотим писать весь HTML-код в компоненте, потому что, возможно, он достаточно большой или мы хотим, чтобы дизайнеры работали в разных файлах, чем devs.
Итак, вот первое решение:
Файл template.html.ts
Преобразуйте файл в .ts в следующее:
export const htmlTemplate = `
<h1>My Html</h1>
`;
Затем в моем компоненте я могу импортировать его следующим образом:
import { Component } from 'angular2/core';
import {RouteParams, RouterLink} from 'angular2/router';
import {htmlTemplate} from './template.html';
@Component({
selector: 'home',
directives: [RouterLink],
template: htmlTemplate,
})
На самом деле это работает отлично, но вы теряете интеллект IDE HTML, так что это плохо для дизайнера/разработчика, который создает HTML-шаблоны.
Я пытаюсь найти способ импортировать файлы .html, а не .ts.
. Можно ли импортировать файл .html в виде строки в TypeScript?
Ответы
Ответ 1
Вы можете сделать это сейчас:
import "template.html";
@Component({
selector: 'home',
directives: [RouterLink],
template: require("template.html"),
})
это будет включать "template.html" в список зависимостей вашего компонента, а затем вы можете связать его с вашим создателем (на самом деле это имеет смысл с помощью amd
)
Однако, как вам было предложено, лучше использовать webpack
.
Взгляните на этот стартовый пакет
UPDATE теперь вы можете объявить модуль html
следующим образом:
declare module "*.html" {
const content: string;
export default content;
}
и используйте его так:
import * as template from "template.html";
@Component({
selector: 'home',
directives: [RouterLink],
template: template
})
Ответ 2
@Ответ на Veikedo выше почти работает; однако часть * as
означает, что весь модуль назначен указателю template
, тогда как мы хотим только контент. Ошибка компилятора выглядит так:
ERROR in /raid/projects/pulse/angular-components/src/lib/card/card.ts (143,12): Argument of type '{ moduleId: string; selector: string; template: typeof '*.html'; encapsulation: ViewEncapsulation...' is not assignable to parameter of type 'Component'.
Корректированный оператор импорта (на момент написания, используя TypeScript 2.3.3) выглядит следующим образом:
import template from "template.html";
@Component({
selector: 'home',
directives: [RouterLink],
template: template
})